diff --git a/CHANGELOG.md b/CHANGELOG.md index 228e3b9..bcf1665 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.27] + +- feat: Update llama.cpp to ggerganov/llama.cpp@b3a7c20b5c035250257d2b62851c379b159c899a +- feat: Add `saiga` chat format by @femoiseev in #1050 +- feat: Added `chatglm3` chat format by @xaviviro in #1059 +- fix: Correct typo in README.md by @qeleb in (#1058) + ## [0.2.26] - feat: Update llama.cpp to ggerganov/llama.cpp@f6793491b5af6da75edad34d6f503ef86d31b09f diff --git a/README.md b/README.md index 97fe6e1..b2e879e 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,7 @@ The gguf-converted files for this model can be found here: [functionary-7b-v1](h } } }], - tool_choices=[{ + tool_choice=[{ "type": "function", "function": { "name": "UserDetail" diff --git a/llama_cpp/__init__.py b/llama_cpp/__init__.py index 5db4664..d3fe66b 100644 --- a/llama_cpp/__init__.py +++ b/llama_cpp/__init__.py @@ -1,4 +1,4 @@ from .llama_cpp import * from .llama import * -__version__ = "0.2.26" \ No newline at end of file +__version__ = "0.2.27" \ No newline at end of file diff --git a/llama_cpp/llama_chat_format.py b/llama_cpp/llama_chat_format.py index 037f96a..0ef7bd4 100644 --- a/llama_cpp/llama_chat_format.py +++ b/llama_cpp/llama_chat_format.py @@ -172,6 +172,20 @@ def _format_chatml( ret += role + "\n" return ret +def _format_chatglm3( + system_message: str, messages: List[Tuple[str, Optional[str]]], sep: str +) -> str: + """Format the prompt with the chatglm3 style.""" + ret = "" + if system_message: + ret += system_message + for role, message in messages: + if message: + ret += role + "\n" + " " + message + else: + ret += role + return ret + @dataclasses.dataclass class ChatFormatterResponse: @@ -685,6 +699,22 @@ def format_chatml( _prompt = _format_chatml(system_message, _messages, _sep) return ChatFormatterResponse(prompt=_prompt, stop=_sep) +@register_chat_format("chatglm3") +def format_chatglm3( + messages: List[llama_types.ChatCompletionRequestMessage], + **kwargs: Any, +) -> ChatFormatterResponse: + system_template = """<|system|> +{system_message}""" + system_message = _get_system_message(messages) + system_message = system_template.format(system_message=system_message) + _roles = dict(user="<|user|>", assistant="<|assistant|>") + _sep = "" + _messages = _map_roles(messages, _roles) + _messages.append((_roles["assistant"], None)) + _prompt = _format_chatglm3(system_message, _messages, _sep) + return ChatFormatterResponse(prompt=_prompt, stop=_sep) + @register_chat_format("openchat") def format_openchat( @@ -704,6 +734,28 @@ def format_openchat( return ChatFormatterResponse(prompt=_prompt, stop=_sep) +# Chat format for Saiga models, see more details and available models: +# https://huggingface.co/collections/IlyaGusev/saiga2-saigamistral-6505d4ccc3d1e53166b636cd +@register_chat_format("saiga") +def format_saiga( + messages: list[llama_types.ChatCompletionRequestMessage], + **kwargs, +) -> ChatFormatterResponse: + _message_template = "{role}\n{content}" + _roles = dict(user="user", bot="bot", system="system") + _messages = _map_roles(messages, _roles) + + _prompt = "" + for role, content in _messages: + if content: + _prompt += _message_template.format(role=role, content=content) + else: + _prompt += f"{role}\n" + # Response template + _prompt += "bot" + return ChatFormatterResponse(prompt=_prompt.strip()) + + @register_chat_completion_handler("functionary") def functionary_chat_handler( llama: llama.Llama, diff --git a/llama_cpp/llama_cpp.py b/llama_cpp/llama_cpp.py index 75800c0..4aada53 100644 --- a/llama_cpp/llama_cpp.py +++ b/llama_cpp/llama_cpp.py @@ -93,6 +93,9 @@ c_size_t_p = POINTER(c_size_t) # llama.h bindings +_lib.llama_max_devices.argtypes = [] +_lib.llama_max_devices.restype = ctypes.c_int32 + LLAMA_MAX_DEVICES = _lib.llama_max_devices() # define LLAMA_DEFAULT_SEED 0xFFFFFFFF @@ -481,7 +484,7 @@ It might not exist for progress report where '.' is output repeatedly.""" # // model quantization parameters # typedef struct llama_model_quantize_params { -# int nthread; // number of threads to use for quantizing, if <=0 will use std::thread::hardware_concurrency() +# int32_t nthread; // number of threads to use for quantizing, if <=0 will use std::thread::hardware_concurrency() # enum llama_ftype ftype; // quantize to this llama_ftype # bool allow_requantize; // allow quantizing non-f32/f16 tensors # bool quantize_output_tensor; // quantize output.weight @@ -499,7 +502,7 @@ class llama_model_quantize_params(Structure): only_copy (bool): only copy tensors - ftype, allow_requantize and quantize_output_tensor are ignored pure (bool): disable k-quant mixtures and quantize all tensors to the same type""" _fields_ = [ - ("nthread", c_int), + ("nthread", c_int32), ("ftype", c_int), ("allow_requantize", c_bool), ("quantize_output_tensor", c_bool), @@ -698,13 +701,13 @@ _lib.llama_time_us.argtypes = [] _lib.llama_time_us.restype = ctypes.c_int64 -# LLAMA_API int llama_max_devices (void); +# LLAMA_API int32_t llama_max_devices(void); def llama_max_devices() -> int: return _lib.llama_max_devices() _lib.llama_max_devices.argtypes = [] -_lib.llama_max_devices.restype = c_int +_lib.llama_max_devices.restype = ctypes.c_int32 # LLAMA_API bool llama_mmap_supported (void); @@ -734,7 +737,7 @@ _lib.llama_get_model.argtypes = [llama_context_p] _lib.llama_get_model.restype = llama_model_p -# LLAMA_API int llama_n_ctx (const struct llama_context * ctx); +# LLAMA_API uint32_t llama_n_ctx (const struct llama_context * ctx); def llama_n_ctx(ctx: llama_context_p) -> int: return _lib.llama_n_ctx(ctx) @@ -758,31 +761,31 @@ _lib.llama_vocab_type.argtypes = [llama_model_p] _lib.llama_vocab_type.restype = c_int -# LLAMA_API int llama_n_vocab (const struct llama_model * model); +# LLAMA_API int32_t llama_n_vocab (const struct llama_model * model); def llama_n_vocab(model: llama_model_p) -> int: return _lib.llama_n_vocab(model) _lib.llama_n_vocab.argtypes = [llama_model_p] -_lib.llama_n_vocab.restype = c_int +_lib.llama_n_vocab.restype = c_int32 -# LLAMA_API int llama_n_ctx_train(const struct llama_model * model); +# LLAMA_API int32_t llama_n_ctx_train(const struct llama_model * model); def llama_n_ctx_train(model: llama_model_p) -> int: return _lib.llama_n_ctx_train(model) _lib.llama_n_ctx_train.argtypes = [llama_model_p] -_lib.llama_n_ctx_train.restype = c_int +_lib.llama_n_ctx_train.restype = c_int32 -# LLAMA_API int llama_n_embd (const struct llama_model * model); +# LLAMA_API int32_t llama_n_embd (const struct llama_model * model); def llama_n_embd(model: llama_model_p) -> int: return _lib.llama_n_embd(model) _lib.llama_n_embd.argtypes = [llama_model_p] -_lib.llama_n_embd.restype = c_int +_lib.llama_n_embd.restype = c_int32 # // Get the model's RoPE frequency scaling factor @@ -802,7 +805,7 @@ _lib.llama_rope_freq_scale_train.restype = c_float # // Get metadata value as a string by key name -# LLAMA_API int llama_model_meta_val_str(const struct llama_model * model, const char * key, char * buf, size_t buf_size); +# LLAMA_API int32_t llama_model_meta_val_str(const struct llama_model * model, const char * key, char * buf, size_t buf_size); def llama_model_meta_val_str( model: llama_model_p, key: Union[c_char_p, bytes], buf: bytes, buf_size: int ) -> int: @@ -811,22 +814,22 @@ def llama_model_meta_val_str( _lib.llama_model_meta_val_str.argtypes = [llama_model_p, c_char_p, c_char_p, c_size_t] -_lib.llama_model_meta_val_str.restype = c_int +_lib.llama_model_meta_val_str.restype = c_int32 # // Get the number of metadata key/value pairs -# LLAMA_API int llama_model_meta_count(const struct llama_model * model); +# LLAMA_API int32_t llama_model_meta_count(const struct llama_model * model); def llama_model_meta_count(model: llama_model_p) -> int: """Get the number of metadata key/value pairs""" return _lib.llama_model_meta_count(model) _lib.llama_model_meta_count.argtypes = [llama_model_p] -_lib.llama_model_meta_count.restype = c_int +_lib.llama_model_meta_count.restype = c_int32 # // Get metadata key name by index -# LLAMA_API int llama_model_meta_key_by_index(const struct llama_model * model, int i, char * buf, size_t buf_size); +# LLAMA_API int32_t llama_model_meta_key_by_index(const struct llama_model * model, int32_t i, char * buf, size_t buf_size); def llama_model_meta_key_by_index( model: llama_model_p, i: Union[c_int, int], buf: bytes, buf_size: int ) -> int: @@ -834,12 +837,17 @@ def llama_model_meta_key_by_index( return _lib.llama_model_meta_key_by_index(model, i, buf, buf_size) -_lib.llama_model_meta_key_by_index.argtypes = [llama_model_p, c_int, c_char_p, c_size_t] -_lib.llama_model_meta_key_by_index.restype = c_int +_lib.llama_model_meta_key_by_index.argtypes = [ + llama_model_p, + c_int32, + c_char_p, + c_size_t, +] +_lib.llama_model_meta_key_by_index.restype = c_int32 # // Get metadata value as a string by index -# LLAMA_API int llama_model_meta_val_str_by_index(const struct llama_model * model, int i, char * buf, size_t buf_size); +# LLAMA_API int32_t llama_model_meta_val_str_by_index(const struct llama_model * model, int32_t i, char * buf, size_t buf_size); def llama_model_meta_val_str_by_index( model: llama_model_p, i: Union[c_int, int], buf: bytes, buf_size: int ) -> int: @@ -849,15 +857,15 @@ def llama_model_meta_val_str_by_index( _lib.llama_model_meta_val_str_by_index.argtypes = [ llama_model_p, - c_int, + c_int32, c_char_p, c_size_t, ] -_lib.llama_model_meta_val_str_by_index.restype = c_int +_lib.llama_model_meta_val_str_by_index.restype = c_int32 # // Get a string describing the model type -# LLAMA_API int llama_model_desc(const struct llama_model * model, char * buf, size_t buf_size); +# LLAMA_API int32_t llama_model_desc(const struct llama_model * model, char * buf, size_t buf_size); def llama_model_desc( model: llama_model_p, buf: bytes, buf_size: Union[c_size_t, int] ) -> int: @@ -866,7 +874,7 @@ def llama_model_desc( _lib.llama_model_desc.argtypes = [llama_model_p, c_char_p, c_size_t] -_lib.llama_model_desc.restype = c_int +_lib.llama_model_desc.restype = c_int32 # // Returns the total size of all the tensors in the model in bytes @@ -905,7 +913,7 @@ _lib.llama_get_model_tensor.restype = c_void_p # // Returns 0 on success -# LLAMA_API int llama_model_quantize( +# LLAMA_API uint32_t llama_model_quantize( # const char * fname_inp, # const char * fname_out, # const llama_model_quantize_params * params); @@ -923,7 +931,7 @@ _lib.llama_model_quantize.argtypes = [ c_char_p, POINTER(llama_model_quantize_params), ] -_lib.llama_model_quantize.restype = c_int +_lib.llama_model_quantize.restype = c_uint32 # // Apply a LoRA adapter to a loaded model @@ -932,12 +940,12 @@ _lib.llama_model_quantize.restype = c_int # // The model needs to be reloaded before applying a new adapter, otherwise the adapter # // will be applied on top of the previous one # // Returns 0 on success -# LLAMA_API DEPRECATED(int llama_apply_lora_from_file( +# LLAMA_API DEPRECATED(int32_t llama_apply_lora_from_file( # struct llama_context * ctx, # const char * path_lora, # float scale, # const char * path_base_model, -# int n_threads), +# int32_t n_threads), # "use llama_model_apply_lora_from_file instead"); def llama_apply_lora_from_file( ctx: llama_context_p, @@ -962,17 +970,17 @@ _lib.llama_apply_lora_from_file.argtypes = [ c_char_p, c_float, c_char_p, - c_int, + c_int32, ] -_lib.llama_apply_lora_from_file.restype = c_int +_lib.llama_apply_lora_from_file.restype = c_int32 -# LLAMA_API int llama_model_apply_lora_from_file( +# LLAMA_API int32_t llama_model_apply_lora_from_file( # const struct llama_model * model, # const char * path_lora, # float scale, # const char * path_base_model, -# int n_threads); +# int32_t n_threads); def llama_model_apply_lora_from_file( model: llama_model_p, path_lora: Union[c_char_p, bytes], @@ -990,9 +998,9 @@ _lib.llama_model_apply_lora_from_file.argtypes = [ c_char_p, c_float, c_char_p, - c_int, + c_int32, ] -_lib.llama_model_apply_lora_from_file.restype = c_int +_lib.llama_model_apply_lora_from_file.restype = c_int32 # // # // KV cache @@ -1094,7 +1102,7 @@ _lib.llama_kv_cache_view_update.restype = None # // Returns the number of tokens in the KV cache (slow, use only for debug) # // If a KV cell has multiple sequences assigned to it, it will be counted multiple times -# LLAMA_API int llama_get_kv_cache_token_count(const struct llama_context * ctx); +# LLAMA_API int32_t llama_get_kv_cache_token_count(const struct llama_context * ctx); def llama_get_kv_cache_token_count(ctx: llama_context_p) -> int: """Returns the number of tokens in the KV cache (slow, use only for debug) If a KV cell has multiple sequences assigned to it, it will be counted multiple times @@ -1103,18 +1111,18 @@ def llama_get_kv_cache_token_count(ctx: llama_context_p) -> int: _lib.llama_get_kv_cache_token_count.argtypes = [llama_context_p] -_lib.llama_get_kv_cache_token_count.restype = c_int +_lib.llama_get_kv_cache_token_count.restype = c_int32 # // Returns the number of used KV cells (i.e. have at least one sequence assigned to them) -# LLAMA_API int llama_get_kv_cache_used_cells(const struct llama_context * ctx); +# LLAMA_API int32_t llama_get_kv_cache_used_cells(const struct llama_context * ctx); def llama_get_kv_cache_used_cells(ctx: llama_context_p) -> int: """Returns the number of used KV cells (i.e. have at least one sequence assigned to them)""" return _lib.llama_get_kv_cache_used_cells(ctx) _lib.llama_get_kv_cache_used_cells.argtypes = [llama_context_p] -_lib.llama_get_kv_cache_used_cells.restype = c_int +_lib.llama_get_kv_cache_used_cells.restype = c_int32 # // Clear the KV cache @@ -1361,7 +1369,7 @@ _lib.llama_save_session_file.restype = c_size_t # struct llama_context * ctx, # llama_token * tokens, # int32_t n_tokens, -# int n_past), +# int32_t n_past), # "use llama_decode() instead"); def llama_eval( ctx: llama_context_p, @@ -1377,7 +1385,7 @@ def llama_eval( return _lib.llama_eval(ctx, tokens, n_tokens, n_past) -_lib.llama_eval.argtypes = [llama_context_p, llama_token_p, c_int, c_int] +_lib.llama_eval.argtypes = [llama_context_p, llama_token_p, c_int32, c_int32] _lib.llama_eval.restype = c_int @@ -1387,7 +1395,7 @@ _lib.llama_eval.restype = c_int # struct llama_context * ctx, # float * embd, # int32_t n_tokens, -# int n_past), +# int32_t n_past), # "use llama_decode() instead"); def llama_eval_embd( ctx: llama_context_p, @@ -1400,7 +1408,7 @@ def llama_eval_embd( return _lib.llama_eval_embd(ctx, embd, n_tokens, n_past) -_lib.llama_eval_embd.argtypes = [llama_context_p, c_float_p, c_int, c_int] +_lib.llama_eval_embd.argtypes = [llama_context_p, c_float_p, c_int32, c_int32] _lib.llama_eval_embd.restype = c_int @@ -1480,7 +1488,7 @@ _lib.llama_batch_free.restype = None # // 0 - success # // 1 - could not find a KV slot for the batch (try reducing the size of the batch or increase the context) # // < 0 - error -# LLAMA_API int llama_decode( +# LLAMA_API int32_t llama_decode( # struct llama_context * ctx, # struct llama_batch batch); def llama_decode(ctx: llama_context_p, batch: llama_batch) -> int: @@ -1492,7 +1500,7 @@ def llama_decode(ctx: llama_context_p, batch: llama_batch) -> int: _lib.llama_decode.argtypes = [llama_context_p, llama_batch] -_lib.llama_decode.restype = c_int +_lib.llama_decode.restype = c_int32 # // Set the number of threads used for decoding @@ -1634,25 +1642,25 @@ _lib.llama_token_nl.restype = llama_token # // Returns -1 if unknown, 1 for true or 0 for false. -# LLAMA_API int llama_add_bos_token(const struct llama_model * model); +# LLAMA_API int32_t llama_add_bos_token(const struct llama_model * model); def llama_add_bos_token(model: llama_model_p) -> int: """Returns -1 if unknown, 1 for true or 0 for false.""" return _lib.llama_add_bos_token(model) _lib.llama_add_bos_token.argtypes = [llama_model_p] -_lib.llama_add_bos_token.restype = c_int +_lib.llama_add_bos_token.restype = c_int32 # // Returns -1 if unknown, 1 for true or 0 for false. -# LLAMA_API int llama_add_eos_token(const struct llama_model * model); +# LLAMA_API int32_t llama_add_eos_token(const struct llama_model * model); def llama_add_eos_token(model: llama_model_p) -> int: """Returns -1 if unknown, 1 for true or 0 for false.""" return _lib.llama_add_eos_token(model) _lib.llama_add_eos_token.argtypes = [llama_model_p] -_lib.llama_add_eos_token.restype = c_int +_lib.llama_add_eos_token.restype = c_int32 # // codellama infill tokens @@ -1704,12 +1712,12 @@ _lib.llama_token_eot.restype = llama_token # /// @return Returns a negative number on failure - the number of tokens that would have been returned # /// @param special Allow tokenizing special and/or control tokens which otherwise are not exposed and treated as plaintext. # /// Does not insert a leading space. -# LLAMA_API int llama_tokenize( +# LLAMA_API int32_t llama_tokenize( # const struct llama_model * model, # const char * text, -# int text_len, +# int32_t text_len, # llama_token * tokens, -# int n_max_tokens, +# int32_t n_max_tokens, # bool add_bos, # bool special); def llama_tokenize( @@ -1730,24 +1738,24 @@ def llama_tokenize( _lib.llama_tokenize.argtypes = [ llama_model_p, c_char_p, - c_int, + c_int32, llama_token_p, - c_int, + c_int32, c_bool, c_bool, ] -_lib.llama_tokenize.restype = c_int +_lib.llama_tokenize.restype = c_int32 # // Token Id -> Piece. # // Uses the vocabulary in the provided context. # // Does not write null terminator to the buffer. # // User code is responsible to remove the leading whitespace of the first non-BOS token when decoding multiple tokens. -# LLAMA_API int llama_token_to_piece( +# LLAMA_API int32_t llama_token_to_piece( # const struct llama_model * model, # llama_token token, # char * buf, -# int length); +# int32_t length); def llama_token_to_piece( model: llama_model_p, token: Union[llama_token, int], @@ -1762,8 +1770,8 @@ def llama_token_to_piece( return _lib.llama_token_to_piece(model, token, buf, length) -_lib.llama_token_to_piece.argtypes = [llama_model_p, llama_token, c_char_p, c_int] -_lib.llama_token_to_piece.restype = c_int +_lib.llama_token_to_piece.argtypes = [llama_model_p, llama_token, c_char_p, c_int32] +_lib.llama_token_to_piece.restype = c_int32 # // @@ -1924,7 +1932,7 @@ _lib.llama_sample_softmax.restype = None # LLAMA_API void llama_sample_top_k( # struct llama_context * ctx, # llama_token_data_array * candidates, -# int k, +# int32_t k, # size_t min_keep); def llama_sample_top_k( ctx: llama_context_p, @@ -1939,7 +1947,7 @@ def llama_sample_top_k( _lib.llama_sample_top_k.argtypes = [ llama_context_p, llama_token_data_array_p, - c_int, + c_int32, c_size_t, ] _lib.llama_sample_top_k.restype = None @@ -2129,7 +2137,7 @@ _lib.llama_sample_grammar.restype = None # llama_token_data_array * candidates, # float tau, # float eta, -# int m, +# int32_t m, # float * mu); def llama_sample_token_mirostat( ctx: llama_context_p, @@ -2155,7 +2163,7 @@ _lib.llama_sample_token_mirostat.argtypes = [ llama_token_data_array_p, c_float, c_float, - c_int, + c_int32, c_float_p, ] _lib.llama_sample_token_mirostat.restype = llama_token @@ -2320,8 +2328,8 @@ llama_beam_search_callback_fn_t = ctypes.CFUNCTYPE(None, c_void_p, llama_beams_s # llama_beam_search_callback_fn_t callback, # void * callback_data, # size_t n_beams, -# int n_past, -# int n_predict); +# int32_t n_past, +# int32_t n_predict); def llama_beam_search( ctx: llama_context_p, callback: "ctypes._CFuncPtr[None, c_void_p, llama_beams_state]", # type: ignore @@ -2340,8 +2348,8 @@ _lib.llama_beam_search.argtypes = [ llama_beam_search_callback_fn_t, c_void_p, c_size_t, - c_int, - c_int, + c_int32, + c_int32, ] _lib.llama_beam_search.restype = None diff --git a/vendor/llama.cpp b/vendor/llama.cpp index f679349..b3a7c20 160000 --- a/vendor/llama.cpp +++ b/vendor/llama.cpp @@ -1 +1 @@ -Subproject commit f6793491b5af6da75edad34d6f503ef86d31b09f +Subproject commit b3a7c20b5c035250257d2b62851c379b159c899a