From 80184a286c55380468beea22deef95b8114ae558 Mon Sep 17 00:00:00 2001 From: Andrei Betlen Date: Mon, 1 May 2023 10:44:28 -0400 Subject: [PATCH] Update llama.cpp --- llama_cpp/llama_cpp.py | 230 ++++++++++++++++++++++++++++++++++++++--- vendor/llama.cpp | 2 +- 2 files changed, 216 insertions(+), 16 deletions(-) diff --git a/llama_cpp/llama_cpp.py b/llama_cpp/llama_cpp.py index c081935..7b79feb 100644 --- a/llama_cpp/llama_cpp.py +++ b/llama_cpp/llama_cpp.py @@ -67,6 +67,12 @@ _lib_base_name = "llama" _lib = _load_shared_library(_lib_base_name) # C types +LLAMA_FILE_VERSION = ctypes.c_int(1) +LLAMA_FILE_MAGIC = b"ggjt" +LLAMA_FILE_MAGIC_UNVERSIONED = b"ggml" +LLAMA_SESSION_MAGIC = b"ggsn" +LLAMA_SESSION_VERSION = ctypes.c_int(0) + llama_context_p = c_void_p @@ -77,13 +83,24 @@ llama_token_p = POINTER(llama_token) class llama_token_data(Structure): _fields_ = [ ("id", llama_token), # token id + ("logit", c_float), # log-odds of the token ("p", c_float), # probability of the token - ("plog", c_float), # log probability of the token ] llama_token_data_p = POINTER(llama_token_data) + +class llama_token_data_array(Structure): + _fields_ = [ + ("data", llama_token_data_p), + ("size", c_size_t), + ("sorted", c_bool), + ] + + +llama_token_data_array_p = POINTER(llama_token_data_array) + llama_progress_callback = ctypes.CFUNCTYPE(None, c_float, c_void_p) @@ -118,7 +135,7 @@ LLAMA_FTYPE_MOSTLY_Q4_1_SOME_F16 = ctypes.c_int( 4 ) # tok_embeddings.weight and output.weight are F16 LLAMA_FTYPE_MOSTLY_Q4_2 = ctypes.c_int(5) # except 1d tensors -LLAMA_FTYPE_MOSTYL_Q4_3 = ctypes.c_int(6) # except 1d tensors +# LLAMA_FTYPE_MOSTYL_Q4_3 = ctypes.c_int(6) # except 1d tensors LLAMA_FTYPE_MOSTYL_Q8_0 = ctypes.c_int(7) # except 1d tensors LLAMA_FTYPE_MOSTYL_Q5_0 = ctypes.c_int(8) # except 1d tensors LLAMA_FTYPE_MOSTYL_Q5_1 = ctypes.c_int(9) # except 1d tensors @@ -401,31 +418,214 @@ _lib.llama_token_eos.argtypes = [] _lib.llama_token_eos.restype = llama_token -# TODO: improve the last_n_tokens interface ? -def llama_sample_top_p_top_k( +def llama_token_nl() -> llama_token: + return _lib.llama_token_nl() + + +_lib.llama_token_nl.argtypes = [] +_lib.llama_token_nl.restype = llama_token + + +# Sampling functions +def llama_sample_repetition_penalty( ctx: llama_context_p, - last_n_tokens_data, # type: Array[llama_token] - last_n_tokens_size: c_int, - top_k: c_int, - top_p: c_float, - temp: c_float, - repeat_penalty: c_float, + candidates, + last_tokens_data, + last_tokens_size: c_int, + penalty: c_float, ) -> llama_token: - return _lib.llama_sample_top_p_top_k( - ctx, last_n_tokens_data, last_n_tokens_size, top_k, top_p, temp, repeat_penalty + return _lib.llama_sample_repetition_penalty( + ctx, candidates, last_tokens_data, last_tokens_size, penalty ) -_lib.llama_sample_top_p_top_k.argtypes = [ +_lib.llama_sample_repetition_penalty.argtypes = [ llama_context_p, + llama_token_data_array_p, llama_token_p, c_int, - c_int, c_float, +] +_lib.llama_sample_repetition_penalty.restype = llama_token + + +# LLAMA_API void llama_sample_frequency_and_presence_penalties(struct llama_context * ctx, llama_token_data_array * candidates, llama_token * last_tokens, size_t last_tokens_size, float alpha_frequency, float alpha_presence); +def llama_sample_frequency_and_presence_penalties( + ctx: llama_context_p, + candidates, + last_tokens_data, + last_tokens_size: c_int, + alpha_frequency: c_float, + alpha_presence: c_float, +) -> llama_token: + return _lib.llama_sample_frequency_and_presence_penalties( + ctx, + candidates, + last_tokens_data, + last_tokens_size, + alpha_frequency, + alpha_presence, + ) + + +_lib.llama_sample_frequency_and_presence_penalties.argtypes = [ + llama_context_p, + llama_token_data_array_p, + llama_token_p, + c_int, c_float, c_float, ] -_lib.llama_sample_top_p_top_k.restype = llama_token +_lib.llama_sample_frequency_and_presence_penalties.restype = llama_token + + +# LLAMA_API void llama_sample_softmax(struct llama_context * ctx, llama_token_data_array * candidates); +def llama_sample_softmax(ctx: llama_context_p, candidates) -> llama_token: + return _lib.llama_sample_softmax(ctx, candidates) + + +_lib.llama_sample_softmax.argtypes = [ + llama_context_p, + llama_token_data_array_p, +] +_lib.llama_sample_softmax.restype = llama_token + + +# LLAMA_API void llama_sample_top_k(struct llama_context * ctx, llama_token_data_array * candidates, int k, size_t min_keep = 1); +def llama_sample_top_k( + ctx: llama_context_p, candidates, k: c_int, min_keep: c_int +) -> llama_token: + return _lib.llama_sample_top_k(ctx, candidates, k, min_keep) + + +_lib.llama_sample_top_k.argtypes = [ + llama_context_p, + llama_token_data_array_p, + c_int, + c_int, +] + + +# LLAMA_API void llama_sample_top_p(struct llama_context * ctx, llama_token_data_array * candidates, float p, size_t min_keep = 1); +def llama_sample_top_p( + ctx: llama_context_p, candidates, p: c_float, min_keep: c_int +) -> llama_token: + return _lib.llama_sample_top_p(ctx, candidates, p, min_keep) + + +_lib.llama_sample_top_p.argtypes = [ + llama_context_p, + llama_token_data_array_p, + c_float, + c_int, +] +_lib.llama_sample_top_p.restype = llama_token + + +# LLAMA_API void llama_sample_tail_free(struct llama_context * ctx, llama_token_data_array * candidates, float z, size_t min_keep = 1); +def llama_sample_tail_free( + ctx: llama_context_p, candidates, z: c_float, min_keep: c_int +) -> llama_token: + return _lib.llama_sample_tail_free(ctx, candidates, z, min_keep) + + +_lib.llama_sample_tail_free.argtypes = [ + llama_context_p, + llama_token_data_array_p, + c_float, + c_int, +] +_lib.llama_sample_tail_free.restype = llama_token + + +# LLAMA_API void llama_sample_typical(struct llama_context * ctx, llama_token_data_array * candidates, float p, size_t min_keep = 1); +def llama_sample_typical( + ctx: llama_context_p, candidates, p: c_float, min_keep: c_int +) -> llama_token: + return _lib.llama_sample_typical(ctx, candidates, p, min_keep) + + +_lib.llama_sample_typical.argtypes = [ + llama_context_p, + llama_token_data_array_p, + c_float, + c_int, +] +_lib.llama_sample_typical.restype = llama_token + + +# LLAMA_API void llama_sample_temperature(struct llama_context * ctx, llama_token_data_array * candidates, float temp); +def llama_sample_temperature( + ctx: llama_context_p, candidates, temp: c_float +) -> llama_token: + return _lib.llama_sample_temperature(ctx, candidates, temp) + + +_lib.llama_sample_temperature.argtypes = [ + llama_context_p, + llama_token_data_array_p, + c_float, +] +_lib.llama_sample_temperature.restype = llama_token + + +# LLAMA_API llama_token llama_sample_token_mirostat(struct llama_context * ctx, llama_token_data_array * candidates, float tau, float eta, int m, float * mu); +def llama_sample_token_mirostat( + ctx: llama_context_p, candidates, tau: c_float, eta: c_float, m: c_int, mu +) -> llama_token: + return _lib.llama_sample_token_mirostat(ctx, candidates, tau, eta, m, mu) + + +_lib.llama_sample_token_mirostat.argtypes = [ + llama_context_p, + llama_token_data_array_p, + c_float, + c_float, + c_int, + POINTER(c_float), +] +_lib.llama_sample_token_mirostat.restype = llama_token + + +# LLAMA_API llama_token llama_sample_token_mirostat_v2(struct llama_context * ctx, llama_token_data_array * candidates, float tau, float eta, float * mu); +def llama_sample_token_mirostat_v2( + ctx: llama_context_p, candidates, tau: c_float, eta: c_float, mu +) -> llama_token: + return _lib.llama_sample_token_mirostat_v2(ctx, candidates, tau, eta, mu) + + +_lib.llama_sample_token_mirostat_v2.argtypes = [ + llama_context_p, + llama_token_data_array_p, + c_float, + c_float, + POINTER(c_float), +] +_lib.llama_sample_token_mirostat_v2.restype = llama_token + + +# LLAMA_API llama_token llama_sample_token_greedy(struct llama_context * ctx, llama_token_data_array * candidates); +def llama_sample_token_greedy(ctx: llama_context_p, candidates) -> llama_token: + return _lib.llama_sample_token_greedy(ctx, candidates) + + +_lib.llama_sample_token_greedy.argtypes = [ + llama_context_p, + llama_token_data_array_p, +] +_lib.llama_sample_token_greedy.restype = llama_token + + +# LLAMA_API llama_token llama_sample_token(struct llama_context * ctx, llama_token_data_array * candidates); +def llama_sample_token(ctx: llama_context_p, candidates) -> llama_token: + return _lib.llama_sample_token(ctx, candidates) + + +_lib.llama_sample_token.argtypes = [ + llama_context_p, + llama_token_data_array_p, +] +_lib.llama_sample_token.restype = llama_token # Performance information diff --git a/vendor/llama.cpp b/vendor/llama.cpp index 7f15c5c..ea3a0ad 160000 --- a/vendor/llama.cpp +++ b/vendor/llama.cpp @@ -1 +1 @@ -Subproject commit 7f15c5c477d9933689a9d1c40794483e350c2f19 +Subproject commit ea3a0ad6b6b5ca4693b94acd4cb32e2803f66fae