From e040dd9badbc32bc43dde54e477ef22ba8f47cf4 Mon Sep 17 00:00:00 2001 From: Jiahao Li Date: Thu, 25 Jul 2024 10:03:28 +0800 Subject: [PATCH] Support GLM4V --- .gitmodules | 3 + CMakeLists.txt | 4 +- README.md | 67 +++- chatglm.cpp | 539 +++++++++++++++++++++------- chatglm.h | 549 +++++++++++++++++++++++------ chatglm_cpp/_C.pyi | 63 +++- chatglm_cpp/__init__.py | 41 ++- chatglm_cpp/convert.py | 252 +++++++++---- chatglm_cpp/openai_api.py | 46 ++- chatglm_pybind.cpp | 70 +++- chatglm_test.cpp | 472 ++++++++++++++++--------- examples/03-Confusing-Pictures.jpg | Bin 0 -> 46296 bytes examples/cli_demo.py | 17 +- examples/hmmm.jpg | Bin 0 -> 144082 bytes examples/openai_client.py | 18 +- main.cpp | 23 +- tests/data/baichuan13b_model.data | Bin 54932 -> 0 bytes tests/data/baichuan7b_model.data | Bin 54932 -> 0 bytes tests/data/glm4v_model.data | Bin 0 -> 116224 bytes tests/data/glm4v_model_text.data | Bin 0 -> 30932 bytes tests/data/internlm_model.data | Bin 55444 -> 0 bytes tests/perplexity.cpp | 2 +- tests/test_chatglm_cpp.py | 96 ++++- tests/test_convert.py | 331 +++++++++-------- third_party/stb | 1 + 25 files changed, 1929 insertions(+), 665 deletions(-) create mode 100644 examples/03-Confusing-Pictures.jpg create mode 100644 examples/hmmm.jpg delete mode 100644 tests/data/baichuan13b_model.data delete mode 100644 tests/data/baichuan7b_model.data create mode 100644 tests/data/glm4v_model.data create mode 100644 tests/data/glm4v_model_text.data delete mode 100644 tests/data/internlm_model.data create mode 160000 third_party/stb diff --git a/.gitmodules b/.gitmodules index 7ac75854..9033490c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,3 +14,6 @@ [submodule "third_party/abseil-cpp"] path = third_party/abseil-cpp url = https://github.com/abseil/abseil-cpp.git +[submodule "third_party/stb"] + path = third_party/stb + url = https://github.com/nothings/stb.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 3a9fe5ed..18b547bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,8 @@ add_subdirectory(third_party/abseil-cpp) add_subdirectory(third_party/re2) +include_directories(third_party/stb) + if (GGML_METAL) add_compile_definitions(GGML_USE_METAL) configure_file(third_party/ggml/src/ggml-metal.metal ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/ggml-metal.metal COPYONLY) @@ -135,7 +137,7 @@ add_custom_target(check-all COMMAND cmake --build build -j COMMAND ./build/bin/chatglm_test COMMAND python3 setup.py develop - COMMAND python3 -m pytest tests/test_chatglm_cpp.py + COMMAND python3 -m pytest --forked tests/test_chatglm_cpp.py WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} ) diff --git a/README.md b/README.md index d65c70fa..9c8cd0bc 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ![Python](https://img.shields.io/pypi/pyversions/chatglm-cpp) [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE) -C++ implementation of [ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B), [ChatGLM2-6B](https://github.com/THUDM/ChatGLM2-6B), [ChatGLM3](https://github.com/THUDM/ChatGLM3) and [GLM-4](https://github.com/THUDM/GLM-4) for real-time chatting on your MacBook. +C++ implementation of [ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B), [ChatGLM2-6B](https://github.com/THUDM/ChatGLM2-6B), [ChatGLM3](https://github.com/THUDM/ChatGLM3) and [GLM-4](https://github.com/THUDM/GLM-4)(V) for real-time chatting on your MacBook. ![demo](docs/demo.gif) @@ -22,7 +22,7 @@ Highlights: Support Matrix: * Hardwares: x86/arm CPU, NVIDIA GPU, Apple Silicon GPU * Platforms: Linux, MacOS, Windows -* Models: [ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B), [ChatGLM2-6B](https://github.com/THUDM/ChatGLM2-6B), [ChatGLM3](https://github.com/THUDM/ChatGLM3), [GLM-4](https://github.com/THUDM/GLM-4), [CodeGeeX2](https://github.com/THUDM/CodeGeeX2) +* Models: [ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B), [ChatGLM2-6B](https://github.com/THUDM/ChatGLM2-6B), [ChatGLM3](https://github.com/THUDM/ChatGLM3), [GLM-4](https://github.com/THUDM/GLM-4)(V), [CodeGeeX2](https://github.com/THUDM/CodeGeeX2) ## Getting Started @@ -53,9 +53,9 @@ python3 chatglm_cpp/convert.py -i THUDM/chatglm-6b -t q4_0 -o models/chatglm-ggm The original model (`-i `) can be a Hugging Face model name or a local path to your pre-downloaded model. Currently supported models are: * ChatGLM-6B: `THUDM/chatglm-6b`, `THUDM/chatglm-6b-int8`, `THUDM/chatglm-6b-int4` -* ChatGLM2-6B: `THUDM/chatglm2-6b`, `THUDM/chatglm2-6b-int4` -* ChatGLM3-6B: `THUDM/chatglm3-6b` -* ChatGLM4-9B: `THUDM/glm-4-9b-chat` +* ChatGLM2-6B: `THUDM/chatglm2-6b`, `THUDM/chatglm2-6b-int4`, `THUDM/chatglm2-6b-32k`, `THUDM/chatglm2-6b-32k-int4` +* ChatGLM3-6B: `THUDM/chatglm3-6b`, `THUDM/chatglm3-6b-32k`, `THUDM/chatglm3-6b-128k`, `THUDM/chatglm3-6b-base` +* ChatGLM4(V)-9B: `THUDM/glm-4-9b-chat`, `THUDM/glm-4-9b-chat-1m`, `THUDM/glm-4-9b`, `THUDM/glm-4v-9b` * CodeGeeX2: `THUDM/codegeex2-6b`, `THUDM/codegeex2-6b-int4` You are free to try any of the below quantization types by specifying `-t `: @@ -188,6 +188,42 @@ python3 chatglm_cpp/convert.py -i THUDM/glm-4-9b-chat -t q4_0 -o models/chatglm4 +
+ChatGLM4V-9B + +You may use `-vt ` to set quantization type for the vision encoder. It is recommended to run GLM4V on GPU since vision encoder runs slowly on CPU even with 4-bit quantization. +``` +python3 chatglm_cpp/convert.py -i THUDM/glm-4v-9b -t q4_0 -vt q4_0 -o models/chatglm4v-ggml.bin +``` + + + + + + + + + + + +
+ +```sh +./build/bin/main -m models/chatglm4v-ggml.bin --image examples/03-Confusing-Pictures.jpg -p "这张图片有什么不寻常之处" --temp 0 +# 这张图片中不寻常的是,一个男人站在一辆黄色SUV的后备箱上,正在使用一个铁板熨烫衣物。通常情况下,熨衣是在室内进行的,使用的是家用电熨斗,而不是在户外使用汽车后备箱作为工作台。此外,他似乎是在一个繁忙的城市街道上,周围有行驶的车辆和建筑物,这增加了场景的荒谬性。 +``` + + + +```sh +./build/bin/main -m models/chatglm4v-ggml.bin --image examples/hmmm.jpg -p "这幅图像有什么好笑的?" --temp 0 +# 这幅图像的幽默之处在于它将现代技术与过时的技术并置。智能手机是现代技术的象征,但在这里,它却被连接到一个看起来像是旧式电脑串行端口的蓝色适配器上。这种组合出人意料,颇具幽默感,因为它将两个截然不同的技术时代混合在一起。 +``` + +
+ +
+
CodeGeeX2 @@ -361,6 +397,15 @@ python3 cli_demo.py -m ../models/chatglm4-ggml.bin -p 你好 --temp 0.8 --top_p ```
+
+ChatGLM4V-9B + +Chat mode: +```sh +python3 cli_demo.py -m ../models/chatglm4v-ggml.bin --image 03-Confusing-Pictures.jpg -p "这张图片有什么不寻常之处" --temp 0 +``` +
+
CodeGeeX2 @@ -450,12 +495,20 @@ Use the OpenAI client to chat with your model: For stream response, check out the example client script: ```sh -OPENAI_BASE_URL=http://127.0.0.1:8000/v1 python3 examples/openai_client.py --stream --prompt 你好 +python3 examples/openai_client.py --base_url http://127.0.0.1:8000/v1 --stream --prompt 你好 ``` Tool calling is also supported: ```sh -OPENAI_BASE_URL=http://127.0.0.1:8000/v1 python3 examples/openai_client.py --tool_call --prompt 上海天气怎么样 +python3 examples/openai_client.py --base_url http://127.0.0.1:8000/v1 --tool_call --prompt 上海天气怎么样 +``` + +Request GLM4V with image inputs: +```sh +# request with local image file +python3 examples/openai_client.py --base_url http://127.0.0.1:8000/v1 --tool_call --prompt 描述这张图片 --image examples/03-Confusing-Pictures.jpg +# request with image url +python3 examples/openai_client.py --base_url http://127.0.0.1:8000/v1 --tool_call --prompt 描述这张图片 --image https://www.barnorama.com/wp-content/uploads/2016/12/03-Confusing-Pictures.jpg ``` With this API server as backend, ChatGLM.cpp models can be seamlessly integrated into any frontend that uses OpenAI-style API, including [mckaywrigley/chatbot-ui](https://github.com/mckaywrigley/chatbot-ui), [fuergaosi233/wechat-chatgpt](https://github.com/fuergaosi233/wechat-chatgpt), [Yidadaa/ChatGPT-Next-Web](https://github.com/Yidadaa/ChatGPT-Next-Web), and more. diff --git a/chatglm.cpp b/chatglm.cpp index a7fc3369..c9f943bb 100644 --- a/chatglm.cpp +++ b/chatglm.cpp @@ -17,6 +17,11 @@ #include #include +#define STB_IMAGE_IMPLEMENTATION +#define STB_IMAGE_RESIZE2_IMPLEMENTATION +#include +#include + #ifdef __has_include #if __has_include() #include @@ -390,11 +395,27 @@ StateDict ModelLoader::read_state_dict() { return sd; } -ModelContext::ModelContext(ggml_type dtype) - : dtype(dtype), compute_meta(ggml_tensor_overhead() * GGML_DEFAULT_GRAPH_SIZE + ggml_graph_overhead()), +Image Image::open(const std::string &path) { + int width, height, channels; + uint8_t *buffer = stbi_load(path.c_str(), &width, &height, &channels, 3); + CHATGLM_CHECK(channels == 3); + Image image(width, height, channels, buffer); + stbi_image_free(buffer); + return image; +} + +Image Image::resize(size_t new_width, size_t new_height) const { + Image output(new_width, new_height, channels); + stbir_resize_uint8_srgb(pixels.data(), width, height, 0, output.pixels.data(), new_width, new_height, 0, STBIR_RGB); + return output; +} + +ModelContext::ModelContext() + : compute_meta(ggml_tensor_overhead() * (GGML_DEFAULT_GRAPH_SIZE * 4) + ggml_graph_overhead()), ctx_w(make_unique_ggml_context(ggml_tensor_overhead() * GGML_DEFAULT_GRAPH_SIZE, nullptr, true)), ctx_kv(make_unique_ggml_context(ggml_tensor_overhead() * GGML_DEFAULT_GRAPH_SIZE, nullptr, true)), - ctx_b(make_unique_ggml_context(compute_meta.size(), compute_meta.data(), true)), gf(ggml_new_graph(ctx_b.get())) { + ctx_b(make_unique_ggml_context(compute_meta.size(), compute_meta.data(), true)), + gf(ggml_new_graph_custom(ctx_b.get(), GGML_DEFAULT_GRAPH_SIZE * 4, false)) { #if defined(GGML_USE_CUDA) backend = unique_ggml_backend_t(ggml_backend_cuda_init(0)); @@ -428,8 +449,7 @@ ggml_tensor *Linear::forward(ModelContext *mctx, ggml_tensor *input) const { ggml_tensor *LayerNorm::forward(ModelContext *mctx, ggml_tensor *input) const { // input: [seqlen, normalized_shape] ggml_context *ctx = mctx->ctx_b.get(); - auto ggml_norm_fn = inplace ? ggml_norm_inplace : ggml_norm; - ggml_tensor *output = ggml_norm_fn(ctx, input, eps); + ggml_tensor *output = ggml_norm(ctx, input, eps); output = ggml_mul_inplace(ctx, output, weight); output = ggml_add_inplace(ctx, output, bias); return output; @@ -437,8 +457,7 @@ ggml_tensor *LayerNorm::forward(ModelContext *mctx, ggml_tensor *input) const { ggml_tensor *RMSNorm::forward(ModelContext *mctx, ggml_tensor *input) const { ggml_context *ctx = mctx->ctx_b.get(); - auto ggml_rms_norm_fn = inplace ? ggml_rms_norm_inplace : ggml_rms_norm; - ggml_tensor *output = ggml_rms_norm_fn(ctx, input, eps); + ggml_tensor *output = ggml_rms_norm(ctx, input, eps); output = ggml_mul_inplace(ctx, output, weight); return output; } @@ -506,18 +525,12 @@ static void set_default_num_threads(ggml_backend_t backend, int num_tokens) { } std::string to_string(ModelType model_type) { - switch (model_type) { - case ModelType::CHATGLM: - return "ChatGLM"; - case ModelType::CHATGLM2: - return "ChatGLM2"; - case ModelType::CHATGLM3: - return "ChatGLM3"; - case ModelType::CHATGLM4: - return "ChatGLM4"; - default: - CHATGLM_THROW << "unknown model type " << (int)model_type; - } + static const std::unordered_map m{{ModelType::CHATGLM, "ChatGLM"}, + {ModelType::CHATGLM2, "ChatGLM2"}, + {ModelType::CHATGLM3, "ChatGLM3"}, + {ModelType::CHATGLM4, "ChatGLM4"}, + {ModelType::CHATGLM4V, "ChatGLM4V"}}; + return m.at(model_type); } static ggml_tensor *apply_rotary_emb_basic(ModelContext *mctx, ggml_tensor *layer, ggml_tensor *position_ids, @@ -664,23 +677,28 @@ ggml_tensor *BasicAttention::forward(ModelContext *mctx, ggml_tensor *hidden_sta key_layer = ggml_permute(ctx, key_layer, 0, 2, 1, 3); // [#kvh, s, d] value_layer = ggml_permute(ctx, value_layer, 1, 2, 0, 3); // [#kvh, d, s] - // store key & value to cache - ggml_tensor *k_cache_view = - ggml_view_3d(ctx, k_cache, head_size, qlen, num_key_value_heads, k_cache->nb[1], k_cache->nb[2], - (num_virtual_tokens + n_past) * head_size * ggml_element_size(k_cache)); // [#kvh, s, d] - ggml_build_forward_expand(mctx->gf, ggml_cpy(ctx, key_layer, k_cache_view)); - ggml_tensor *v_cache_view = - ggml_view_3d(ctx, v_cache, qlen, head_size, num_key_value_heads, v_cache->nb[1], v_cache->nb[2], - (num_virtual_tokens + n_past) * ggml_element_size(v_cache)); // [#kvh, d, s] - ggml_build_forward_expand(mctx->gf, ggml_cpy(ctx, value_layer, v_cache_view)); - - // concat key & value with past kv - key_layer = ggml_view_3d(ctx, k_cache, head_size, num_virtual_tokens + n_past + qlen, num_key_value_heads, - k_cache->nb[1], k_cache->nb[2], - 0); // [#kvh, kvs, d] - value_layer = ggml_view_3d(ctx, v_cache, num_virtual_tokens + n_past + qlen, head_size, num_key_value_heads, - v_cache->nb[1], v_cache->nb[2], - 0); // [#kvh, d, kvs] + if (k_cache && v_cache) { + // store key & value to cache + ggml_tensor *k_cache_view = + ggml_view_3d(ctx, k_cache, head_size, qlen, num_key_value_heads, k_cache->nb[1], k_cache->nb[2], + (num_virtual_tokens + n_past) * k_cache->nb[1]); // [#kvh, s, d] + ggml_tensor *v_cache_view = + ggml_view_3d(ctx, v_cache, qlen, head_size, num_key_value_heads, v_cache->nb[1], v_cache->nb[2], + (num_virtual_tokens + n_past) * v_cache->nb[0]); // [#kvh, d, s] + ggml_build_forward_expand(mctx->gf, ggml_cpy(ctx, key_layer, k_cache_view)); + ggml_build_forward_expand(mctx->gf, ggml_cpy(ctx, value_layer, v_cache_view)); + + // concat key & value with past kv + key_layer = ggml_view_3d(ctx, k_cache, head_size, num_virtual_tokens + n_past + qlen, num_key_value_heads, + k_cache->nb[1], k_cache->nb[2], + 0); // [#kvh, kvs, d] + value_layer = ggml_view_3d(ctx, v_cache, num_virtual_tokens + n_past + qlen, head_size, num_key_value_heads, + v_cache->nb[1], v_cache->nb[2], + 0); // [#kvh, d, kvs] + } else { + key_layer = ggml_cont(ctx, key_layer); + value_layer = ggml_cont(ctx, value_layer); + } // attention query_layer = ggml_scale_inplace(ctx, query_layer, 1.f / std::sqrt(head_size)); @@ -693,7 +711,9 @@ ggml_tensor *BasicAttention::forward(ModelContext *mctx, ggml_tensor *hidden_sta num_attention_heads); // [#h, s, kvs] } - if (attn_mask_type == AttentionMaskType::CAUSAL) { + if (attn_mask_type == AttentionMaskType::BIDIRECTIONAL) { + // pass + } else if (attn_mask_type == AttentionMaskType::CAUSAL) { attn_scores = ggml_diag_mask_inf_inplace(ctx, attn_scores, num_virtual_tokens + n_past); } else { attn_scores = ggml_add_inplace(ctx, attn_scores, attention_mask); @@ -721,28 +741,40 @@ ggml_tensor *BasicAttention::forward(ModelContext *mctx, ggml_tensor *hidden_sta } BaseModelForCausalLM::BaseModelForCausalLM(ModelConfig config) - : config(config), mctx_(std::make_unique(config.dtype)) {} + : config(config), mctx_(std::make_unique()) {} -ggml_tensor *BaseModelForCausalLM::forward_graph_compute(const std::vector &input_ids, int n_past, int n_ctx, +ggml_tensor *BaseModelForCausalLM::forward_graph_compute(const std::vector &input_ids, + const std::optional &image, int n_past, int n_ctx, bool is_decoding) { mctx_->ctx_b = make_unique_ggml_context(mctx_->compute_meta.size(), mctx_->compute_meta.data(), true); - mctx_->gf = ggml_new_graph(mctx_->ctx_b.get()); + mctx_->gf = ggml_new_graph_custom(mctx_->ctx_b.get(), GGML_DEFAULT_GRAPH_SIZE * 4, false); - const int qlen = input_ids.size() - n_past; + const int qlen = (n_past == 0) ? input_ids.size() : 1; ggml_tensor *curr_input_ids = ggml_new_tensor_1d(mctx_->ctx_b.get(), GGML_TYPE_I32, qlen); ggml_set_name(curr_input_ids, "input_ids"); ggml_set_input(curr_input_ids); - ggml_tensor *lm_logits = forward(mctx_.get(), curr_input_ids, n_past, n_ctx, is_decoding); + ggml_tensor *curr_image = nullptr; + if (n_past == 0 && image) { + curr_image = ggml_new_tensor_3d(mctx_->ctx_b.get(), GGML_TYPE_F32, config.vision.image_size, + config.vision.image_size, config.vision.in_channels); + ggml_set_name(curr_image, "image"); + ggml_set_input(curr_image); + } + + ggml_tensor *lm_logits = forward(mctx_.get(), curr_input_ids, curr_image, input_ids, n_past, is_decoding); ggml_set_output(lm_logits); ggml_build_forward_expand(mctx_->gf, lm_logits); CHATGLM_CHECK(ggml_gallocr_alloc_graph(mctx_->allocr.get(), mctx_->gf)); - ggml_backend_tensor_set(curr_input_ids, input_ids.data() + n_past, 0, qlen * sizeof(int)); - - set_graph_inputs(qlen, n_past, n_ctx); + // TODO: move into set_graph_inputs + curr_input_ids = ggml_graph_get_tensor(mctx_->gf, "input_ids"); + if (curr_input_ids) { + ggml_backend_tensor_set(curr_input_ids, input_ids.data() + input_ids.size() - qlen, 0, qlen * sizeof(int)); + } + set_graph_inputs(input_ids, image, n_past, n_ctx); set_default_num_threads(mctx_->backend.get(), qlen); CHATGLM_CHECK(ggml_backend_graph_compute(mctx_->backend.get(), mctx_->gf) == GGML_STATUS_SUCCESS); @@ -754,9 +786,9 @@ ggml_tensor *BaseModelForCausalLM::forward_graph_compute(const std::vector return lm_logits; } -int BaseModelForCausalLM::generate_next_token(const std::vector &input_ids, const GenerationConfig &gen_config, - int n_past, int n_ctx) { - ggml_tensor *lm_logits = forward_graph_compute(input_ids, n_past, n_ctx, true); +int BaseModelForCausalLM::generate_next_token(const std::vector &input_ids, const std::optional &image, + const GenerationConfig &gen_config, int n_past, int n_ctx) { + ggml_tensor *lm_logits = forward_graph_compute(input_ids, image, n_past, n_ctx, true); CHATGLM_CHECK(ggml_n_dims(lm_logits) == 1); int vocab_size = lm_logits->ne[0]; @@ -883,8 +915,8 @@ void BaseModelForCausalLM::sampling_softmax_inplace(TokenIdScore *first, TokenId } } -std::vector BaseModelForCausalLM::generate(const std::vector &input_ids, const GenerationConfig &gen_config, - BaseStreamer *streamer) { +std::vector BaseModelForCausalLM::generate(const std::vector &input_ids, const std::optional &image, + const GenerationConfig &gen_config, BaseStreamer *streamer) { CHATGLM_CHECK(gen_config.max_length <= config.max_length) << "Requested max_length (" << gen_config.max_length << ") exceeds pre-configured model max_length (" << config.max_length << ")"; @@ -901,9 +933,9 @@ std::vector BaseModelForCausalLM::generate(const std::vector &input_id const int max_new_tokens = (gen_config.max_new_tokens > 0) ? gen_config.max_new_tokens : gen_config.max_length; while ((int)output_ids.size() < std::min(gen_config.max_length, n_ctx + max_new_tokens)) { - int next_token_id = generate_next_token(output_ids, gen_config, n_past, n_ctx); + int next_token_id = generate_next_token(output_ids, image, gen_config, n_past, n_ctx); - n_past = output_ids.size(); + n_past = count_tokens(output_ids, image); output_ids.emplace_back(next_token_id); if (streamer) { @@ -1086,25 +1118,8 @@ ggml_tensor *GLMBlock::forward(ModelContext *mctx, ggml_tensor *hidden_states, g return output; } -ChatGLMForCausalLM::ChatGLMForCausalLM(const ModelConfig &config) : BasicModelForCausalLM(config) {} - void ChatGLMForCausalLM::load_state_dict(const StateDict &sd) { - void *sd_buf_base = ggml_backend_buffer_get_base(sd.buf.get()); - const size_t sd_buf_size = ggml_backend_buffer_get_size(sd.buf.get()); - if (ggml_backend_is_cpu(mctx_->backend.get())) { - mctx_->buf_w = unique_ggml_backend_buffer_t(ggml_backend_cpu_buffer_from_ptr(sd_buf_base, sd_buf_size)); - } -#ifdef GGML_USE_METAL - else if (ggml_backend_is_metal(mctx_->backend.get())) { - const size_t max_size = ggml_get_max_tensor_size(mctx_->ctx_w.get()); - mctx_->buf_w = - unique_ggml_backend_buffer_t(ggml_backend_metal_buffer_from_ptr(sd_buf_base, sd_buf_size, max_size)); - } -#endif - else { - mctx_->buf_w = - unique_ggml_backend_buffer_t(ggml_backend_alloc_ctx_tensors(mctx_->ctx_w.get(), mctx_->backend.get())); - } + alloc_weight_context(sd.buf.get()); StateDict self_sd = state_dict(); for (auto &item : self_sd.kv) { @@ -1120,13 +1135,11 @@ void ChatGLMForCausalLM::load_state_dict(const StateDict &sd) { } } -void ChatGLMForCausalLM::set_graph_inputs(int qlen, int n_past, int n_ctx) const { - set_graph_inputs(mctx_->gf, qlen, n_past, n_ctx); -} - -void ChatGLMForCausalLM::set_graph_inputs(ggml_cgraph *gf, int qlen, int n_past, int n_ctx) { +void ChatGLMModel::set_graph_inputs(ggml_cgraph *gf, const std::vector &input_ids, + const std::optional &image, int n_past, int n_ctx) const { // attention_mask: [s, kvs] auto broadcast to [#h, s, kvs] // semantic: attn_scores[:, :-1, -1] = -inf + const int qlen = input_ids.size() - n_past; if (n_past == 0) { ggml_tensor *attention_mask = ggml_graph_get_tensor(gf, "attention_mask"); const int kvlen = attention_mask->ne[0]; @@ -1245,25 +1258,8 @@ bool ChatGLM2Tokenizer::is_special_id(int id) const { id == eop_token_id; } -ChatGLM2ForCausalLM::ChatGLM2ForCausalLM(const ModelConfig &config) : BasicModelForCausalLM(config) {} - void ChatGLM2ForCausalLM::load_state_dict(const StateDict &sd) { - void *sd_buf_base = ggml_backend_buffer_get_base(sd.buf.get()); - const size_t sd_buf_size = ggml_backend_buffer_get_size(sd.buf.get()); - if (ggml_backend_is_cpu(mctx_->backend.get())) { - mctx_->buf_w = unique_ggml_backend_buffer_t(ggml_backend_cpu_buffer_from_ptr(sd_buf_base, sd_buf_size)); - } -#ifdef GGML_USE_METAL - else if (ggml_backend_is_metal(mctx_->backend.get())) { - const size_t max_size = ggml_get_max_tensor_size(mctx_->ctx_w.get()); - mctx_->buf_w = - unique_ggml_backend_buffer_t(ggml_backend_metal_buffer_from_ptr(sd_buf_base, sd_buf_size, max_size)); - } -#endif - else { - mctx_->buf_w = - unique_ggml_backend_buffer_t(ggml_backend_alloc_ctx_tensors(mctx_->ctx_w.get(), mctx_->backend.get())); - } + alloc_weight_context(sd.buf.get()); if (config.num_virtual_tokens > 0) { ggml_tensor *past_key_values = sd.kv.at("past_key_values"); @@ -1271,7 +1267,11 @@ void ChatGLM2ForCausalLM::load_state_dict(const StateDict &sd) { } auto self_sd = state_dict(); - for (auto it = sd.kv.begin(); it != sd.kv.end(); it++) { + load_state_dict(mctx_.get(), self_sd, sd); +} + +void ChatGLM2ForCausalLM::load_state_dict(ModelContext *mctx, StateDict &dst, const StateDict &src) { + for (auto it = src.kv.begin(); it != src.kv.end(); it++) { const std::string &name = it->first; ggml_tensor *ckpt_weight = it->second; @@ -1283,16 +1283,16 @@ void ChatGLM2ForCausalLM::load_state_dict(const StateDict &sd) { if (pos != std::string::npos) { // split dense_h_to_4h to gate & up std::string gate_name = name.substr(0, pos) + "mlp.gate_proj.weight"; - ggml_tensor *gate_proj = self_sd.kv.at(gate_name); + ggml_tensor *gate_proj = dst.kv.at(gate_name); std::string up_name = name.substr(0, pos) + "mlp.up_proj.weight"; - ggml_tensor *up_proj = self_sd.kv.at(up_name); + ggml_tensor *up_proj = dst.kv.at(up_name); - CHATGLM_CHECK(ggml_nbytes(ckpt_weight) == ggml_nbytes(gate_proj) + ggml_nbytes(up_proj)); + CHATGLM_CHECK(ggml_nbytes(ckpt_weight) == ggml_nbytes(gate_proj) + ggml_nbytes(up_proj)) << name; - if (ggml_backend_is_cpu(mctx_->backend.get()) || ggml_cpu_has_metal()) { - ggml_backend_tensor_alloc(mctx_->buf_w.get(), gate_proj, ckpt_weight->data); - ggml_backend_tensor_alloc(mctx_->buf_w.get(), up_proj, + if (ggml_backend_is_cpu(mctx->backend.get()) || ggml_cpu_has_metal()) { + ggml_backend_tensor_alloc(mctx->buf_w.get(), gate_proj, ckpt_weight->data); + ggml_backend_tensor_alloc(mctx->buf_w.get(), up_proj, (char *)ckpt_weight->data + ggml_nbytes(gate_proj)); } else { ggml_backend_tensor_set(gate_proj, ckpt_weight->data, 0, ggml_nbytes(gate_proj)); @@ -1301,10 +1301,10 @@ void ChatGLM2ForCausalLM::load_state_dict(const StateDict &sd) { } } else { // normal weight - ggml_tensor *self_weight = self_sd.kv.at(name); - CHATGLM_CHECK(ggml_nbytes(self_weight) == ggml_nbytes(ckpt_weight)); - if (ggml_backend_is_cpu(mctx_->backend.get()) || ggml_cpu_has_metal()) { - ggml_backend_tensor_alloc(mctx_->buf_w.get(), self_weight, ckpt_weight->data); + ggml_tensor *self_weight = dst.kv.at(name); + CHATGLM_CHECK(ggml_nbytes(self_weight) == ggml_nbytes(ckpt_weight)) << name; + if (ggml_backend_is_cpu(mctx->backend.get()) || ggml_cpu_has_metal()) { + ggml_backend_tensor_alloc(mctx->buf_w.get(), self_weight, ckpt_weight->data); } else { ggml_backend_tensor_set(self_weight, ckpt_weight->data, 0, ggml_nbytes(self_weight)); } @@ -1312,12 +1312,10 @@ void ChatGLM2ForCausalLM::load_state_dict(const StateDict &sd) { } } -void ChatGLM2ForCausalLM::set_graph_inputs(int qlen, int n_past, int n_ctx) const { - set_graph_inputs(mctx_->gf, qlen, n_past, n_ctx); -} - -void ChatGLM2ForCausalLM::set_graph_inputs(ggml_cgraph *gf, int qlen, int n_past, int n_ctx) { +void ChatGLM2Model::set_graph_inputs(ggml_cgraph *gf, const std::vector &input_ids, + const std::optional &image, int n_past, int n_ctx) const { ggml_tensor *position_ids = ggml_graph_get_tensor(gf, "position_ids"); + const int qlen = input_ids.size() - n_past; CHATGLM_CHECK(ggml_n_dims(position_ids) == 1 && position_ids->ne[0] == qlen) << "invalid position ids size " << position_ids->ne[0]; @@ -1470,7 +1468,7 @@ ChatMessage ChatGLM3Tokenizer::decode_message(const std::vector &ids) const std::string code_output = output.substr(ci_pos + ci_delim.size()); code_output = remove_special_tokens(code_output); trim(code_output); - message = ChatMessage(ChatMessage::ROLE_ASSISTANT, std::move(chat_output), + message = ChatMessage(ChatMessage::ROLE_ASSISTANT, std::move(chat_output), std::nullopt, {ToolCallMessage(CodeMessage(std::move(code_output)))}); } else { // tool call @@ -1498,7 +1496,7 @@ ChatMessage ChatGLM3Tokenizer::decode_message(const std::vector &ids) const tool_args = sm[1]; } - message = ChatMessage(ChatMessage::ROLE_ASSISTANT, std::move(output), + message = ChatMessage(ChatMessage::ROLE_ASSISTANT, std::move(output), std::nullopt, {ToolCallMessage(FunctionMessage(std::move(tool_name), std::move(tool_args)))}); } } else { @@ -1691,11 +1689,14 @@ ChatGLM4Tokenizer::ChatGLM4Tokenizer(const std::string &vocab_text) { special_tokens_encoder.emplace(token, vocab_size++); } // common special token ids + eos_token_id = special_tokens_encoder.at("<|endoftext|>"); gmask_token_id = special_tokens_encoder.at("[gMASK]"); sop_token_id = special_tokens_encoder.at(""); user_token_id = special_tokens_encoder.at("<|user|>"); assistant_token_id = special_tokens_encoder.at("<|assistant|>"); observation_token_id = special_tokens_encoder.at("<|observation|>"); + boi_token_id = special_tokens_encoder.at("<|begin_of_image|>"); + eoi_token_id = special_tokens_encoder.at("<|end_of_image|>"); const std::string pattern = R"((?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|(\s+)(?:\s)|\s+)"; @@ -1733,6 +1734,9 @@ std::vector ChatGLM4Tokenizer::apply_chat_template(const std::vector")); input_ids.insert(input_ids.end(), newline_ids.begin(), newline_ids.end()); + if (msg.image.has_value()) { + input_ids.insert(input_ids.end(), {boi_token_id, eos_token_id, eoi_token_id}); + } std::vector content_ids = core_bpe.encode_ordinary(msg.content); input_ids.insert(input_ids.end(), content_ids.begin(), content_ids.end()); } @@ -1749,6 +1753,282 @@ void ChatGLM4Tokenizer::truncate(std::vector &ids, int max_length) { } } +// ===== GLM4V-9B ===== + +ggml_tensor *Conv2d::forward(ModelContext *mctx, ggml_tensor *input) const { + // input: [b, c, h, w] + ggml_context *ctx = mctx->ctx_b.get(); + ggml_tensor *output = ggml_conv_2d(ctx, weight, input, stride, stride, 0, 0, 1, 1); // [b, oc, oh, ow] + output = ggml_add_inplace(ctx, output, bias); + return output; +} + +ggml_tensor *PatchEmbedding::forward(ModelContext *mctx, ggml_tensor *input) const { + // input: [c, h, w] + ggml_context *ctx = mctx->ctx_b.get(); + input = proj.forward(mctx, input); // [oc, oh, ow] + input = ggml_reshape_2d(ctx, input, input->ne[0] * input->ne[1], input->ne[2]); // [oc, oh * ow] + input = ggml_permute(ctx, input, 1, 0, 2, 3); // [oh * ow, oc] view as [s, h] + + ggml_tensor *embeddings = ggml_new_tensor_2d(ctx, input->type, hidden_size(), num_positions()); + ggml_set_name(embeddings, "embeddings"); + ggml_set_input(embeddings); + + // concat (cls, x) + ggml_tensor *cls_embedding_view = + ggml_cpy(ctx, cls_embedding, ggml_view_1d(ctx, embeddings, cls_embedding->ne[0], 0)); + ggml_tensor *img_embedding_view = ggml_cpy( + ctx, input, ggml_view_2d(ctx, embeddings, input->ne[0], input->ne[1], embeddings->nb[1], embeddings->nb[1])); + ggml_build_forward_expand(mctx->gf, cls_embedding_view); + ggml_build_forward_expand(mctx->gf, img_embedding_view); + + embeddings = ggml_add_inplace(ctx, embeddings, position_embedding.weight); // [s, h] + return embeddings; +} + +ggml_tensor *EVA2CLIPBlock::forward(ModelContext *mctx, ggml_tensor *hidden_states, ggml_tensor *attention_mask, + ggml_tensor *position_ids, int n_past) const { + ggml_context *ctx = mctx->ctx_b.get(); + + ggml_tensor *residual = hidden_states; + hidden_states = attention.forward(mctx, hidden_states, attention_mask, position_ids, n_past); + hidden_states = input_layernorm.forward(mctx, hidden_states); + hidden_states = ggml_add_inplace(ctx, hidden_states, residual); + + residual = hidden_states; + hidden_states = mlp.forward(mctx, hidden_states); + hidden_states = post_attention_layernorm.forward(mctx, hidden_states); + hidden_states = ggml_add_inplace(ctx, hidden_states, residual); + + return hidden_states; +} + +EVA2CLIPTransformer::EVA2CLIPTransformer(ModelContext *mctx, const VisionModelConfig &config) { + layers.reserve(config.num_hidden_layers); + for (int layer_id = 0; layer_id < config.num_hidden_layers; layer_id++) { + layers.emplace_back(mctx, config.dtype, config.hidden_size, config.num_attention_heads, + config.num_attention_heads, config.intermediate_size, config.num_positions, config.norm_eps, + config.hidden_act, true, true, false, RopeType::DISABLED, -1, + AttentionMaskType::BIDIRECTIONAL, 0, false); + } +} + +ggml_tensor *EVA2CLIPTransformer::forward(ModelContext *mctx, ggml_tensor *hidden_states) const { + for (const auto &layer : layers) { + hidden_states = layer.forward(mctx, hidden_states, nullptr, nullptr, 0); + } + return hidden_states; +} + +ggml_tensor *EVA2CLIPModel::forward(ModelContext *mctx, ggml_tensor *input) const { + ggml_context *ctx = mctx->ctx_b.get(); + + ggml_tensor *hidden_states = patch_embedding.forward(mctx, input); + hidden_states = transformer.forward(mctx, hidden_states); // [s, hd] + + const int grid_size = std::round(std::sqrt(hidden_states->ne[1] - 1)); + hidden_states = ggml_view_3d(ctx, hidden_states, hidden_states->ne[0], grid_size, grid_size, hidden_states->nb[1], + grid_size * hidden_states->nb[1], hidden_states->nb[1]); // [g, g, hd] + // TODO: must use this cont? + hidden_states = ggml_cont(ctx, ggml_permute(ctx, hidden_states, 2, 0, 1, 3)); // [hd, g, g] + hidden_states = conv.forward(mctx, hidden_states); // [hd, g/2, g/2] + hidden_states = ggml_reshape_2d(ctx, hidden_states, hidden_states->ne[0] * hidden_states->ne[1], + hidden_states->ne[2]); // [hd, s] + // TODO: this cont? + hidden_states = ggml_cont(ctx, ggml_permute(ctx, hidden_states, 1, 0, 2, 3)); // [s, hd] + + hidden_states = linear_proj.forward(mctx, hidden_states); + hidden_states = norm1.forward(mctx, hidden_states); + hidden_states = ggml_gelu_inplace(ctx, hidden_states); + hidden_states = glu.forward(mctx, hidden_states); + + ggml_tensor *output = ggml_new_tensor_2d(ctx, hidden_states->type, hidden_states->ne[0], hidden_states->ne[1] + 2); + + // concat (boi, x, eoi) + ggml_tensor *boi_view = ggml_cpy(ctx, boi, ggml_view_1d(ctx, output, hidden_states->ne[0], 0)); + ggml_tensor *hidden_states_view = + ggml_cpy(ctx, hidden_states, + ggml_view_2d(ctx, output, hidden_states->ne[0], hidden_states->ne[1], output->nb[1], output->nb[1])); + ggml_tensor *eoi_view = + ggml_cpy(ctx, eoi, ggml_view_1d(ctx, output, hidden_states->ne[0], (hidden_states->ne[1] + 1) * output->nb[1])); + ggml_build_forward_expand(mctx->gf, boi_view); + ggml_build_forward_expand(mctx->gf, hidden_states_view); + ggml_build_forward_expand(mctx->gf, eoi_view); + + output = ggml_scale_inplace(ctx, output, 1.f / scaling_factor); + + return output; +} + +ggml_tensor *ChatGLM4VModel::forward_embeddings(ModelContext *mctx, ggml_tensor *input_ids, ggml_tensor *images, + const std::vector &input_ids_vec, int n_past) const { + ggml_context *ctx = mctx->ctx_b.get(); + + ggml_tensor *text_emb = word_embeddings.forward(mctx, input_ids); + + if (!(n_past == 0 && images)) { + return text_emb; + } + + CHATGLM_CHECK(images->ne[0] == images->ne[1] && images->ne[2] == 3); + + const int vision_begin = + std::find(input_ids_vec.begin(), input_ids_vec.end(), config.boi_token_id) - input_ids_vec.begin(); + const int vision_end = + std::find(input_ids_vec.begin(), input_ids_vec.end(), config.eoi_token_id) - input_ids_vec.begin() + 1; + CHATGLM_CHECK(vision_begin < (int)input_ids_vec.size() && vision_end <= (int)input_ids_vec.size() && + vision_begin + 3 == vision_end); + + ggml_tensor *vision_emb = vision.forward(mctx, images); + + const int text_tokens = input_ids->ne[0]; + const int total_tokens = text_tokens - 1 + num_vision_tokens(); + + ggml_tensor *embeddings = ggml_new_tensor_2d(ctx, GGML_TYPE_F32, config.hidden_size, total_tokens); + // before boi + ggml_tensor *text_emb0_view = + ggml_cpy(ctx, ggml_view_2d(ctx, text_emb, config.hidden_size, vision_begin, text_emb->nb[1], 0), + ggml_view_2d(ctx, embeddings, config.hidden_size, vision_begin, embeddings->nb[1], 0)); + // vision tokens + ggml_tensor *vision_emb_view = ggml_cpy(ctx, vision_emb, + ggml_view_2d(ctx, embeddings, config.hidden_size, vision_emb->ne[1], + embeddings->nb[1], vision_begin * embeddings->nb[1])); + // after eoi + ggml_tensor *text_emb1_view = + ggml_cpy(ctx, + ggml_view_2d(ctx, text_emb, config.hidden_size, text_tokens - vision_end, text_emb->nb[1], + vision_end * text_emb->nb[1]), + ggml_view_2d(ctx, embeddings, config.hidden_size, text_tokens - vision_end, embeddings->nb[1], + (total_tokens - (text_tokens - vision_end)) * embeddings->nb[1])); + + ggml_build_forward_expand(mctx->gf, text_emb0_view); + ggml_build_forward_expand(mctx->gf, vision_emb_view); + ggml_build_forward_expand(mctx->gf, text_emb1_view); + + return embeddings; +} + +void ChatGLM4VModel::set_graph_inputs(ggml_cgraph *gf, const std::vector &input_ids, + const std::optional &image, int n_past, int n_ctx) const { + // set position_ids + ggml_tensor *position_ids = ggml_graph_get_tensor(gf, "position_ids"); + if (position_ids) { + std::vector position_ids_buf(position_ids->ne[0]); + const auto vision_idx = + std::find(input_ids.begin(), input_ids.end(), config.boi_token_id) - input_ids.begin() + 1; + if (n_past == 0 && vision_idx < (int)input_ids.size()) { + std::iota(position_ids_buf.begin(), position_ids_buf.begin() + vision_idx, 0); + std::fill(position_ids_buf.begin() + vision_idx, + position_ids_buf.begin() + vision_idx + num_vision_tokens(), vision_idx); + std::iota(position_ids_buf.begin() + vision_idx + num_vision_tokens(), position_ids_buf.end(), + vision_idx + 1); + } else { + const int n_past_text = (n_past > 0) ? input_ids.size() - 1 : 0; + std::iota(position_ids_buf.begin(), position_ids_buf.end(), n_past_text); + } + ggml_backend_tensor_set(position_ids, position_ids_buf.data(), 0, position_ids_buf.size() * sizeof(int)); + } + + // set image + ggml_tensor *image_tensor = ggml_graph_get_tensor(gf, "image"); + if (image_tensor) { + // resize + Image src_resized = image->resize(config.vision.image_size, config.vision.image_size); + // to float, normalize, channel first + std::vector pixels_f32(src_resized.pixels.size()); + const size_t num_pixels = src_resized.height * src_resized.width; + for (size_t i = 0; i < num_pixels; i++) { + pixels_f32[0 * num_pixels + i] = + (src_resized.pixels[i * src_resized.channels + 0] / 255.f - 0.48145466f) / 0.26862954f; + pixels_f32[1 * num_pixels + i] = + (src_resized.pixels[i * src_resized.channels + 1] / 255.f - 0.45782750f) / 0.26130258f; + pixels_f32[2 * num_pixels + i] = + (src_resized.pixels[i * src_resized.channels + 2] / 255.f - 0.40821073f) / 0.27577711f; + } + // copy to tensor + ggml_backend_tensor_set(image_tensor, pixels_f32.data(), 0, ggml_nbytes(image_tensor)); + } +} + +int ChatGLM4VForCausalLM::count_tokens(const std::vector &input_ids, const std::optional &image) const { + int token_cnt = input_ids.size(); + if (image) { + token_cnt += transformer.num_vision_tokens() - 1; + } + return token_cnt; +} + +void ChatGLM4VForCausalLM::load_state_dict(const StateDict &sd) { + alloc_weight_context(sd.buf.get()); + + auto self_sd = state_dict(); + ChatGLM2ForCausalLM::load_state_dict(mctx_.get(), self_sd, sd); +} + +StateDict ChatGLM4VForCausalLM::state_dict() const { + StateDict sd; + + // vision + sd.kv.emplace("transformer.vision.patch_embedding.cls_embedding", transformer.vision.patch_embedding.cls_embedding); + sd.kv.emplace("transformer.vision.patch_embedding.proj.weight", transformer.vision.patch_embedding.proj.weight); + sd.kv.emplace("transformer.vision.patch_embedding.proj.bias", transformer.vision.patch_embedding.proj.bias); + sd.kv.emplace("transformer.vision.patch_embedding.position_embedding.weight", + transformer.vision.patch_embedding.position_embedding.weight); + + for (size_t i = 0; i < transformer.vision.transformer.layers.size(); i++) { + const std::string prefix = "transformer.vision.transformer.layers." + std::to_string(i) + '.'; + sd.kv.emplace(prefix + "input_layernorm.weight", + transformer.vision.transformer.layers[i].input_layernorm.weight); + sd.kv.emplace(prefix + "input_layernorm.bias", transformer.vision.transformer.layers[i].input_layernorm.bias); + sd.kv.emplace(prefix + "attention.query_key_value.weight", + transformer.vision.transformer.layers[i].attention.query_key_value.weight); + sd.kv.emplace(prefix + "attention.query_key_value.bias", + transformer.vision.transformer.layers[i].attention.query_key_value.bias); + sd.kv.emplace(prefix + "attention.dense.weight", + transformer.vision.transformer.layers[i].attention.dense.weight); + sd.kv.emplace(prefix + "attention.dense.bias", transformer.vision.transformer.layers[i].attention.dense.bias); + sd.kv.emplace(prefix + "mlp.fc1.weight", transformer.vision.transformer.layers[i].mlp.dense_h_to_4h.weight); + sd.kv.emplace(prefix + "mlp.fc1.bias", transformer.vision.transformer.layers[i].mlp.dense_h_to_4h.bias); + sd.kv.emplace(prefix + "mlp.fc2.weight", transformer.vision.transformer.layers[i].mlp.dense_4h_to_h.weight); + sd.kv.emplace(prefix + "mlp.fc2.bias", transformer.vision.transformer.layers[i].mlp.dense_4h_to_h.bias); + sd.kv.emplace(prefix + "post_attention_layernorm.weight", + transformer.vision.transformer.layers[i].post_attention_layernorm.weight); + sd.kv.emplace(prefix + "post_attention_layernorm.bias", + transformer.vision.transformer.layers[i].post_attention_layernorm.bias); + } + sd.kv.emplace("transformer.vision.conv.weight", transformer.vision.conv.weight); + sd.kv.emplace("transformer.vision.conv.bias", transformer.vision.conv.bias); + sd.kv.emplace("transformer.vision.linear_proj.linear_proj.weight", transformer.vision.linear_proj.weight); + sd.kv.emplace("transformer.vision.linear_proj.norm1.weight", transformer.vision.norm1.weight); + sd.kv.emplace("transformer.vision.linear_proj.norm1.bias", transformer.vision.norm1.bias); + sd.kv.emplace("transformer.vision.linear_proj.gate_proj.weight", transformer.vision.glu.gate_proj.weight); + sd.kv.emplace("transformer.vision.linear_proj.dense_h_to_4h.weight", transformer.vision.glu.up_proj.weight); + sd.kv.emplace("transformer.vision.linear_proj.dense_4h_to_h.weight", transformer.vision.glu.down_proj.weight); + sd.kv.emplace("transformer.vision.boi", transformer.vision.boi); + sd.kv.emplace("transformer.vision.eoi", transformer.vision.eoi); + + // text + sd.kv.emplace("transformer.embedding.word_embeddings.weight", transformer.word_embeddings.weight); + for (int i = 0; i < config.num_hidden_layers; i++) { + const std::string layer_prefix = "transformer.encoder.layers." + std::to_string(i) + '.'; + sd.kv.emplace(layer_prefix + "input_layernorm.weight", transformer.layers[i].input_layernorm.weight); + sd.kv.emplace(layer_prefix + "self_attention.query_key_value.weight", + transformer.layers[i].attention.query_key_value.weight); + sd.kv.emplace(layer_prefix + "self_attention.query_key_value.bias", + transformer.layers[i].attention.query_key_value.bias); + sd.kv.emplace(layer_prefix + "self_attention.dense.weight", transformer.layers[i].attention.dense.weight); + sd.kv.emplace(layer_prefix + "post_attention_layernorm.weight", + transformer.layers[i].post_attention_layernorm.weight); + sd.kv.emplace(layer_prefix + "mlp.gate_proj.weight", transformer.layers[i].mlp.gate_proj.weight); + sd.kv.emplace(layer_prefix + "mlp.up_proj.weight", transformer.layers[i].mlp.up_proj.weight); + // for compatibility + sd.kv.emplace(layer_prefix + "mlp.dense_4h_to_h.weight", transformer.layers[i].mlp.down_proj.weight); + } + sd.kv.emplace("transformer.encoder.final_layernorm.weight", transformer.final_layernorm.weight); + sd.kv.emplace("transformer.output_layer.weight", lm_head.weight); + return sd; +} + // ===== pipeline ===== Pipeline::Pipeline(const std::string &path, int max_length) { @@ -1776,9 +2056,9 @@ Pipeline::Pipeline(const std::string &path, int max_length) { // load config ModelConfig config; if (version == 1) { - config = ModelConfig(model_type, loader.read_basic(), 1e-5f, 10000.f, 0); + config = ModelConfig(model_type, loader.read_basic(), 1e-5f, 10000.f, 0); } else if (version == 2) { - config = ModelConfig(model_type, loader.read_basic()); + config = ModelConfig(model_type, loader.read_basic()); } else { CHATGLM_THROW << "only support version 1 or 2 for now but got " << version; } @@ -1798,9 +2078,9 @@ Pipeline::Pipeline(const std::string &path, int max_length) { // load config ModelConfig config; if (version == 1) { - config = ModelConfig(model_type, loader.read_basic(), 1e-5f, 10000.f, 0); + config = ModelConfig(model_type, loader.read_basic(), 1e-5f, 10000.f, 0); } else if (version == 2) { - config = ModelConfig(model_type, loader.read_basic()); + config = ModelConfig(model_type, loader.read_basic()); } else { CHATGLM_THROW << "only support version 1 or 2 for now but got " << version; } @@ -1825,21 +2105,31 @@ Pipeline::Pipeline(const std::string &path, int max_length) { // load model StateDict sd = loader.read_state_dict(); model->load_state_dict(sd); - } else if (model_type == ModelType::CHATGLM4) { + } else if (model_type == ModelType::CHATGLM4 || model_type == ModelType::CHATGLM4V) { // load config CHATGLM_CHECK(version == 2) << "only support version 2 for now but got " << version; - ModelConfig config(model_type, loader.read_basic()); + ModelConfig config(model_type, loader.read_basic()); _update_config_max_length(config, max_length); + if (model_type == ModelType::CHATGLM4V) { + config.vision = VisionModelConfig(loader.read_basic()); + } + // load tokenizer int vocab_text_size = loader.read_basic(); std::string vocab_text = loader.read_string(vocab_text_size); auto chatglm4_tokenizer = std::make_unique(vocab_text); config.extra_eos_token_ids = {chatglm4_tokenizer->observation_token_id, chatglm4_tokenizer->user_token_id}; + config.boi_token_id = chatglm4_tokenizer->boi_token_id; + config.eoi_token_id = chatglm4_tokenizer->eoi_token_id; tokenizer = std::move(chatglm4_tokenizer); // load model - model = std::make_unique(config); + if (model_type == ModelType::CHATGLM4V) { + model = std::make_unique(config); + } else { + model = std::make_unique(config); + } StateDict sd = loader.read_state_dict(); model->load_state_dict(sd); } else { @@ -1847,9 +2137,9 @@ Pipeline::Pipeline(const std::string &path, int max_length) { } } -std::vector Pipeline::generate(const std::vector &input_ids, const GenerationConfig &gen_config, - BaseStreamer *streamer) const { - std::vector output_ids = model->generate(input_ids, gen_config, streamer); +std::vector Pipeline::generate(const std::vector &input_ids, const std::optional &image, + const GenerationConfig &gen_config, BaseStreamer *streamer) const { + std::vector output_ids = model->generate(input_ids, image, gen_config, streamer); std::vector new_output_ids(output_ids.begin() + input_ids.size(), output_ids.end()); return new_output_ids; } @@ -1857,15 +2147,18 @@ std::vector Pipeline::generate(const std::vector &input_ids, const Gen std::string Pipeline::generate(const std::string &prompt, const GenerationConfig &gen_config, BaseStreamer *streamer) const { std::vector input_ids = tokenizer->encode(prompt, gen_config.max_context_length); - std::vector new_output_ids = generate(input_ids, gen_config, streamer); + std::vector new_output_ids = generate(input_ids, std::nullopt, gen_config, streamer); std::string output = tokenizer->decode(new_output_ids); return output; } ChatMessage Pipeline::chat(const std::vector &messages, const GenerationConfig &gen_config, BaseStreamer *streamer) const { + auto it = + std::find_if(messages.begin(), messages.end(), [](const ChatMessage &msg) { return msg.image.has_value(); }); + const std::optional image = (it != messages.end()) ? it->image : std::nullopt; std::vector input_ids = tokenizer->apply_chat_template(messages, gen_config.max_context_length); - std::vector new_output_ids = generate(input_ids, gen_config, streamer); + std::vector new_output_ids = generate(input_ids, image, gen_config, streamer); ChatMessage output = tokenizer->decode_message(new_output_ids); return output; } diff --git a/chatglm.h b/chatglm.h index f42be536..6f0d5e37 100644 --- a/chatglm.h +++ b/chatglm.h @@ -41,12 +41,13 @@ enum class ModelType { CHATGLM2 = 2, CHATGLM3 = 3, CHATGLM4 = 4, + CHATGLM4V = 1004, }; std::string to_string(ModelType model_type); // For compatibility -struct ConfigRecordV1 { +struct ModelConfigRecordV1 { // common attributes ggml_type dtype; int vocab_size; @@ -64,12 +65,25 @@ struct ConfigRecordV1 { }; // For compatibility -struct ConfigRecordV1GQA : public ConfigRecordV1 { +struct ModelConfigRecordV1GQA { + // ModelConfigRecordV1 + ggml_type dtype; + int vocab_size; + int hidden_size; + int num_attention_heads; + int num_hidden_layers; + int intermediate_size; + int max_length; + int bos_token_id; + int eos_token_id; + int pad_token_id; + int sep_token_id; + // GQA int num_key_value_heads; }; // TODO: use json to serialize config -struct ConfigRecordV2 { +struct ModelConfigRecordV2 { ggml_type dtype; int vocab_size; int hidden_size; @@ -99,10 +113,64 @@ enum class RopeType { }; enum class AttentionMaskType { + BIDIRECTIONAL, CAUSAL, CHATGLM, }; +struct VisionModelConfigRecord { + ggml_type dtype; + int hidden_size; + int image_size; + int in_channels; + int intermediate_size; + float norm_eps; + int num_attention_heads; + int num_hidden_layers; + int num_positions; + int patch_size; + float scaling_factor; +}; + +struct VisionModelConfig { + ggml_type dtype; + ActivationType hidden_act; + int hidden_size; + int image_size; + int in_channels; + int intermediate_size; + float norm_eps; + int num_attention_heads; + int num_hidden_layers; + int num_positions; + int patch_size; + float scaling_factor; + + VisionModelConfig() = default; + + VisionModelConfig(ggml_type dtype, ActivationType hidden_act, int hidden_size, int image_size, int in_channels, + int intermediate_size, float norm_eps, int num_attention_heads, int num_hidden_layers, + int num_positions, int patch_size, float scaling_factor) + : dtype(dtype), hidden_act(hidden_act), hidden_size(hidden_size), image_size(image_size), + in_channels(in_channels), intermediate_size(intermediate_size), norm_eps(norm_eps), + num_attention_heads(num_attention_heads), num_hidden_layers(num_hidden_layers), num_positions(num_positions), + patch_size(patch_size), scaling_factor(scaling_factor) {} + + VisionModelConfig(const VisionModelConfigRecord &rec) + : VisionModelConfig(rec.dtype, ActivationType::GELU, rec.hidden_size, rec.image_size, rec.in_channels, + rec.intermediate_size, rec.norm_eps, rec.num_attention_heads, rec.num_hidden_layers, + rec.num_positions, rec.patch_size, rec.scaling_factor) {} + + friend std::ostream &operator<<(std::ostream &os, const VisionModelConfig &self) { + return os << "VisionModelConfig(dtype=" << self.dtype << ", hidden_act=" << (int)self.hidden_act + << ", hidden_size=" << self.hidden_size << ", image_size=" << self.image_size + << ", in_channels=" << self.in_channels << ", intermediate_size=" << self.intermediate_size + << ", norm_eps=" << self.norm_eps << ", num_attention_heads=" << self.num_attention_heads + << ", num_hidden_layers=" << self.num_hidden_layers << ", num_positions=" + << ", patch_size=" << self.patch_size << ", scaling_factor=" << self.scaling_factor << ")"; + } +}; + // Should save kv record of ModelConfig in the future class ModelConfig { public: @@ -111,13 +179,15 @@ class ModelConfig { ModelConfig(ModelType model_type, ggml_type dtype, int vocab_size, int hidden_size, int num_attention_heads, int num_key_value_heads, int num_hidden_layers, int intermediate_size, float norm_eps, float rope_theta, int num_virtual_tokens, int max_length, int bos_token_id, int eos_token_id, int pad_token_id, - int sep_token_id, std::vector extra_eos_token_ids) + int sep_token_id, int boi_token_id, int eoi_token_id, std::vector extra_eos_token_ids, + const VisionModelConfig &vision) : model_type(model_type), dtype(dtype), vocab_size(vocab_size), hidden_size(hidden_size), num_attention_heads(num_attention_heads), num_key_value_heads(num_key_value_heads), num_hidden_layers(num_hidden_layers), intermediate_size(intermediate_size), norm_eps(norm_eps), rope_theta(rope_theta), num_virtual_tokens(num_virtual_tokens), max_length(max_length), bos_token_id(bos_token_id), eos_token_id(eos_token_id), pad_token_id(pad_token_id), - sep_token_id(sep_token_id), extra_eos_token_ids(std::move(extra_eos_token_ids)) { + sep_token_id(sep_token_id), boi_token_id(boi_token_id), eoi_token_id(eoi_token_id), + extra_eos_token_ids(std::move(extra_eos_token_ids)), vision(vision) { if (model_type == ModelType::CHATGLM) { hidden_act = ActivationType::GELU; use_qkv_bias = true; @@ -137,25 +207,25 @@ class ModelConfig { } } - ModelConfig(ModelType model_type, const ConfigRecordV1 &rec, float norm_eps, float rope_theta, + ModelConfig(ModelType model_type, const ModelConfigRecordV1 &rec, float norm_eps, float rope_theta, int num_virtual_tokens) : ModelConfig(model_type, rec.dtype, rec.vocab_size, rec.hidden_size, rec.num_attention_heads, rec.num_attention_heads, rec.num_hidden_layers, rec.intermediate_size, norm_eps, rope_theta, num_virtual_tokens, rec.max_length, rec.bos_token_id, rec.eos_token_id, rec.pad_token_id, - rec.sep_token_id, {}) {} + rec.sep_token_id, -1, -1, {}, {}) {} - ModelConfig(ModelType model_type, const ConfigRecordV1GQA &rec, float norm_eps, float rope_theta, + ModelConfig(ModelType model_type, const ModelConfigRecordV1GQA &rec, float norm_eps, float rope_theta, int num_virtual_tokens) : ModelConfig(model_type, rec.dtype, rec.vocab_size, rec.hidden_size, rec.num_attention_heads, rec.num_key_value_heads, rec.num_hidden_layers, rec.intermediate_size, norm_eps, rope_theta, num_virtual_tokens, rec.max_length, rec.bos_token_id, rec.eos_token_id, rec.pad_token_id, - rec.sep_token_id, {}) {} + rec.sep_token_id, -1, -1, {}, {}) {} - ModelConfig(ModelType model_type, const ConfigRecordV2 &rec) + ModelConfig(ModelType model_type, const ModelConfigRecordV2 &rec) : ModelConfig(model_type, rec.dtype, rec.vocab_size, rec.hidden_size, rec.num_attention_heads, rec.num_key_value_heads, rec.num_hidden_layers, rec.intermediate_size, rec.norm_eps, rec.rope_theta, rec.num_virtual_tokens, rec.max_length, -1, rec.eos_token_id, rec.pad_token_id, - -1, {}) {} + -1, -1, -1, {}, {}) {} std::string model_type_name() const { return to_string(model_type); } @@ -176,7 +246,7 @@ class ModelConfig { for (size_t i = 0; i < self.extra_eos_token_ids.size(); i++) { os << (i > 0 ? ", " : "") << self.extra_eos_token_ids[i]; } - return os << "})"; + return os << "}, vision=" << self.vision << ")"; } public: @@ -203,7 +273,10 @@ class ModelConfig { int eos_token_id; int pad_token_id; int sep_token_id; + int boi_token_id; + int eoi_token_id; std::vector extra_eos_token_ids; + VisionModelConfig vision; }; struct FunctionMessage { @@ -248,9 +321,55 @@ struct ToolCallMessage { } }; +struct Image { + size_t width = 0; + size_t height = 0; + size_t channels = 0; + std::vector pixels; + + Image() = default; + + Image(size_t width, size_t height, size_t channels) + : width(width), height(height), channels(channels), pixels(width * height * channels) {} + + Image(size_t width, size_t height, size_t channels, uint8_t *data) + : width(width), height(height), channels(channels), pixels(data, data + width * height * channels) {} + + Image(const Image &other) = default; + + Image(Image &&other) { *this = std::move(other); } + + Image &operator=(const Image &other) = default; + + Image &operator=(Image &&other) { + width = other.width; + height = other.height; + channels = other.channels; + pixels = std::move(other.pixels); + other.clear(); + return *this; + } + + static Image open(const std::string &path); + + Image resize(size_t new_width, size_t new_height) const; + + bool empty() const { return pixels.empty(); } + + void clear() { + width = height = channels = 0; + pixels.clear(); + } + + friend std::ostream &operator<<(std::ostream &os, const Image &self) { + return os << "Image(mode=RGB, size=" << self.width << "x" << self.height << ")"; + } +}; + struct ChatMessage { std::string role; std::string content; + std::optional image; std::vector tool_calls; static const std::string ROLE_USER; @@ -259,12 +378,18 @@ struct ChatMessage { static const std::string ROLE_OBSERVATION; ChatMessage() = default; - ChatMessage(std::string role, std::string content, std::vector tool_calls = {}) - : role(std::move(role)), content(std::move(content)), tool_calls(std::move(tool_calls)) {} + + ChatMessage(std::string role, std::string content, std::optional image = std::nullopt, + std::vector tool_calls = {}) + : role(std::move(role)), content(std::move(content)), image(std::move(image)), + tool_calls(std::move(tool_calls)) {} friend std::ostream &operator<<(std::ostream &os, const ChatMessage &self) { - os << "ChatMessage(role=" << std::quoted(self.role) << ", content=" << std::quoted(self.content) - << ", tool_calls=["; + os << "ChatMessage(role=" << std::quoted(self.role) << ", content=" << std::quoted(self.content); + if (self.image.has_value()) { + os << ", image=" << *self.image; + } + os << ", tool_calls=["; for (size_t i = 0; i < self.tool_calls.size(); i++) { os << (i > 0 ? ", " : "") << self.tool_calls[i]; } @@ -329,8 +454,6 @@ struct no_init { }; struct ModelContext { - ggml_type dtype; - std::vector> compute_meta; unique_ggml_context_t ctx_w; // weight @@ -344,26 +467,32 @@ struct ModelContext { unique_ggml_backend_buffer_t buf_w; unique_ggml_backend_buffer_t buf_kv; - ModelContext(ggml_type dtype); + ModelContext(); }; class Embedding { public: - Embedding() : weight(nullptr) {} - Embedding(ModelContext *mctx, int num_embeddings, int embedding_dim) - : weight(ggml_new_tensor_2d(mctx->ctx_w.get(), mctx->dtype, embedding_dim, num_embeddings)) {} + Embedding() = default; + + Embedding(ModelContext *mctx, ggml_type dtype, int num_embeddings, int embedding_dim) + : weight(ggml_new_tensor_2d(mctx->ctx_w.get(), dtype, embedding_dim, num_embeddings)) {} + + int num_embeddings() const { return weight->ne[1]; } + + int embedding_dim() const { return weight->ne[0]; } ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input) const; public: - ggml_tensor *weight; + ggml_tensor *weight = nullptr; }; class Linear { public: - Linear() : weight(nullptr), bias(nullptr) {} - Linear(ModelContext *mctx, int in_features, int out_features, bool use_bias = true) - : weight(ggml_new_tensor_2d(mctx->ctx_w.get(), mctx->dtype, in_features, out_features)), + Linear() = default; + + Linear(ModelContext *mctx, ggml_type dtype, int in_features, int out_features, bool use_bias = true) + : weight(ggml_new_tensor_2d(mctx->ctx_w.get(), dtype, in_features, out_features)), bias(use_bias ? ggml_new_tensor_1d(mctx->ctx_w.get(), GGML_TYPE_F32, out_features) : nullptr) {} int in_features() const { return weight->ne[0]; } @@ -372,46 +501,47 @@ class Linear { ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input) const; public: - ggml_tensor *weight; // [out_features, in_features] - ggml_tensor *bias; // [out_features] + ggml_tensor *weight = nullptr; // [out_features, in_features] + ggml_tensor *bias = nullptr; // [out_features] }; class LayerNorm { public: LayerNorm() = default; - LayerNorm(ModelContext *mctx, int normalized_shape, bool inplace = true, float eps = 1e-5f) + + LayerNorm(ModelContext *mctx, int normalized_shape, float eps = 1e-5f) : weight(ggml_new_tensor_1d(mctx->ctx_w.get(), GGML_TYPE_F32, normalized_shape)), - bias(ggml_new_tensor_1d(mctx->ctx_w.get(), GGML_TYPE_F32, normalized_shape)), inplace(inplace), eps(eps) {} + bias(ggml_new_tensor_1d(mctx->ctx_w.get(), GGML_TYPE_F32, normalized_shape)), eps(eps) {} ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input) const; public: - ggml_tensor *weight; // [normalized_shape] - ggml_tensor *bias; // [normalized_shape] - bool inplace; - float eps; + ggml_tensor *weight = nullptr; // [normalized_shape] + ggml_tensor *bias = nullptr; // [normalized_shape] + float eps = 0.f; }; class RMSNorm { public: RMSNorm() = default; - RMSNorm(ModelContext *mctx, int normalized_shape, bool inplace = true, float eps = 1e-5f) - : weight(ggml_new_tensor_1d(mctx->ctx_w.get(), GGML_TYPE_F32, normalized_shape)), inplace(inplace), eps(eps) {} + + RMSNorm(ModelContext *mctx, int normalized_shape, float eps = 1e-5f) + : weight(ggml_new_tensor_1d(mctx->ctx_w.get(), GGML_TYPE_F32, normalized_shape)), eps(eps) {} ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input) const; public: - ggml_tensor *weight; // [normalized_shape] - bool inplace; - float eps; + ggml_tensor *weight = nullptr; // [normalized_shape] + float eps = 0.f; }; class BasicMLP { public: BasicMLP() = default; - BasicMLP(ModelContext *mctx, int hidden_size, int intermediate_size, ActivationType hidden_act) - : dense_h_to_4h(mctx, hidden_size, intermediate_size), dense_4h_to_h(mctx, intermediate_size, hidden_size), - hidden_act(hidden_act) {} + + BasicMLP(ModelContext *mctx, ggml_type dtype, int hidden_size, int intermediate_size, ActivationType hidden_act) + : dense_h_to_4h(mctx, dtype, hidden_size, intermediate_size), + dense_4h_to_h(mctx, dtype, intermediate_size, hidden_size), hidden_act(hidden_act) {} ggml_tensor *forward(ModelContext *mctx, ggml_tensor *hidden_states) const; @@ -424,9 +554,11 @@ class BasicMLP { class BasicGLU { public: BasicGLU() = default; - BasicGLU(ModelContext *mctx, int hidden_size, int intermediate_size, ActivationType hidden_act) - : gate_proj(mctx, hidden_size, intermediate_size, false), up_proj(mctx, hidden_size, intermediate_size, false), - down_proj(mctx, intermediate_size, hidden_size, false), hidden_act(hidden_act) {} + + BasicGLU(ModelContext *mctx, ggml_type dtype, int hidden_size, int intermediate_size, ActivationType hidden_act) + : gate_proj(mctx, dtype, hidden_size, intermediate_size, false), + up_proj(mctx, dtype, hidden_size, intermediate_size, false), + down_proj(mctx, dtype, intermediate_size, hidden_size, false), hidden_act(hidden_act) {} ggml_tensor *forward(ModelContext *mctx, ggml_tensor *hidden_states) const; @@ -440,19 +572,23 @@ class BasicGLU { class BasicAttention { public: BasicAttention() = default; - BasicAttention(ModelContext *mctx, int hidden_size, int num_attention_heads, int num_key_value_heads, - int max_length, bool use_qkv_bias, bool use_dense_bias, bool interleaved_qkv, RopeType rope_type, - float rope_theta, AttentionMaskType attn_mask_type, int num_virtual_tokens) + + BasicAttention(ModelContext *mctx, ggml_type dtype, int hidden_size, int num_attention_heads, + int num_key_value_heads, int max_length, bool use_qkv_bias, bool use_dense_bias, + bool interleaved_qkv, RopeType rope_type, float rope_theta, AttentionMaskType attn_mask_type, + int num_virtual_tokens, bool use_cache) : num_attention_heads(num_attention_heads), num_key_value_heads(num_key_value_heads), interleaved_qkv(interleaved_qkv), rope_type(rope_type), rope_theta(rope_theta), attn_mask_type(attn_mask_type), num_virtual_tokens(num_virtual_tokens), - query_key_value(mctx, hidden_size, + query_key_value(mctx, dtype, hidden_size, hidden_size + 2 * (hidden_size / num_attention_heads) * num_key_value_heads, use_qkv_bias), - dense(mctx, hidden_size, hidden_size, use_dense_bias), - k_cache(ggml_new_tensor_3d(mctx->ctx_kv.get(), GGML_TYPE_F16, hidden_size / num_attention_heads, - max_length + num_virtual_tokens, num_key_value_heads)), - v_cache(ggml_new_tensor_3d(mctx->ctx_kv.get(), GGML_TYPE_F16, max_length + num_virtual_tokens, - hidden_size / num_attention_heads, num_key_value_heads)) {} + dense(mctx, dtype, hidden_size, hidden_size, use_dense_bias), + k_cache(use_cache ? ggml_new_tensor_3d(mctx->ctx_kv.get(), GGML_TYPE_F32, hidden_size / num_attention_heads, + max_length + num_virtual_tokens, num_key_value_heads) + : nullptr), + v_cache(use_cache ? ggml_new_tensor_3d(mctx->ctx_kv.get(), GGML_TYPE_F32, max_length + num_virtual_tokens, + hidden_size / num_attention_heads, num_key_value_heads) + : nullptr) {} ggml_tensor *forward(ModelContext *mctx, ggml_tensor *hidden_states, ggml_tensor *attention_mask, ggml_tensor *position_ids, int n_past) const; @@ -467,23 +603,24 @@ class BasicAttention { int num_virtual_tokens; Linear query_key_value; Linear dense; - ggml_tensor *k_cache; // [#kvh, s, d] - ggml_tensor *v_cache; // [#kvh, d, s] + ggml_tensor *k_cache = nullptr; // [#kvh, s, d] + ggml_tensor *v_cache = nullptr; // [#kvh, d, s] }; template class BasicBlock { public: BasicBlock() = default; - BasicBlock(ModelContext *mctx, int hidden_size, int num_attention_heads, int num_key_value_heads, + BasicBlock(ModelContext *mctx, ggml_type dtype, int hidden_size, int num_attention_heads, int num_key_value_heads, int intermediate_size, int max_length, float norm_eps, ActivationType hidden_act, bool use_qkv_bias, bool use_dense_bias, bool interleaved_qkv, RopeType rope_type, float rope_theta, - AttentionMaskType attn_mask_type, int num_virtual_tokens) - : input_layernorm(mctx, hidden_size, false, norm_eps), - attention(mctx, hidden_size, num_attention_heads, num_key_value_heads, max_length, use_qkv_bias, - use_dense_bias, interleaved_qkv, rope_type, rope_theta, attn_mask_type, num_virtual_tokens), - post_attention_layernorm(mctx, hidden_size, false, norm_eps), - mlp(mctx, hidden_size, intermediate_size, hidden_act) {} + AttentionMaskType attn_mask_type, int num_virtual_tokens, bool use_cache) + : input_layernorm(mctx, hidden_size, norm_eps), + attention(mctx, dtype, hidden_size, num_attention_heads, num_key_value_heads, max_length, use_qkv_bias, + use_dense_bias, interleaved_qkv, rope_type, rope_theta, attn_mask_type, num_virtual_tokens, + use_cache), + post_attention_layernorm(mctx, hidden_size, norm_eps), + mlp(mctx, dtype, hidden_size, intermediate_size, hidden_act) {} ggml_tensor *forward(ModelContext *mctx, ggml_tensor *hidden_states, ggml_tensor *attention_mask, ggml_tensor *position_ids, int n_past) const { @@ -547,13 +684,16 @@ class BasicModel { : word_embeddings(word_embeddings), layers(std::move(layers)), final_layernorm(final_layernorm) {} BasicModel(ModelContext *mctx, const ModelConfig &config) - : word_embeddings(mctx, config.vocab_size, config.hidden_size), layers(build_layers(mctx, config)), - final_layernorm(mctx, config.hidden_size) {} + : word_embeddings(mctx, config.dtype, config.vocab_size, config.hidden_size), + layers(build_layers(mctx, config)), final_layernorm(mctx, config.hidden_size) {} - ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input_ids, int n_past) const { + ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input_ids, ggml_tensor *images, + const std::vector &input_ids_vec, int n_past) const { ggml_context *ctx = mctx->ctx_b.get(); - const int qlen = input_ids->ne[0]; + ggml_tensor *hidden_states = forward_embeddings(mctx, input_ids, images, input_ids_vec, n_past); + + const int qlen = hidden_states->ne[1]; const int kvlen = layers.front().attention.num_virtual_tokens + n_past + qlen; ggml_tensor *position_ids = pos_ids_alloc_(ctx, qlen); @@ -568,7 +708,6 @@ class BasicModel { ggml_set_input(attention_mask); } - ggml_tensor *hidden_states = word_embeddings.forward(mctx, input_ids); for (const auto &layer : layers) { hidden_states = layer.forward(mctx, hidden_states, attention_mask, position_ids, n_past); } @@ -577,9 +716,15 @@ class BasicModel { return hidden_states; } + virtual ggml_tensor *forward_embeddings(ModelContext *mctx, ggml_tensor *input_ids, ggml_tensor *images, + const std::vector &input_ids_vec, int n_past) const { + CHATGLM_CHECK(images == nullptr) << "unimplemented"; + return word_embeddings.forward(mctx, input_ids); + } + void load_prefix_cache(const ModelConfig &config, ggml_tensor *past_key_values) { // past_key_values: [l * 2, #h, v, d] - ModelContext mctx(config.dtype); + ModelContext mctx; ggml_tensor *backend_past_key_values = ggml_new_tensor(mctx.ctx_kv.get(), past_key_values->type, ggml_n_dims(past_key_values), past_key_values->ne); @@ -619,10 +764,11 @@ class BasicModel { std::vector layers; layers.reserve(config.num_hidden_layers); for (int layer_id = 0; layer_id < config.num_hidden_layers; layer_id++) { - layers.emplace_back(mctx, config.hidden_size, config.num_attention_heads, config.num_key_value_heads, - config.intermediate_size, config.max_length, config.norm_eps, config.hidden_act, - config.use_qkv_bias, config.use_dense_bias, config.interleaved_qkv, config.rope_type, - config.rope_theta, config.attn_mask_type, config.num_virtual_tokens); + layers.emplace_back(mctx, config.dtype, config.hidden_size, config.num_attention_heads, + config.num_key_value_heads, config.intermediate_size, config.max_length, + config.norm_eps, config.hidden_act, config.use_qkv_bias, config.use_dense_bias, + config.interleaved_qkv, config.rope_type, config.rope_theta, config.attn_mask_type, + config.num_virtual_tokens, true); } mctx->buf_kv = unique_ggml_backend_buffer_t(ggml_backend_alloc_ctx_tensors(mctx->ctx_kv.get(), mctx->backend.get())); @@ -785,18 +931,22 @@ class BaseModelForCausalLM { virtual void load_state_dict(const StateDict &sd) = 0; - virtual ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input_ids, int n_past, int n_ctx, - bool is_decoding) const = 0; + virtual ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input_ids, ggml_tensor *images, + const std::vector &input_ids_vec, int n_past, bool is_decoding) const = 0; + + virtual void set_graph_inputs(const std::vector &input_ids, const std::optional &image, int n_past, + int n_ctx) const = 0; - virtual void set_graph_inputs(int qlen, int n_past, int n_ctx) const = 0; + virtual int count_tokens(const std::vector &input_ids, const std::optional &image) const = 0; - ggml_tensor *forward_graph_compute(const std::vector &input_ids, int n_past, int n_ctx, bool is_decoding); + ggml_tensor *forward_graph_compute(const std::vector &input_ids, const std::optional &image, int n_past, + int n_ctx, bool is_decoding); - std::vector generate(const std::vector &input_ids, const GenerationConfig &gen_config, - BaseStreamer *streamer = nullptr); + std::vector generate(const std::vector &input_ids, const std::optional &image, + const GenerationConfig &gen_config, BaseStreamer *streamer = nullptr); - int generate_next_token(const std::vector &input_ids, const GenerationConfig &gen_config, int n_past, - int n_ctx); + int generate_next_token(const std::vector &input_ids, const std::optional &image, + const GenerationConfig &gen_config, int n_past, int n_ctx); // logits processor static void sampling_repetition_penalty(float *first, float *last, const std::vector &input_ids, @@ -820,28 +970,57 @@ class BasicModelForCausalLM : public BaseModelForCausalLM { protected: BasicModelForCausalLM(const ModelConfig &config) : BaseModelForCausalLM(config), transformer(mctx_.get(), config), - lm_head(mctx_.get(), config.hidden_size, config.vocab_size, false) { + lm_head(mctx_.get(), config.dtype, config.hidden_size, config.vocab_size, false) { if (config.tie_word_embeddings) { lm_head.weight = transformer.word_embeddings.weight; } } public: - ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input_ids, int n_past, int n_ctx, - bool is_decoding) const override { - ggml_tensor *transformer_outputs = transformer.forward(mctx, input_ids, n_past); + ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input_ids, ggml_tensor *images, + const std::vector &input_ids_vec, int n_past, bool is_decoding) const override { + ggml_tensor *transformer_outputs = transformer.forward(mctx, input_ids, images, input_ids_vec, n_past); // NOTE: only compute next token logits for decoding - if (is_decoding && input_ids->ne[0] > 1) { - transformer_outputs = - ggml_view_1d(mctx->ctx_b.get(), transformer_outputs, config.hidden_size, - (input_ids->ne[0] - 1) * config.hidden_size * ggml_element_size(transformer_outputs)); + if (is_decoding && transformer_outputs->ne[1] > 1) { + transformer_outputs = ggml_view_1d(mctx->ctx_b.get(), transformer_outputs, transformer_outputs->ne[0], + (transformer_outputs->ne[1] - 1) * transformer_outputs->nb[1]); } ggml_tensor *lm_logits = lm_head.forward(mctx, transformer_outputs); return lm_logits; } + void set_graph_inputs(const std::vector &input_ids, const std::optional &image, int n_past, + int n_ctx) const override { + transformer.set_graph_inputs(mctx_->gf, input_ids, image, n_past, n_ctx); + } + + int count_tokens(const std::vector &input_ids, const std::optional &image) const override { + CHATGLM_CHECK(!image) << "unimplemented"; + return input_ids.size(); + } + void load_prefix_cache(ggml_tensor *past_key_values) { transformer.load_prefix_cache(config, past_key_values); } + protected: + void alloc_weight_context(const ggml_backend_buffer_t sd_buf) const { + void *sd_buf_base = ggml_backend_buffer_get_base(sd_buf); + const size_t sd_buf_size = ggml_backend_buffer_get_size(sd_buf); + if (ggml_backend_is_cpu(mctx_->backend.get())) { + mctx_->buf_w = unique_ggml_backend_buffer_t(ggml_backend_cpu_buffer_from_ptr(sd_buf_base, sd_buf_size)); + } +#ifdef GGML_USE_METAL + else if (ggml_backend_is_metal(mctx_->backend.get())) { + const size_t max_size = ggml_get_max_tensor_size(mctx_->ctx_w.get()); + mctx_->buf_w = + unique_ggml_backend_buffer_t(ggml_backend_metal_buffer_from_ptr(sd_buf_base, sd_buf_size, max_size)); + } +#endif + else { + mctx_->buf_w = + unique_ggml_backend_buffer_t(ggml_backend_alloc_ctx_tensors(mctx_->ctx_w.get(), mctx_->backend.get())); + } + } + public: Model transformer; Linear lm_head; @@ -879,16 +1058,17 @@ class ChatGLMTokenizer : public BaseTokenizer { class GLMBlock : public BasicBlock { public: GLMBlock() = default; - GLMBlock(ModelContext *mctx, int hidden_size, int num_attention_heads, int num_key_value_heads, + + GLMBlock(ModelContext *mctx, ggml_type dtype, int hidden_size, int num_attention_heads, int num_key_value_heads, int intermediate_size, int max_length, float norm_eps, ActivationType hidden_act, bool use_qkv_bias, bool use_dense_bias, bool interleaved_qkv, RopeType rope_type, float rope_theta, - AttentionMaskType attn_mask_type, int num_virtual_tokens) - : BasicBlock(LayerNorm(mctx, hidden_size, false, norm_eps), - BasicAttention(mctx, hidden_size, num_attention_heads, num_attention_heads, max_length, + AttentionMaskType attn_mask_type, int num_virtual_tokens, bool use_cache) + : BasicBlock(LayerNorm(mctx, hidden_size, norm_eps), + BasicAttention(mctx, dtype, hidden_size, num_attention_heads, num_attention_heads, max_length, use_qkv_bias, use_dense_bias, interleaved_qkv, rope_type, rope_theta, - attn_mask_type, num_virtual_tokens), - LayerNorm(mctx, hidden_size, false, norm_eps), - BasicMLP(mctx, hidden_size, intermediate_size, hidden_act)), + attn_mask_type, num_virtual_tokens, use_cache), + LayerNorm(mctx, hidden_size, norm_eps), + BasicMLP(mctx, dtype, hidden_size, intermediate_size, hidden_act)), alpha(std::sqrt(2.f * 28)) {} ggml_tensor *forward(ModelContext *mctx, ggml_tensor *hidden_states, ggml_tensor *attention_mask, @@ -898,18 +1078,22 @@ class GLMBlock : public BasicBlock { float alpha; }; -using ChatGLMModel = BasicModel; +class ChatGLMModel : public BasicModel { + public: + ChatGLMModel() = default; + + ChatGLMModel(ModelContext *mctx, const ModelConfig &config) : BasicModel(mctx, config) {} + + void set_graph_inputs(ggml_cgraph *gf, const std::vector &input_ids, const std::optional &image, + int n_past, int n_ctx) const; +}; class ChatGLMForCausalLM : public BasicModelForCausalLM { public: - ChatGLMForCausalLM(const ModelConfig &config); + ChatGLMForCausalLM(const ModelConfig &config) : BasicModelForCausalLM(config) {} void load_state_dict(const StateDict &sd) override; - void set_graph_inputs(int qlen, int n_past, int n_ctx) const override; - - static void set_graph_inputs(ggml_cgraph *gf, int qlen, int n_past, int n_ctx); - private: StateDict state_dict() const; }; @@ -942,17 +1126,23 @@ class ChatGLM2Tokenizer : public BaseTokenizer { using GLM2Block = BasicBlock; -using ChatGLM2Model = BasicModel; +class ChatGLM2Model : public BasicModel { + public: + ChatGLM2Model() = default; + + ChatGLM2Model(ModelContext *mctx, const ModelConfig &config) : BasicModel(mctx, config) {} + + void set_graph_inputs(ggml_cgraph *gf, const std::vector &input_ids, const std::optional &image, + int n_past, int n_ctx) const; +}; class ChatGLM2ForCausalLM : public BasicModelForCausalLM { public: - ChatGLM2ForCausalLM(const ModelConfig &config); + ChatGLM2ForCausalLM(const ModelConfig &config) : BasicModelForCausalLM(config) {} void load_state_dict(const StateDict &sd) override; - void set_graph_inputs(int qlen, int n_past, int n_ctx) const override; - - static void set_graph_inputs(ggml_cgraph *gf, int qlen, int n_past, int n_ctx); + static void load_state_dict(ModelContext *mctx, StateDict &dst, const StateDict &src); private: StateDict state_dict() const; @@ -1052,7 +1242,7 @@ class ChatGLM4Tokenizer : public BaseTokenizer { public: TiktokenCoreBPE core_bpe; - // int eos_token_id; + int eos_token_id; // int mask_token_id; int gmask_token_id; // int smask_token_id; @@ -1062,20 +1252,159 @@ class ChatGLM4Tokenizer : public BaseTokenizer { int user_token_id; int assistant_token_id; int observation_token_id; + int boi_token_id; + int eoi_token_id; }; using ChatGLM4Model = ChatGLM2Model; using ChatGLM4ForCausalLM = ChatGLM2ForCausalLM; +// ===== GLM4V-9B ===== + +class Conv2d { + public: + Conv2d() : weight(nullptr), bias(nullptr), stride(0) {} + + Conv2d(ModelContext *mctx, int in_channels, int out_channels, int kernel_size, int stride) + : weight(ggml_new_tensor_4d(mctx->ctx_w.get(), GGML_TYPE_F16, kernel_size, kernel_size, in_channels, + out_channels)), + bias(ggml_new_tensor_3d(mctx->ctx_w.get(), GGML_TYPE_F32, 1, 1, out_channels)), stride(stride) {} + + int in_channels() const { return weight->ne[2]; } + + int out_channels() const { return weight->ne[3]; } + + ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input) const; + + public: + ggml_tensor *weight; + ggml_tensor *bias; + int stride; +}; + +class PatchEmbedding { + public: + PatchEmbedding() = default; + + PatchEmbedding(ModelContext *mctx, int in_channels, int hidden_size, int patch_size, int num_positions) + : proj(mctx, in_channels, hidden_size, patch_size, patch_size), + position_embedding(mctx, GGML_TYPE_F32, num_positions, hidden_size), + cls_embedding(ggml_new_tensor_1d(mctx->ctx_w.get(), GGML_TYPE_F16, hidden_size)) {} + + int hidden_size() const { return proj.out_channels(); } + + int num_positions() const { return position_embedding.num_embeddings(); } + + ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input) const; + + public: + Conv2d proj; + Embedding position_embedding; + ggml_tensor *cls_embedding = nullptr; // [H] +}; + +class EVA2CLIPBlock : public BasicBlock { + public: + EVA2CLIPBlock() = default; + + EVA2CLIPBlock(ModelContext *mctx, ggml_type dtype, int hidden_size, int num_attention_heads, + int num_key_value_heads, int intermediate_size, int max_length, float norm_eps, + ActivationType hidden_act, bool use_qkv_bias, bool use_dense_bias, bool interleaved_qkv, + RopeType rope_type, float rope_theta, AttentionMaskType attn_mask_type, int num_virtual_tokens, + bool use_cache) + : BasicBlock(mctx, dtype, hidden_size, num_attention_heads, num_key_value_heads, intermediate_size, max_length, + norm_eps, hidden_act, use_qkv_bias, use_dense_bias, interleaved_qkv, rope_type, rope_theta, + attn_mask_type, num_virtual_tokens, use_cache) {} + + ggml_tensor *forward(ModelContext *mctx, ggml_tensor *hidden_states, ggml_tensor *attention_mask, + ggml_tensor *position_ids, int n_past) const; +}; + +class EVA2CLIPTransformer { + public: + EVA2CLIPTransformer() = default; + + EVA2CLIPTransformer(ModelContext *mctx, const VisionModelConfig &config); + + ggml_tensor *forward(ModelContext *mctx, ggml_tensor *hidden_states) const; + + public: + std::vector layers; +}; + +class EVA2CLIPModel { + public: + EVA2CLIPModel() = default; + + EVA2CLIPModel(ModelContext *mctx, const ModelConfig &config) + : patch_embedding(mctx, config.vision.in_channels, config.vision.hidden_size, config.vision.patch_size, + config.vision.num_positions), + transformer(mctx, config.vision), conv(mctx, config.vision.hidden_size, config.hidden_size, 2, 2), + linear_proj(mctx, config.vision.dtype, config.hidden_size, config.hidden_size, false), + norm1(mctx, config.hidden_size), + glu(mctx, config.vision.dtype, config.hidden_size, config.intermediate_size, ActivationType::SILU), + boi(ggml_new_tensor_1d(mctx->ctx_w.get(), GGML_TYPE_F16, config.hidden_size)), + eoi(ggml_new_tensor_1d(mctx->ctx_w.get(), GGML_TYPE_F16, config.hidden_size)), + scaling_factor(config.vision.scaling_factor) {} + + ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input) const; + + public: + PatchEmbedding patch_embedding; + EVA2CLIPTransformer transformer; + Conv2d conv; + Linear linear_proj; + LayerNorm norm1; + BasicGLU glu; + ggml_tensor *boi = nullptr; + ggml_tensor *eoi = nullptr; + float scaling_factor = 0.f; +}; + +class ChatGLM4VModel : public ChatGLM4Model { + public: + ChatGLM4VModel() = default; + + ChatGLM4VModel(ModelContext *mctx, const ModelConfig &config) + : ChatGLM4Model(mctx, config), config(config), vision(mctx, config) {} + + ggml_tensor *forward_embeddings(ModelContext *mctx, ggml_tensor *input_ids, ggml_tensor *images, + const std::vector &input_ids_vec, int n_past) const override; + + int num_vision_tokens() const { + auto square = [](int x) { return x * x; }; + return square(config.vision.image_size / config.vision.patch_size / 2); + } + + void set_graph_inputs(ggml_cgraph *gf, const std::vector &input_ids, const std::optional &image, + int n_past, int n_ctx) const; + + public: + ModelConfig config; + EVA2CLIPModel vision; +}; + +class ChatGLM4VForCausalLM : public BasicModelForCausalLM { + public: + ChatGLM4VForCausalLM(const ModelConfig &config) : BasicModelForCausalLM(config) {} + + int count_tokens(const std::vector &input_ids, const std::optional &image) const override; + + void load_state_dict(const StateDict &sd) override; + + private: + StateDict state_dict() const; +}; + // ===== pipeline ===== class Pipeline { public: Pipeline(const std::string &path, int max_length = -1); - std::vector generate(const std::vector &input_ids, const GenerationConfig &gen_config, - BaseStreamer *streamer = nullptr) const; + std::vector generate(const std::vector &input_ids, const std::optional &image, + const GenerationConfig &gen_config, BaseStreamer *streamer = nullptr) const; std::string generate(const std::string &prompt, const GenerationConfig &gen_config, BaseStreamer *streamer = nullptr) const; diff --git a/chatglm_cpp/_C.pyi b/chatglm_cpp/_C.pyi index cae0f2f1..18191bda 100644 --- a/chatglm_cpp/_C.pyi +++ b/chatglm_cpp/_C.pyi @@ -3,9 +3,12 @@ ChatGLM.cpp python binding """ from __future__ import annotations import typing -__all__ = ['BaseModelForCausalLM', 'BaseTokenizer', 'ChatGLM2ForCausalLM', 'ChatGLM2Tokenizer', 'ChatGLM3Tokenizer', 'ChatGLM4Tokenizer', 'ChatGLMForCausalLM', 'ChatGLMTokenizer', 'ChatMessage', 'CodeMessage', 'FunctionMessage', 'GenerationConfig', 'ModelConfig', 'ModelType', 'Pipeline', 'ToolCallMessage'] +import typing_extensions +__all__ = ['BaseModelForCausalLM', 'BaseTokenizer', 'ChatGLM2ForCausalLM', 'ChatGLM2Tokenizer', 'ChatGLM3Tokenizer', 'ChatGLM4Tokenizer', 'ChatGLMForCausalLM', 'ChatGLMTokenizer', 'ChatMessage', 'CodeMessage', 'FunctionMessage', 'GenerationConfig', 'Image', 'ModelConfig', 'ModelType', 'Pipeline', 'ToolCallMessage', 'VisionModelConfig'] class BaseModelForCausalLM: - def generate_next_token(self, input_ids: list[int], gen_config: GenerationConfig, n_past: int, n_ctx: int) -> int: + def count_tokens(self, input_ids: list[int], image: Image | None) -> int: + ... + def generate_next_token(self, input_ids: list[int], image: Image | None, gen_config: GenerationConfig, n_past: int, n_ctx: int) -> int: ... @property def config(self) -> ModelConfig: @@ -37,9 +40,10 @@ class ChatMessage: ROLE_SYSTEM: typing.ClassVar[str] = 'system' ROLE_USER: typing.ClassVar[str] = 'user' content: str + image: Image | None role: str tool_calls: list[ToolCallMessage] - def __init__(self, role: str, content: str, tool_calls: list[ToolCallMessage] = []) -> None: + def __init__(self, role: str, content: str, image: Image | None = None, tool_calls: list[ToolCallMessage] = []) -> None: ... def __repr__(self) -> str: ... @@ -69,6 +73,25 @@ class GenerationConfig: top_p: float def __init__(self, max_length: int = 2048, max_new_tokens: int = -1, max_context_length: int = 512, do_sample: bool = True, top_k: int = 0, top_p: float = 0.7, temperature: float = 0.95, repetition_penalty: float = 1.0) -> None: ... +class Image: + def __init__(self, arg0: typing_extensions.Buffer) -> None: + ... + def __repr__(self) -> str: + ... + def __str__(self) -> str: + ... + @property + def channels(self) -> int: + ... + @property + def height(self) -> int: + ... + @property + def pixels(self) -> list[int]: + ... + @property + def width(self) -> int: + ... class ModelConfig: @property def bos_token_id(self) -> int: @@ -113,6 +136,9 @@ class ModelConfig: def sep_token_id(self) -> int: ... @property + def vision(self) -> VisionModelConfig: + ... + @property def vocab_size(self) -> int: ... class ModelType: @@ -175,3 +201,34 @@ class ToolCallMessage: ... def __str__(self) -> str: ... +class VisionModelConfig: + @property + def hidden_size(self) -> int: + ... + @property + def image_size(self) -> int: + ... + @property + def in_channels(self) -> int: + ... + @property + def intermediate_size(self) -> int: + ... + @property + def norm_eps(self) -> float: + ... + @property + def num_attention_heads(self) -> int: + ... + @property + def num_hidden_layers(self) -> int: + ... + @property + def num_positions(self) -> int: + ... + @property + def patch_size(self) -> int: + ... + @property + def scaling_factor(self) -> float: + ... diff --git a/chatglm_cpp/__init__.py b/chatglm_cpp/__init__.py index 48da0b5a..209bf241 100644 --- a/chatglm_cpp/__init__.py +++ b/chatglm_cpp/__init__.py @@ -4,7 +4,7 @@ from typing import Any, Dict, Iterator, List, Optional, Union import chatglm_cpp._C as _C -from chatglm_cpp._C import ChatMessage +from chatglm_cpp._C import ChatMessage, Image __version__ = "0.4.1" @@ -72,9 +72,16 @@ def chat( temperature=temperature, repetition_penalty=repetition_penalty, ) + + image = None + for msg in messages: + if msg.image is not None: + image = msg.image + break + if stream: - return self._stream_chat(input_ids=input_ids, gen_config=gen_config) - return self._sync_chat(input_ids=input_ids, gen_config=gen_config) + return self._stream_chat(input_ids=input_ids, image=image, gen_config=gen_config) + return self._sync_chat(input_ids=input_ids, image=image, gen_config=gen_config) def generate( self, @@ -105,26 +112,30 @@ def generate( return self._stream_generate(input_ids=input_ids, gen_config=gen_config) return self._sync_generate(input_ids=input_ids, gen_config=gen_config) - def _stream_generate_ids(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> Iterator[int]: + def _stream_generate_ids( + self, input_ids: List[int], image: Optional[Image], gen_config: _C.GenerationConfig + ) -> Iterator[int]: input_ids = input_ids.copy() n_past = 0 n_ctx = len(input_ids) max_new_tokens = gen_config.max_new_tokens if gen_config.max_new_tokens > 0 else gen_config.max_length while len(input_ids) < min(gen_config.max_length, n_ctx + max_new_tokens): - next_token_id = self.model.generate_next_token(input_ids, gen_config, n_past, n_ctx) + next_token_id = self.model.generate_next_token(input_ids, image, gen_config, n_past, n_ctx) yield next_token_id - n_past = len(input_ids) + n_past = self.model.count_tokens(input_ids, image) input_ids.append(next_token_id) if next_token_id in [self.model.config.eos_token_id, *self.model.config.extra_eos_token_ids]: break - def _stream_chat(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> Iterator[DeltaMessage]: + def _stream_chat( + self, input_ids: List[int], image: Optional[Image], gen_config: _C.GenerationConfig + ) -> Iterator[DeltaMessage]: token_cache = [] print_len = 0 print_token_len = 0 - for next_token_id in self._stream_generate_ids(input_ids=input_ids, gen_config=gen_config): + for next_token_id in self._stream_generate_ids(input_ids=input_ids, image=image, gen_config=gen_config): token_cache.append(next_token_id) try: @@ -157,15 +168,17 @@ def _stream_generate(self, input_ids: List[int], gen_config: _C.GenerationConfig for msg in self._stream_chat(input_ids=input_ids, gen_config=gen_config): yield msg.content - def _sync_generate_ids(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> List[int]: - return list(self._stream_generate_ids(input_ids=input_ids, gen_config=gen_config)) + def _sync_generate_ids( + self, input_ids: List[int], image: Optional[Image], gen_config: _C.GenerationConfig + ) -> List[int]: + return list(self._stream_generate_ids(input_ids=input_ids, image=image, gen_config=gen_config)) - def _sync_generate(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> str: - output_ids = self._sync_generate_ids(input_ids=input_ids, gen_config=gen_config) + def _sync_generate(self, input_ids: List[int], image: Optional[Image], gen_config: _C.GenerationConfig) -> str: + output_ids = self._sync_generate_ids(input_ids=input_ids, image=image, gen_config=gen_config) return self.tokenizer.decode(output_ids) - def _sync_chat(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> ChatMessage: - output_ids = self._sync_generate_ids(input_ids=input_ids, gen_config=gen_config) + def _sync_chat(self, input_ids: List[int], image: Optional[Image], gen_config: _C.GenerationConfig) -> ChatMessage: + output_ids = self._sync_generate_ids(input_ids=input_ids, image=image, gen_config=gen_config) return self.tokenizer.decode_message(output_ids) def merge_streaming_messages(self, chunks: List[DeltaMessage]) -> ChatMessage: diff --git a/chatglm_cpp/convert.py b/chatglm_cpp/convert.py index f24a8133..ccc25691 100644 --- a/chatglm_cpp/convert.py +++ b/chatglm_cpp/convert.py @@ -8,7 +8,7 @@ import sys from enum import Enum from pathlib import Path -from typing import BinaryIO, Optional +from typing import BinaryIO, NamedTuple, Optional import torch import torch.nn.functional as F @@ -49,6 +49,12 @@ class ModelType(Enum): CHATGLM2 = 2 CHATGLM3 = 3 CHATGLM4 = 4 + CHATGLM4V = 1004 + + +class WeightMeta(NamedTuple): + name: str + dtype: ModelType def quantize_q8_0(tensor: torch.Tensor) -> torch.Tensor: @@ -162,51 +168,36 @@ def dump_tensor(f, name: str, tensor: torch.Tensor, ggml_type: GGMLType): tensor.numpy().tofile(f) -def dump_state_dict(f, weight_names, state_dict, quantization_bit, ggml_type): +def dump_state_dict(f, weight_meta, state_dict, quantization_bit): tensor_info = [] - for name in tqdm(weight_names, desc="Processing model states"): - tensor = state_dict[name] - if name == "past_key_values": - tensor_ggml_type = GGMLType.F16 - elif tensor.ndim == 2: - # 2d weight: should quantize it if needed - - # step 1: de-quantize it back to float32 - if tensor.dtype == torch.int8: - assert quantization_bit in [4, 8] - scale = state_dict[f"{name}_scale"].float() # channel-wise scale - - if quantization_bit == 4: - # convert int4 weight to int8 - low_bits = ((tensor << 4) & 0xF0) >> 4 - high_bits = (tensor & 0xF0) >> 4 - tensor = torch.stack((high_bits, low_bits), dim=-1).view(tensor.shape[0], -1) - tensor = tensor * scale[:, None] - else: - tensor = tensor.float() - - # step 2: quantize it into ggml format - tensor_ggml_type = ggml_type - else: - # 1d weight: convert it to float32 - assert tensor.ndim == 1 - tensor = tensor.float() - tensor_ggml_type = GGMLType.F32 - - dump_tensor(f, name, tensor, tensor_ggml_type) - tensor_info.append((name, tuple(tensor.shape), tensor_ggml_type.name)) + for meta in tqdm(weight_meta, desc="Processing model states"): + tensor = state_dict[meta.name] + if tensor.ndim == 2 and tensor.dtype == torch.int8: + # de-quantize gemm weight back to float32 + assert quantization_bit in [4, 8] + scale = state_dict[f"{meta.name}_scale"].float() # channel-wise scale + + if quantization_bit == 4: + # convert int4 weight to int8 + low_bits = ((tensor << 4) & 0xF0) >> 4 + high_bits = (tensor & 0xF0) >> 4 + tensor = torch.stack((high_bits, low_bits), dim=-1).view(tensor.shape[0], -1) + tensor = tensor * scale[:, None] + + dump_tensor(f, meta.name, tensor, meta.dtype) + tensor_info.append((meta.name, tuple(tensor.shape), meta.dtype.name)) print(tabulate(tensor_info, headers=["name", "shape", "dtype"], tablefmt="psql")) class BaseConverter: @classmethod - def convert(cls, f, model, tokenizer, ggml_type): + def convert(cls, f, model, tokenizer, ggml_type, vision_type=None): f.write(b"ggml") # magic f.write(struct.pack("i", cls.MODEL_TYPE.value)) # model type - cls.dump_config(f, model.config, ggml_type) + cls.dump_config(f, model.config, ggml_type, vision_type) cls.dump_tokenizer(f, tokenizer) - cls.dump_model(f, model, ggml_type) + cls.dump_model(f, model, ggml_type, vision_type) def get_prefix_cache(prefix_encoder, pre_seq_len, num_layers, num_key_value_heads, head_size): @@ -226,7 +217,7 @@ class ChatGLMConverter(BaseConverter): MODEL_TYPE = ModelType.CHATGLM @staticmethod - def dump_config(f, config, ggml_type): + def dump_config(f, config, ggml_type, vision_type): assert config.position_encoding_2d, "unimplemented: position_encoding_2d should be True" assert ( config.inner_hidden_size == 4 * config.hidden_size @@ -257,39 +248,39 @@ def dump_tokenizer(f, tokenizer): f.write(serialized_model_proto) @staticmethod - def dump_model(f, model, ggml_type): + def dump_model(f, model, ggml_type, vision_type): assert torch.allclose( model.state_dict()["transformer.word_embeddings.weight"], model.state_dict()["lm_head.weight"] ), "unimplemented: lm_head weight must be tied to input embedding" - weight_names = ["transformer.word_embeddings.weight"] + weight_meta = [WeightMeta("transformer.word_embeddings.weight", ggml_type)] for i in range(model.config.num_layers): - weight_names += [ - f"transformer.layers.{i}.input_layernorm.weight", - f"transformer.layers.{i}.input_layernorm.bias", - f"transformer.layers.{i}.attention.query_key_value.weight", - f"transformer.layers.{i}.attention.query_key_value.bias", - f"transformer.layers.{i}.attention.dense.weight", - f"transformer.layers.{i}.attention.dense.bias", - f"transformer.layers.{i}.post_attention_layernorm.weight", - f"transformer.layers.{i}.post_attention_layernorm.bias", - f"transformer.layers.{i}.mlp.dense_h_to_4h.weight", - f"transformer.layers.{i}.mlp.dense_h_to_4h.bias", - f"transformer.layers.{i}.mlp.dense_4h_to_h.weight", - f"transformer.layers.{i}.mlp.dense_4h_to_h.bias", + weight_meta += [ + WeightMeta(f"transformer.layers.{i}.input_layernorm.weight", GGMLType.F32), + WeightMeta(f"transformer.layers.{i}.input_layernorm.bias", GGMLType.F32), + WeightMeta(f"transformer.layers.{i}.attention.query_key_value.weight", ggml_type), + WeightMeta(f"transformer.layers.{i}.attention.query_key_value.bias", GGMLType.F32), + WeightMeta(f"transformer.layers.{i}.attention.dense.weight", ggml_type), + WeightMeta(f"transformer.layers.{i}.attention.dense.bias", GGMLType.F32), + WeightMeta(f"transformer.layers.{i}.post_attention_layernorm.weight", GGMLType.F32), + WeightMeta(f"transformer.layers.{i}.post_attention_layernorm.bias", GGMLType.F32), + WeightMeta(f"transformer.layers.{i}.mlp.dense_h_to_4h.weight", ggml_type), + WeightMeta(f"transformer.layers.{i}.mlp.dense_h_to_4h.bias", GGMLType.F32), + WeightMeta(f"transformer.layers.{i}.mlp.dense_4h_to_h.weight", ggml_type), + WeightMeta(f"transformer.layers.{i}.mlp.dense_4h_to_h.bias", GGMLType.F32), ] - weight_names += [ - "transformer.final_layernorm.weight", - "transformer.final_layernorm.bias", + weight_meta += [ + WeightMeta("transformer.final_layernorm.weight", GGMLType.F32), + WeightMeta("transformer.final_layernorm.bias", GGMLType.F32), ] - dump_state_dict(f, weight_names, model.state_dict(), model.config.quantization_bit, ggml_type) + dump_state_dict(f, weight_meta, model.state_dict(), model.config.quantization_bit) class ChatGLM2Converter(BaseConverter): MODEL_TYPE = ModelType.CHATGLM2 @classmethod - def dump_config(cls, f, config, ggml_type): + def dump_config(cls, f, config, ggml_type, vision_type): assert config.add_bias_linear is False, "unimplemented: add_bias_linear must be false" assert config.add_qkv_bias is True, "unimplemented: add_qkv_bias must be true" assert ( @@ -329,12 +320,12 @@ def dump_tokenizer(f, tokenizer): f.write(serialized_model_proto) @staticmethod - def dump_model(f, model, ggml_type): + def dump_model(f, model, ggml_type, vision_type): config = model.config state_dict = model.state_dict() - weight_names = [] + weight_meta = [] if getattr(config, "pre_seq_len", None) is not None and config.pre_seq_len > 0: past_key_values = get_prefix_cache( model.transformer.prefix_encoder, @@ -344,29 +335,28 @@ def dump_model(f, model, ggml_type): config.kv_channels, ) state_dict["past_key_values"] = past_key_values - weight_names.append("past_key_values") + weight_meta.append(WeightMeta("past_key_values", GGMLType.F16)) - weight_names.append("transformer.embedding.word_embeddings.weight") + weight_meta.append(WeightMeta("transformer.embedding.word_embeddings.weight", ggml_type)) for i in range(config.num_layers): - weight_names += [ - f"transformer.encoder.layers.{i}.input_layernorm.weight", - f"transformer.encoder.layers.{i}.self_attention.query_key_value.weight", - f"transformer.encoder.layers.{i}.self_attention.query_key_value.bias", - f"transformer.encoder.layers.{i}.self_attention.dense.weight", - f"transformer.encoder.layers.{i}.post_attention_layernorm.weight", - f"transformer.encoder.layers.{i}.mlp.dense_h_to_4h.weight", - f"transformer.encoder.layers.{i}.mlp.dense_4h_to_h.weight", + weight_meta += [ + WeightMeta(f"transformer.encoder.layers.{i}.input_layernorm.weight", GGMLType.F32), + WeightMeta(f"transformer.encoder.layers.{i}.self_attention.query_key_value.weight", ggml_type), + WeightMeta(f"transformer.encoder.layers.{i}.self_attention.query_key_value.bias", GGMLType.F32), + WeightMeta(f"transformer.encoder.layers.{i}.self_attention.dense.weight", ggml_type), + WeightMeta(f"transformer.encoder.layers.{i}.post_attention_layernorm.weight", GGMLType.F32), + WeightMeta(f"transformer.encoder.layers.{i}.mlp.dense_h_to_4h.weight", ggml_type), + WeightMeta(f"transformer.encoder.layers.{i}.mlp.dense_4h_to_h.weight", ggml_type), ] - weight_names += [ - "transformer.encoder.final_layernorm.weight", - "transformer.output_layer.weight", + weight_meta += [ + WeightMeta("transformer.encoder.final_layernorm.weight", GGMLType.F32), + WeightMeta("transformer.output_layer.weight", ggml_type), ] dump_state_dict( f, - weight_names=weight_names, + weight_meta=weight_meta, state_dict=state_dict, quantization_bit=getattr(config, "quantization_bit", None), - ggml_type=ggml_type, ) @@ -384,8 +374,103 @@ def dump_tokenizer(f, tokenizer): f.write(vocab_text) -def convert(f: BinaryIO, model_name_or_path: str, lora_model_name_or_path: Optional[str] = None, dtype: str = "q4_0"): +class ChatGLM4VConverter(ChatGLM4Converter): + MODEL_TYPE = ModelType.CHATGLM4V + + @classmethod + def dump_config(cls, f, config, ggml_type, vision_type): + ChatGLM4Converter.dump_config(f, config, ggml_type, vision_type) + + config_values = [ + vision_type.value, + config.vision_config["hidden_size"], + config.vision_config["image_size"], + config.vision_config["in_channels"], + config.vision_config["intermediate_size"], + config.vision_config["layer_norm_eps"], + config.vision_config["num_heads"], + config.vision_config["num_hidden_layers"], + config.vision_config["num_positions"], + config.vision_config["patch_size"], + config.vision_config["scaling_factor"], + ] + + f.write(struct.pack("iiiiifiiiif", *config_values)) + + @staticmethod + def dump_model(f, model, ggml_type, vision_type): + config = model.config + + state_dict = model.state_dict() + + # vision + weight_meta = [ + WeightMeta("transformer.vision.patch_embedding.cls_embedding", GGMLType.F16), + WeightMeta("transformer.vision.patch_embedding.proj.weight", GGMLType.F16), + WeightMeta("transformer.vision.patch_embedding.proj.bias", GGMLType.F32), + WeightMeta("transformer.vision.patch_embedding.position_embedding.weight", GGMLType.F32), + ] + for i in range(config.vision_config["num_hidden_layers"]): + weight_meta += [ + WeightMeta(f"transformer.vision.transformer.layers.{i}.input_layernorm.weight", GGMLType.F32), + WeightMeta(f"transformer.vision.transformer.layers.{i}.input_layernorm.bias", GGMLType.F32), + WeightMeta(f"transformer.vision.transformer.layers.{i}.attention.query_key_value.weight", vision_type), + WeightMeta(f"transformer.vision.transformer.layers.{i}.attention.query_key_value.bias", GGMLType.F32), + WeightMeta(f"transformer.vision.transformer.layers.{i}.attention.dense.weight", vision_type), + WeightMeta(f"transformer.vision.transformer.layers.{i}.attention.dense.bias", GGMLType.F32), + WeightMeta(f"transformer.vision.transformer.layers.{i}.mlp.fc1.weight", vision_type), + WeightMeta(f"transformer.vision.transformer.layers.{i}.mlp.fc1.bias", GGMLType.F32), + WeightMeta(f"transformer.vision.transformer.layers.{i}.mlp.fc2.weight", vision_type), + WeightMeta(f"transformer.vision.transformer.layers.{i}.mlp.fc2.bias", GGMLType.F32), + WeightMeta(f"transformer.vision.transformer.layers.{i}.post_attention_layernorm.weight", GGMLType.F32), + WeightMeta(f"transformer.vision.transformer.layers.{i}.post_attention_layernorm.bias", GGMLType.F32), + ] + weight_meta += [ + WeightMeta("transformer.vision.conv.weight", GGMLType.F16), + WeightMeta("transformer.vision.conv.bias", GGMLType.F32), + WeightMeta("transformer.vision.linear_proj.linear_proj.weight", vision_type), + WeightMeta("transformer.vision.linear_proj.norm1.weight", GGMLType.F32), + WeightMeta("transformer.vision.linear_proj.norm1.bias", GGMLType.F32), + WeightMeta("transformer.vision.linear_proj.gate_proj.weight", vision_type), + WeightMeta("transformer.vision.linear_proj.dense_h_to_4h.weight", vision_type), + WeightMeta("transformer.vision.linear_proj.dense_4h_to_h.weight", vision_type), + WeightMeta("transformer.vision.boi", GGMLType.F16), + WeightMeta("transformer.vision.eoi", GGMLType.F16), + ] + + # text + weight_meta.append(WeightMeta("transformer.embedding.word_embeddings.weight", ggml_type)) + for i in range(config.num_layers): + weight_meta += [ + WeightMeta(f"transformer.encoder.layers.{i}.input_layernorm.weight", GGMLType.F32), + WeightMeta(f"transformer.encoder.layers.{i}.self_attention.query_key_value.weight", ggml_type), + WeightMeta(f"transformer.encoder.layers.{i}.self_attention.query_key_value.bias", GGMLType.F32), + WeightMeta(f"transformer.encoder.layers.{i}.self_attention.dense.weight", ggml_type), + WeightMeta(f"transformer.encoder.layers.{i}.post_attention_layernorm.weight", GGMLType.F32), + WeightMeta(f"transformer.encoder.layers.{i}.mlp.dense_h_to_4h.weight", ggml_type), + WeightMeta(f"transformer.encoder.layers.{i}.mlp.dense_4h_to_h.weight", ggml_type), + ] + weight_meta += [ + WeightMeta("transformer.encoder.final_layernorm.weight", GGMLType.F32), + WeightMeta("transformer.output_layer.weight", ggml_type), + ] + dump_state_dict( + f, + weight_meta=weight_meta, + state_dict=state_dict, + quantization_bit=getattr(config, "quantization_bit", None), + ) + + +def convert( + f: BinaryIO, + model_name_or_path: str, + lora_model_name_or_path: Optional[str] = None, + dtype: str = "q4_0", + vision_dtype: str = "f16", +): ggml_type = GGMLType[dtype.upper()] + vision_type = GGMLType[vision_dtype.upper()] tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True) @@ -415,7 +500,10 @@ def convert(f: BinaryIO, model_name_or_path: str, lora_model_name_or_path: Optio if tiktoken is not None and isinstance(tokenizer.tokenizer, tiktoken.Encoding): # TODO: store all eos token ids model.config.eos_token_id = tokenizer.eos_token_id - ChatGLM4Converter.convert(f, model, tokenizer, ggml_type) + if getattr(model.config, "vision_config", None) is not None: + ChatGLM4VConverter.convert(f, model, tokenizer, ggml_type, vision_type) + else: + ChatGLM4Converter.convert(f, model, tokenizer, ggml_type) elif "<|system|>" in tokenizer.tokenizer.special_tokens: ChatGLM3Converter.convert(f, model, tokenizer, ggml_type) else: @@ -453,10 +541,20 @@ def main(): choices=["f32", "f16", "q8_0", "q4_0", "q4_1", "q5_0", "q5_1"], help="GGML model quantization type", ) + parser.add_argument( + "-vt", + "--vision_type", + default="f16", + type=str, + choices=["f32", "f16", "q8_0", "q4_0", "q4_1", "q5_0", "q5_1"], + help="Vision model quantization type", + ) args = parser.parse_args() with open(args.save_path, "wb") as f: - convert(f, args.model_name_or_path, args.lora_model_name_or_path, dtype=args.type) + convert( + f, args.model_name_or_path, args.lora_model_name_or_path, dtype=args.type, vision_dtype=args.vision_type + ) print(f"GGML model saved to {args.save_path}") diff --git a/chatglm_cpp/openai_api.py b/chatglm_cpp/openai_api.py index 6d37844d..9fad4263 100644 --- a/chatglm_cpp/openai_api.py +++ b/chatglm_cpp/openai_api.py @@ -1,4 +1,6 @@ import asyncio +import base64 +import io import json import logging import time @@ -30,9 +32,24 @@ class ToolCall(BaseModel): type: Literal["function"] +class ContentText(BaseModel): + type: Literal["text"] = "text" + text: str + + +class ContentImageUrlData(BaseModel): + url: str + detail: str = "high" + + +class ContentImageUrl(BaseModel): + type: Literal["image_url"] = "image_url" + image_url: ContentImageUrlData + + class ChatMessage(BaseModel): role: Literal["system", "user", "assistant"] - content: str + content: Union[str, List[Union[ContentText, ContentImageUrl]]] tool_calls: Optional[List[ToolCall]] = None @@ -186,7 +203,32 @@ def tool_call(**kwargs): if not body.messages: raise HTTPException(status.HTTP_400_BAD_REQUEST, "empty messages") - messages = [chatglm_cpp.ChatMessage(role=msg.role, content=msg.content) for msg in body.messages] + messages = [] + for msg in body.messages: + if isinstance(msg.content, str): + messages.append(chatglm_cpp.ChatMessage(role=msg.role, content=msg.content)) + else: + if not (len(msg.content) == 2 and msg.content[0].type == "text" and msg.content[1].type == "image_url"): + raise HTTPException( + status.HTTP_400_BAD_REQUEST, + "multimodal content must have a text item followed by an image_url item", + ) + + import numpy as np + from PIL import Image + + text = msg.content[0].text + image_url = msg.content[1].image_url.url + if image_url.startswith("data:"): + image_bytes = base64.b64decode(image_url.split(",")[1]) + else: + import requests + + image_bytes = requests.get(image_url).content + image = chatglm_cpp.Image(np.asarray(Image.open(io.BytesIO(image_bytes)))) + + messages.append(chatglm_cpp.ChatMessage(role=msg.role, content=text, image=image)) + if body.tools: system_content = ( "Answer the following questions as best as you can. You have access to the following tools:\n" diff --git a/chatglm_pybind.cpp b/chatglm_pybind.cpp index 5143e04a..1cf08c1c 100644 --- a/chatglm_pybind.cpp +++ b/chatglm_pybind.cpp @@ -30,14 +30,19 @@ class PyBaseModelForCausalLM : public BaseModelForCausalLM { PYBIND11_OVERLOAD_PURE(void, PyBaseModelForCausalLM, load_state_dict, sd); } - ggml_tensor *forward(ModelContext *ctx, ggml_tensor *input_ids, int n_past, int n_ctx, - bool is_decoding) const override { - PYBIND11_OVERLOAD_PURE(ggml_tensor *, PyBaseModelForCausalLM, forward, ctx, input_ids, n_past, n_ctx, - is_decoding) + ggml_tensor *forward(ModelContext *mctx, ggml_tensor *input_ids, ggml_tensor *images, + const std::vector &input_ids_vec, int n_past, bool is_decoding) const override { + PYBIND11_OVERLOAD_PURE(ggml_tensor *, PyBaseModelForCausalLM, forward, mctx, input_ids, images, input_ids_vec, + n_past, is_decoding); } - void set_graph_inputs(int qlen, int n_past, int n_ctx) const override { - PYBIND11_OVERLOAD_PURE(void, PyBaseModelForCausalLM, set_graph_inputs, qlen, n_past, n_ctx); + void set_graph_inputs(const std::vector &input_ids, const std::optional &image, int n_past, + int n_ctx) const override { + PYBIND11_OVERLOAD_PURE(void, PyBaseModelForCausalLM, set_graph_inputs, input_ids, image, n_past, n_ctx); + } + + int count_tokens(const std::vector &input_ids, const std::optional &image) const override { + PYBIND11_OVERLOAD_PURE(int, PyBaseModelForCausalLM, count_tokens, input_ids, image); } }; @@ -57,6 +62,20 @@ PYBIND11_MODULE(_C, m) { .value("CHATGLM3", ModelType::CHATGLM3) .value("CHATGLM4", ModelType::CHATGLM4); + py::class_(m, "VisionModelConfig") + // .def_readonly("dtype", &VisionModelConfig::dtype) + // .def_readonly("hidden_act", &VisionModelConfig::hidden_act) + .def_readonly("hidden_size", &VisionModelConfig::hidden_size) + .def_readonly("image_size", &VisionModelConfig::image_size) + .def_readonly("in_channels", &VisionModelConfig::in_channels) + .def_readonly("intermediate_size", &VisionModelConfig::intermediate_size) + .def_readonly("norm_eps", &VisionModelConfig::norm_eps) + .def_readonly("num_attention_heads", &VisionModelConfig::num_attention_heads) + .def_readonly("num_hidden_layers", &VisionModelConfig::num_hidden_layers) + .def_readonly("num_positions", &VisionModelConfig::num_positions) + .def_readonly("patch_size", &VisionModelConfig::patch_size) + .def_readonly("scaling_factor", &VisionModelConfig::scaling_factor); + py::class_(m, "ModelConfig") .def_readonly("model_type", &ModelConfig::model_type) // .def_readonly("dtype", &ModelConfig::dtype) @@ -73,6 +92,7 @@ PYBIND11_MODULE(_C, m) { .def_readonly("pad_token_id", &ModelConfig::pad_token_id) .def_readonly("sep_token_id", &ModelConfig::sep_token_id) .def_readonly("extra_eos_token_ids", &ModelConfig::extra_eos_token_ids) + .def_readonly("vision", &ModelConfig::vision) .def_property_readonly("model_type_name", &ModelConfig::model_type_name); py::class_(m, "GenerationConfig") @@ -106,9 +126,37 @@ PYBIND11_MODULE(_C, m) { .def_readwrite("function", &ToolCallMessage::function) .def_readwrite("code", &ToolCallMessage::code); + py::class_(m, "Image", py::buffer_protocol()) + .def(py::init([](py::buffer b) { + py::buffer_info info = b.request(); + + CHATGLM_CHECK(info.format == py::format_descriptor::format()) + << "Incompatible format: expect a byte array!"; + CHATGLM_CHECK(info.ndim == 3 && info.shape[2] == 3) << "Only support RGB image for now"; + + for (int i = 1; i < info.ndim; i++) { + CHATGLM_CHECK(info.strides[i] * info.shape[i] == info.strides[i - 1]) + << "Only support contiguous array"; + } + + return Image(info.shape[1], info.shape[0], info.shape[2], (uint8_t *)info.ptr); + })) + .def_buffer([](Image &self) { + return py::buffer_info( + self.pixels.data(), sizeof(uint8_t), py::format_descriptor::format(), 3, + {self.height, self.width, self.channels}, + {self.width * self.channels * sizeof(uint8_t), self.channels * sizeof(uint8_t), sizeof(uint8_t)}); + }) + .def("__repr__", &to_string) + .def("__str__", &to_string) + .def_readonly("width", &Image::width) + .def_readonly("height", &Image::height) + .def_readonly("channels", &Image::channels) + .def_readonly("pixels", &Image::pixels); + py::class_(m, "ChatMessage") - .def(py::init>(), "role"_a, "content"_a, - "tool_calls"_a = std::vector{}) + .def(py::init, std::vector>(), "role"_a, + "content"_a, "image"_a = std::nullopt, "tool_calls"_a = std::vector{}) .def("__repr__", &to_string) .def("__str__", &to_string) .def_readonly_static("ROLE_SYSTEM", &ChatMessage::ROLE_SYSTEM) @@ -117,6 +165,7 @@ PYBIND11_MODULE(_C, m) { .def_readonly_static("ROLE_OBSERVATION", &ChatMessage::ROLE_OBSERVATION) .def_readwrite("role", &ChatMessage::role) .def_readwrite("content", &ChatMessage::content) + .def_readwrite("image", &ChatMessage::image) .def_readwrite("tool_calls", &ChatMessage::tool_calls); py::class_(m, "BaseTokenizer") @@ -126,8 +175,9 @@ PYBIND11_MODULE(_C, m) { .def("decode_message", &BaseTokenizer::decode_message, "ids"_a); py::class_(m, "BaseModelForCausalLM") - .def("generate_next_token", &BaseModelForCausalLM::generate_next_token, "input_ids"_a, "gen_config"_a, - "n_past"_a, "n_ctx"_a) + .def("generate_next_token", &BaseModelForCausalLM::generate_next_token, "input_ids"_a, "image"_a, + "gen_config"_a, "n_past"_a, "n_ctx"_a) + .def("count_tokens", &BaseModelForCausalLM::count_tokens, "input_ids"_a, "image"_a) .def_readonly("config", &BaseModelForCausalLM::config); // ===== ChatGLM ===== diff --git a/chatglm_test.cpp b/chatglm_test.cpp index 96c66fdf..554faa66 100644 --- a/chatglm_test.cpp +++ b/chatglm_test.cpp @@ -52,7 +52,7 @@ static inline void expect_all_close(ggml_tensor *a, ggml_tensor *b, float atol = static inline void read_backend_tensor_data(std::istream &is, ggml_tensor *tensor) { std::vector> buf(ggml_nbytes(tensor)); - is.read((char *)buf.data(), buf.size()); + CHATGLM_CHECK(is.read((char *)buf.data(), buf.size())); ggml_backend_tensor_set(tensor, buf.data(), 0, buf.size()); } @@ -261,7 +261,7 @@ class ChatGLMTest : public ::testing::Test { protected: std::unique_ptr mctx_; - void SetUp() override { mctx_ = std::make_unique(GGML_TYPE_F32); } + void SetUp() override { mctx_ = std::make_unique(); } float perf_graph_compute() { auto fn = [this] { @@ -274,17 +274,6 @@ class ChatGLMTest : public ::testing::Test { } } - template - static void set_graph_inputs(ggml_cgraph *gf, int qlen, int n_past, int n_ctx) { - static_assert(std::is_same_v || std::is_same_v, - "invalid model type"); - if (std::is_same_v) { - ChatGLMForCausalLM::set_graph_inputs(gf, qlen, n_past, n_ctx); - } else { - ChatGLM2ForCausalLM::set_graph_inputs(gf, qlen, n_past, n_ctx); - } - } - template void test_model(Model &model, const ModelConfig &config, const fs::path &data_path, int seq_len, const std::vector &all_weights) { @@ -326,35 +315,48 @@ class ChatGLMTest : public ::testing::Test { } ASSERT_TRUE(ifs.peek() == EOF); - // self attention + auto input_ids_to_vec = [](ggml_tensor *input_ids) { + std::vector input_ids_vec(ggml_nelements(input_ids)); + ggml_backend_tensor_get(input_ids, input_ids_vec.data(), 0, ggml_nbytes(input_ids)); + return input_ids_vec; + }; + + std::vector input_ids; + + // prefill { + std::vector x1_vec = input_ids_to_vec(x1); + input_ids.insert(input_ids.end(), x1_vec.begin(), x1_vec.end()); ggml_graph_clear(mctx_->gf); - ggml_tensor *out_y1 = model.forward(mctx_.get(), x1, 0); + ggml_tensor *out_y1 = model.forward(mctx_.get(), x1, nullptr, input_ids, 0); ggml_build_forward_expand(mctx_->gf, out_y1); CHATGLM_CHECK(ggml_gallocr_alloc_graph(mctx_->allocr.get(), mctx_->gf)); - set_graph_inputs(mctx_->gf, seq_len, 0, seq_len); + model.set_graph_inputs(mctx_->gf, input_ids, std::nullopt, 0, seq_len); CHATGLM_CHECK(ggml_backend_graph_compute(mctx_->backend.get(), mctx_->gf) == GGML_STATUS_SUCCESS); expect_all_close(ref_y1, out_y1, 5e-4); } - - // cross attention + // decode { + std::vector x2_vec = input_ids_to_vec(x2); + input_ids.insert(input_ids.end(), x2_vec.begin(), x2_vec.end()); ggml_graph_clear(mctx_->gf); - ggml_tensor *out_y2 = model.forward(mctx_.get(), x2, seq_len); + ggml_tensor *out_y2 = model.forward(mctx_.get(), x2, nullptr, input_ids, seq_len); ggml_build_forward_expand(mctx_->gf, out_y2); CHATGLM_CHECK(ggml_gallocr_alloc_graph(mctx_->allocr.get(), mctx_->gf)); - set_graph_inputs(mctx_->gf, 1, seq_len, seq_len); + model.set_graph_inputs(mctx_->gf, input_ids, std::nullopt, seq_len, seq_len); CHATGLM_CHECK(ggml_backend_graph_compute(mctx_->backend.get(), mctx_->gf) == GGML_STATUS_SUCCESS); expect_all_close(ref_y2, out_y2, 5e-4); } { + std::vector x3_vec = input_ids_to_vec(x3); + input_ids.insert(input_ids.end(), x3_vec.begin(), x3_vec.end()); ggml_graph_clear(mctx_->gf); - ggml_tensor *out_y3 = model.forward(mctx_.get(), x3, seq_len + 1); + ggml_tensor *out_y3 = model.forward(mctx_.get(), x3, nullptr, input_ids, seq_len + 1); ggml_build_forward_expand(mctx_->gf, out_y3); CHATGLM_CHECK(ggml_gallocr_alloc_graph(mctx_->allocr.get(), mctx_->gf)); - set_graph_inputs(mctx_->gf, 1, seq_len + 1, seq_len); + model.set_graph_inputs(mctx_->gf, input_ids, std::nullopt, seq_len + 1, seq_len); CHATGLM_CHECK(ggml_backend_graph_compute(mctx_->backend.get(), mctx_->gf) == GGML_STATUS_SUCCESS); expect_all_close(ref_y3, out_y3, 5e-4); @@ -370,7 +372,7 @@ TEST_F(ChatGLMTest, Embedding) { -2.1788, 0.4033, 0.8380, -0.7193, -0.4033, -0.5966, 0.1820}; ggml_tensor *x = ggml_new_tensor_1d(mctx_->ctx_b.get(), GGML_TYPE_I32, 5); - Embedding model(mctx_.get(), 4, 3); + Embedding model(mctx_.get(), GGML_TYPE_F32, 4, 3); ggml_tensor *ref = ggml_new_tensor_2d(mctx_->ctx_b.get(), GGML_TYPE_F32, 3, 5); auto buf_b = unique_ggml_backend_buffer_t(ggml_backend_alloc_ctx_tensors(mctx_->ctx_b.get(), mctx_->backend.get())); @@ -432,8 +434,7 @@ TEST_F(ChatGLMTest, Linear) { }; for (const auto &config : test_configs) { - mctx_->dtype = config.dtype; - Linear model(mctx_.get(), 64, 32); + Linear model(mctx_.get(), config.dtype, 64, 32); auto buf_w = unique_ggml_backend_buffer_t(ggml_backend_alloc_ctx_tensors(mctx_->ctx_w.get(), mctx_->backend.get())); @@ -471,9 +472,9 @@ TEST_F(ChatGLMTest, BenchmarkLinear) { std::vector dtypes{GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_Q8_0, GGML_TYPE_Q5_1, GGML_TYPE_Q5_0, GGML_TYPE_Q4_1, GGML_TYPE_Q4_0}; for (ggml_type dtype : dtypes) { - mctx_ = std::make_unique(dtype); + mctx_ = std::make_unique(); - Linear m(mctx_.get(), K, N); + Linear m(mctx_.get(), dtype, K, N); ggml_tensor *x = ggml_new_tensor_2d(mctx_->ctx_b.get(), GGML_TYPE_F32, K, M); ggml_tensor *y = m.forward(mctx_.get(), x); @@ -485,8 +486,7 @@ TEST_F(ChatGLMTest, BenchmarkLinear) { randn_(tensor); } - std::cout << "[Benchmark] Linear " << ggml_type_name(mctx_->dtype) << " time: " << perf_graph_compute() - << " ms\n"; + std::cout << "[Benchmark] Linear " << ggml_type_name(dtype) << " time: " << perf_graph_compute() << " ms\n"; } } @@ -537,7 +537,7 @@ TEST_F(ChatGLMTest, BenchmarkLayerNorm) { ggml_tensor *y = m.forward(mctx_.get(), x); ggml_build_forward_expand(mctx_->gf, y); CHATGLM_CHECK(ggml_gallocr_alloc_graph(mctx_->allocr.get(), mctx_->gf)); - std::cout << "[Benchmark] LayerNorm " << ggml_type_name(mctx_->dtype) << " time: " << perf_graph_compute() + std::cout << "[Benchmark] LayerNorm " << ggml_type_name(GGML_TYPE_F32) << " time: " << perf_graph_compute() << " ms\n"; } @@ -588,19 +588,19 @@ TEST_F(ChatGLMTest, BenchmarkRMSNorm) { ggml_tensor *y = m.forward(mctx_.get(), x); ggml_build_forward_expand(mctx_->gf, y); CHATGLM_CHECK(ggml_gallocr_alloc_graph(mctx_->allocr.get(), mctx_->gf)); - std::cout << "[Benchmark] RMSNorm " << ggml_type_name(mctx_->dtype) << " time: " << perf_graph_compute() << " ms\n"; + std::cout << "[Benchmark] RMSNorm " << ggml_type_name(GGML_TYPE_F32) << " time: " << perf_graph_compute() + << " ms\n"; } TEST_F(ChatGLMTest, GLMModel) { fs::path data_path = fs::path(__FILE__).parent_path() / "tests/data/glm_model.data"; - ModelConfig config( - ModelType::CHATGLM, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, /*num_attention_heads=*/8, - /*num_key_value_heads=*/8, /*num_hidden_layers=*/1, /*intermediate_size=*/128, /*norm_eps=*/1e-5f, - /*rope_theta=*/10000.f, - /*num_virtual_tokens=*/0, - /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, /*sep_token_id=*/-1, - /*extra_eos_token_ids=*/{}); + ModelConfig config(ModelType::CHATGLM, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, + /*num_attention_heads=*/8, /*num_key_value_heads=*/8, /*num_hidden_layers=*/1, + /*intermediate_size=*/128, /*norm_eps=*/1e-5f, /*rope_theta=*/10000.f, /*num_virtual_tokens=*/0, + /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, + /*sep_token_id=*/-1, /*boi_token_id=*/-1, /*eoi_token_id=*/-1, /*extra_eos_token_ids=*/{}, + /*vision=*/{}); constexpr int seq_len = 3; @@ -628,13 +628,12 @@ TEST_F(ChatGLMTest, GLMModel) { TEST_F(ChatGLMTest, GLMPTuningV2Model) { fs::path data_path = fs::path(__FILE__).parent_path() / "tests/data/glm_ptuning_v2_model.data"; - ModelConfig config( - ModelType::CHATGLM, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, /*num_attention_heads=*/8, - /*num_key_value_heads=*/8, /*num_hidden_layers=*/1, /*intermediate_size=*/128, /*norm_eps=*/1e-5f, - /*rope_theta=*/10000.f, - /*num_virtual_tokens=*/5, - /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, /*sep_token_id=*/-1, - /*extra_eos_token_ids=*/{}); + ModelConfig config(ModelType::CHATGLM, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, + /*num_attention_heads=*/8, /*num_key_value_heads=*/8, /*num_hidden_layers=*/1, + /*intermediate_size=*/128, /*norm_eps=*/1e-5f, /*rope_theta=*/10000.f, /*num_virtual_tokens=*/5, + /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, + /*sep_token_id=*/-1, /*boi_token_id=*/-1, /*eoi_token_id=*/-1, /*extra_eos_token_ids=*/{}, + /*vision=*/{}); constexpr int seq_len = 3; @@ -662,13 +661,12 @@ TEST_F(ChatGLMTest, GLMPTuningV2Model) { TEST_F(ChatGLMTest, GLM2Model) { fs::path data_path = fs::path(__FILE__).parent_path() / "tests/data/glm2_model.data"; - ModelConfig config( - ModelType::CHATGLM2, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, /*num_attention_heads=*/8, - /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, /*intermediate_size=*/48, /*norm_eps=*/1e-5f, - /*rope_theta=*/10000.f, - /*num_virtual_tokens=*/0, - /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, /*sep_token_id=*/-1, - /*extra_eos_token_ids=*/{}); + ModelConfig config(ModelType::CHATGLM2, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, + /*num_attention_heads=*/8, /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, + /*intermediate_size=*/48, /*norm_eps=*/1e-5f, /*rope_theta=*/10000.f, /*num_virtual_tokens=*/0, + /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, + /*sep_token_id=*/-1, /*boi_token_id=*/-1, /*eoi_token_id=*/-1, /*extra_eos_token_ids=*/{}, + /*vision=*/{}); constexpr int seq_len = 3; @@ -691,13 +689,12 @@ TEST_F(ChatGLMTest, GLM2Model) { TEST_F(ChatGLMTest, GLM3Model) { fs::path data_path = fs::path(__FILE__).parent_path() / "tests/data/glm3_model.data"; - ModelConfig config( - ModelType::CHATGLM3, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, /*num_attention_heads=*/8, - /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, /*intermediate_size=*/48, /*norm_eps=*/1e-5f, - /*rope_theta=*/10000.f, - /*num_virtual_tokens=*/0, - /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, /*sep_token_id=*/-1, - /*extra_eos_token_ids=*/{}); + ModelConfig config(ModelType::CHATGLM3, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, + /*num_attention_heads=*/8, /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, + /*intermediate_size=*/48, /*norm_eps=*/1e-5f, /*rope_theta=*/10000.f, /*num_virtual_tokens=*/0, + /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, + /*sep_token_id=*/-1, /*boi_token_id=*/-1, /*eoi_token_id=*/-1, /*extra_eos_token_ids=*/{}, + /*vision=*/{}); constexpr int seq_len = 3; @@ -720,13 +717,12 @@ TEST_F(ChatGLMTest, GLM3Model) { TEST_F(ChatGLMTest, GLM3PTuningV2Model) { fs::path data_path = fs::path(__FILE__).parent_path() / "tests/data/glm3_ptuning_v2_model.data"; - ModelConfig config( - ModelType::CHATGLM3, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, /*num_attention_heads=*/8, - /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, /*intermediate_size=*/48, /*norm_eps=*/1e-5f, - /*rope_theta=*/10000.f, - /*num_virtual_tokens=*/5, - /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, /*sep_token_id=*/-1, - /*extra_eos_token_ids=*/{}); + ModelConfig config(ModelType::CHATGLM3, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, + /*num_attention_heads=*/8, /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, + /*intermediate_size=*/48, /*norm_eps=*/1e-5f, /*rope_theta=*/10000.f, /*num_virtual_tokens=*/5, + /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, + /*sep_token_id=*/-1, /*boi_token_id=*/-1, /*eoi_token_id=*/-1, /*extra_eos_token_ids=*/{}, + /*vision=*/{}); constexpr int seq_len = 3; @@ -749,13 +745,12 @@ TEST_F(ChatGLMTest, GLM3PTuningV2Model) { TEST_F(ChatGLMTest, GLM4Model) { fs::path data_path = fs::path(__FILE__).parent_path() / "tests/data/glm4_model.data"; - ModelConfig config( - ModelType::CHATGLM4, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, /*num_attention_heads=*/8, - /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, /*intermediate_size=*/48, /*norm_eps=*/1e-5f, - /*rope_theta=*/10000.f, - /*num_virtual_tokens=*/0, - /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, /*sep_token_id=*/-1, - /*extra_eos_token_ids=*/{}); + ModelConfig config(ModelType::CHATGLM4, GGML_TYPE_F32, /*vocab_size=*/5, /*hidden_size=*/32, + /*num_attention_heads=*/8, /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, + /*intermediate_size=*/48, /*norm_eps=*/1e-5f, /*rope_theta=*/10000.f, /*num_virtual_tokens=*/0, + /*max_length=*/8, /*bos_token_id=*/-1, /*eos_token_id=*/-1, /*pad_token_id=*/-1, + /*sep_token_id=*/-1, /*boi_token_id=*/-1, /*eoi_token_id=*/-1, /*extra_eos_token_ids=*/{}, + /*vision=*/{}); constexpr int seq_len = 3; @@ -775,6 +770,175 @@ TEST_F(ChatGLMTest, GLM4Model) { test_model(model, config, data_path, seq_len, all_weights); } +TEST_F(ChatGLMTest, GLM4VModelText) { + fs::path data_path = fs::path(__FILE__).parent_path() / "tests/data/glm4v_model_text.data"; + + VisionModelConfig vision(GGML_TYPE_F32, ActivationType::GELU, 32, 28, 3, 56, 1e-6, 2, 1, 17, 7, 8); + + ModelConfig config(ModelType::CHATGLM4V, GGML_TYPE_F32, /*vocab_size=*/8, /*hidden_size=*/32, + /*num_attention_heads=*/8, /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, + /*intermediate_size=*/48, /*norm_eps=*/0.00000015625f, /*rope_theta=*/10000.f, + /*num_virtual_tokens=*/0, + /*max_length=*/16, /*bos_token_id=*/-1, /*eos_token_id=*/4, /*pad_token_id=*/-1, + /*sep_token_id=*/-1, /*boi_token_id=*/2, /*eoi_token_id=*/4, /*extra_eos_token_ids=*/{}, + /*vision=*/vision); + + constexpr int seq_len = 3; + + ChatGLM4VModel model(mctx_.get(), config); + + std::vector all_weights{model.word_embeddings.weight, + model.layers[0].input_layernorm.weight, + model.layers[0].attention.query_key_value.weight, + model.layers[0].attention.query_key_value.bias, + model.layers[0].attention.dense.weight, + model.layers[0].post_attention_layernorm.weight, + model.layers[0].mlp.gate_proj.weight, + model.layers[0].mlp.up_proj.weight, + model.layers[0].mlp.down_proj.weight, + model.final_layernorm.weight}; + + test_model(model, config, data_path, seq_len, all_weights); +} + +TEST_F(ChatGLMTest, GLM4VModel) { + fs::path data_path = fs::path(__FILE__).parent_path() / "tests/data/glm4v_model.data"; + + VisionModelConfig vision(GGML_TYPE_F32, ActivationType::GELU, 32, 28, 3, 56, 1e-6, 2, 1, 17, 7, 8); + + ModelConfig config(ModelType::CHATGLM4V, GGML_TYPE_F32, /*vocab_size=*/8, /*hidden_size=*/32, + /*num_attention_heads=*/8, /*num_key_value_heads=*/2, /*num_hidden_layers=*/1, + /*intermediate_size=*/48, /*norm_eps=*/0.00000015625f, /*rope_theta=*/10000.f, + /*num_virtual_tokens=*/0, + /*max_length=*/16, /*bos_token_id=*/-1, /*eos_token_id=*/4, /*pad_token_id=*/-1, + /*sep_token_id=*/-1, /*boi_token_id=*/2, /*eoi_token_id=*/4, /*extra_eos_token_ids=*/{}, + /*vision=*/vision); + + std::ifstream fin(data_path, std::ios::binary); + ASSERT_TRUE(fin) << "cannot open file " << data_path; + + ChatGLM4VModel model(mctx_.get(), config); + + ggml_tensor *images = ggml_new_tensor_3d(mctx_->ctx_b.get(), GGML_TYPE_F32, config.vision.image_size, + config.vision.image_size, config.vision.in_channels); + + const int vision_tokens = model.num_vision_tokens(); + + const int seq_len = 6; + ggml_tensor *x1 = ggml_new_tensor_1d(mctx_->ctx_b.get(), GGML_TYPE_I32, seq_len); + ggml_tensor *ref_y1 = + ggml_new_tensor_2d(mctx_->ctx_b.get(), GGML_TYPE_F32, config.hidden_size, seq_len - 1 + vision_tokens); + ggml_tensor *x2 = ggml_new_tensor_1d(mctx_->ctx_b.get(), GGML_TYPE_I32, 1); + ggml_tensor *ref_y2 = ggml_new_tensor_1d(mctx_->ctx_b.get(), GGML_TYPE_F32, config.hidden_size); + ggml_tensor *x3 = ggml_new_tensor_1d(mctx_->ctx_b.get(), GGML_TYPE_I32, 1); + ggml_tensor *ref_y3 = ggml_new_tensor_1d(mctx_->ctx_b.get(), GGML_TYPE_F32, config.hidden_size); + + auto buf_b = unique_ggml_backend_buffer_t(ggml_backend_alloc_ctx_tensors(mctx_->ctx_b.get(), mctx_->backend.get())); + auto buf_w = unique_ggml_backend_buffer_t(ggml_backend_alloc_ctx_tensors(mctx_->ctx_w.get(), mctx_->backend.get())); + + std::vector all_tensors{ + // vision + model.vision.patch_embedding.cls_embedding, + model.vision.patch_embedding.proj.weight, + model.vision.patch_embedding.proj.bias, + model.vision.patch_embedding.position_embedding.weight, + model.vision.transformer.layers[0].input_layernorm.weight, + model.vision.transformer.layers[0].input_layernorm.bias, + model.vision.transformer.layers[0].attention.query_key_value.weight, + model.vision.transformer.layers[0].attention.query_key_value.bias, + model.vision.transformer.layers[0].attention.dense.weight, + model.vision.transformer.layers[0].attention.dense.bias, + model.vision.transformer.layers[0].mlp.dense_h_to_4h.weight, + model.vision.transformer.layers[0].mlp.dense_h_to_4h.bias, + model.vision.transformer.layers[0].mlp.dense_4h_to_h.weight, + model.vision.transformer.layers[0].mlp.dense_4h_to_h.bias, + model.vision.transformer.layers[0].post_attention_layernorm.weight, + model.vision.transformer.layers[0].post_attention_layernorm.bias, + model.vision.conv.weight, + model.vision.conv.bias, + model.vision.linear_proj.weight, + model.vision.norm1.weight, + model.vision.norm1.bias, + model.vision.glu.gate_proj.weight, + model.vision.glu.up_proj.weight, + model.vision.glu.down_proj.weight, + model.vision.boi, + model.vision.eoi, + // text + model.word_embeddings.weight, + model.layers[0].input_layernorm.weight, + model.layers[0].attention.query_key_value.weight, + model.layers[0].attention.query_key_value.bias, + model.layers[0].attention.dense.weight, + model.layers[0].post_attention_layernorm.weight, + model.layers[0].mlp.gate_proj.weight, + model.layers[0].mlp.up_proj.weight, + model.layers[0].mlp.down_proj.weight, + model.final_layernorm.weight, + // inputs & outputs + images, + x1, + ref_y1, + x2, + ref_y2, + x3, + ref_y3, + }; + + for (ggml_tensor *tensor : all_tensors) { + read_backend_tensor_data(fin, tensor); + } + ASSERT_TRUE(fin.peek() == EOF); + + auto input_ids_to_vec = [](ggml_tensor *input_ids) { + std::vector input_ids_vec(ggml_nelements(input_ids)); + ggml_backend_tensor_get(input_ids, input_ids_vec.data(), 0, ggml_nbytes(input_ids)); + return input_ids_vec; + }; + + std::vector input_ids; + + // prefill + { + std::vector x1_vec = input_ids_to_vec(x1); + input_ids.insert(input_ids.end(), x1_vec.begin(), x1_vec.end()); + ggml_graph_clear(mctx_->gf); + ggml_tensor *out_y1 = model.forward(mctx_.get(), x1, images, input_ids, 0); + ggml_build_forward_expand(mctx_->gf, out_y1); + CHATGLM_CHECK(ggml_gallocr_alloc_graph(mctx_->allocr.get(), mctx_->gf)); + model.set_graph_inputs(mctx_->gf, input_ids, std::nullopt, 0, ref_y1->ne[1]); + CHATGLM_CHECK(ggml_backend_graph_compute(mctx_->backend.get(), mctx_->gf) == GGML_STATUS_SUCCESS); + + expect_all_close(ref_y1, out_y1, 1e-2); + } + // decode + { + std::vector x2_vec = input_ids_to_vec(x2); + input_ids.insert(input_ids.end(), x2_vec.begin(), x2_vec.end()); + ggml_graph_clear(mctx_->gf); + ggml_tensor *out_y2 = + model.forward(mctx_.get(), x2, images, input_ids, seq_len - 1 + model.num_vision_tokens()); + ggml_build_forward_expand(mctx_->gf, out_y2); + CHATGLM_CHECK(ggml_gallocr_alloc_graph(mctx_->allocr.get(), mctx_->gf)); + model.set_graph_inputs(mctx_->gf, input_ids, std::nullopt, seq_len, seq_len); + CHATGLM_CHECK(ggml_backend_graph_compute(mctx_->backend.get(), mctx_->gf) == GGML_STATUS_SUCCESS); + + expect_all_close(ref_y2, out_y2, 1e-2); + } + { + std::vector x3_vec = input_ids_to_vec(x3); + input_ids.insert(input_ids.end(), x3_vec.begin(), x3_vec.end()); + ggml_graph_clear(mctx_->gf); + ggml_tensor *out_y3 = model.forward(mctx_.get(), x3, images, input_ids, seq_len + model.num_vision_tokens()); + ggml_build_forward_expand(mctx_->gf, out_y3); + CHATGLM_CHECK(ggml_gallocr_alloc_graph(mctx_->allocr.get(), mctx_->gf)); + model.set_graph_inputs(mctx_->gf, input_ids, std::nullopt, seq_len + 1, seq_len); + CHATGLM_CHECK(ggml_backend_graph_compute(mctx_->backend.get(), mctx_->gf) == GGML_STATUS_SUCCESS); + + expect_all_close(ref_y3, out_y3, 1e-2); + } +} + TEST_F(ChatGLMTest, quantize) { const float src_data[]{ -1.1258e+00, -1.1524e+00, -2.5058e-01, -4.3388e-01, 8.4871e-01, 6.9201e-01, -3.1601e-01, -2.1152e+00, @@ -996,21 +1160,6 @@ TEST(Pipeline, ChatGLM) { "ChatGLM-6B,很高兴见到你,欢迎问我任何问题。\n[Round 1]\n问:晚上睡不着应该怎么办\n答:"); } - // memory test - { - GenerationConfig gen_config; - gen_config.max_length = 2048; - gen_config.max_context_length = gen_config.max_length - 1; - gen_config.do_sample = false; - - std::ostringstream oss; - for (int i = 0; i < gen_config.max_context_length; i++) { - oss << "你好"; - } - std::vector messages{{ChatMessage::ROLE_USER, oss.str()}}; - pipeline.chat(messages, gen_config); - } - // chat { check_chat_format(pipeline); @@ -1063,21 +1212,6 @@ TEST(Pipeline, ChatGLM2) { "ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。\n\n[Round 2]\n\n问:晚上睡不着应该怎么办\n\n答:"); } - // memory test - { - GenerationConfig gen_config; - gen_config.max_length = 2048; - gen_config.max_context_length = gen_config.max_length - 1; - gen_config.do_sample = false; - - std::ostringstream oss; - for (int i = 0; i < gen_config.max_context_length; i++) { - oss << "你好"; - } - std::vector messages{{ChatMessage::ROLE_USER, oss.str()}}; - pipeline.chat(messages, gen_config); - } - // chat { check_chat_format(pipeline); @@ -1163,21 +1297,6 @@ TEST(Pipeline, ChatGLM3) { EXPECT_EQ(input_ids, target_ids); } - // memory test - { - GenerationConfig gen_config; - gen_config.max_length = 2048; - gen_config.max_context_length = gen_config.max_length - 1; - gen_config.do_sample = false; - - std::ostringstream oss; - for (int i = 0; i < gen_config.max_context_length; i++) { - oss << "你好"; - } - std::vector messages{{ChatMessage::ROLE_USER, oss.str()}}; - pipeline.chat(messages, gen_config); - } - // chat { // check_chat_format(pipeline); @@ -1218,31 +1337,41 @@ TEST(Pipeline, ChatGLM3) { gen_config.do_sample = false; std::vector messages{ {ChatMessage::ROLE_SYSTEM, system_ci}, - {ChatMessage::ROLE_USER, "列出100以内的所有质数"}, + {ChatMessage::ROLE_USER, "找出100以内的所有质数"}, }; { ChatMessage output = pipeline.chat(messages, gen_config); EXPECT_EQ(output.role, ChatMessage::ROLE_ASSISTANT); - EXPECT_EQ(output.content, R"(好的,我会为您列出100以内的所有质数。 - -(Note: 质数是指只能被1和它本身整除的正整数。))"); - EXPECT_EQ(output.tool_calls.front().code.input, R"(```python -def is_prime(n): - """Check if a number is prime.""" - if n <= 1: - return False - if n <= 3: - return True - if n % 2 == 0 or n % 3 == 0: - return False - i = 5 - while i * i <= n: - if n % i == 0 or n % (i + 2) == 0: - return False - i += 6 - return True - -primes_upto_100 = [i for i in range(2, 101) if is_prime(i)] + EXPECT_EQ(output.content, + R"(质数是只能被1和它本身整除的正整数。我们可以通过简单的算法来找出100以内的所有质数。 + +这里我们将使用一个简单的线性筛法来找出100以内的所有质数。 + +线性筛法的基本思想是: +1. 创建一个列表,其中包含1到n的所有整数。 +2. 从列表中删除所有可以被2整除的数。 +3. 然后从剩余的数中删除所有可以被3整除的数。 +4. 重复上述步骤,直到列表中的数少于100为止。 + +让我们开始计算。)"); + EXPECT_EQ(output.tool_calls.at(0).code.input, R"(```python +def sieve_of_eratosthenes(n): + # Create a boolean array "prime[0..n]" and initialize all entries as true. + # A value in prime[i] will finally be false if i is Not a prime, else true bool val. + prime = [True for _ in range(n+1)] + p = 2 + while p**2 <= n: + # If prime[p] is not changed, then it is a prime + if prime[p]: + # Update all multiples of p + for i in range(p**2, n+1, p): + prime[i] = False + p += 1 + + # Return the list of prime numbers + return [p for p in range(2, n+1) if prime[p]] + +primes_upto_100 = sieve_of_eratosthenes(100) primes_upto_100 ```)"); messages.emplace_back(std::move(output)); @@ -1253,9 +1382,9 @@ primes_upto_100 { ChatMessage output = pipeline.chat(messages, gen_config); EXPECT_EQ(output.role, ChatMessage::ROLE_ASSISTANT); - EXPECT_EQ(output.content, R"(100以内的所有质数为: - -$$2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97$$)"); + EXPECT_EQ( + output.content, + R"(100以内的所有质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97。)"); } } } @@ -1378,21 +1507,6 @@ if __name__ == '__main__': // EXPECT_EQ(input_ids, target_ids); // } - // memory test - { - GenerationConfig gen_config; - gen_config.max_length = 2048; - gen_config.max_context_length = gen_config.max_length - 1; - gen_config.do_sample = false; - - std::ostringstream oss; - for (int i = 0; i < gen_config.max_context_length; i++) { - oss << "你好 "; - } - std::vector messages{{ChatMessage::ROLE_USER, oss.str()}}; - pipeline.chat(messages, gen_config); - } - // chat { // check_chat_format(pipeline); @@ -1400,7 +1514,7 @@ if __name__ == '__main__': gen_config.do_sample = false; std::vector messages{{ChatMessage::ROLE_USER, "你好"}}; ChatMessage output = pipeline.chat(messages, gen_config); - EXPECT_EQ(output.content, "你好👋!我是人工智能助手,很高兴见到你,有什么可以帮助你的吗?"); + EXPECT_EQ(output.content, "你好👋!很高兴能帮助你,有什么问题或者需要帮助的地方吗?"); } } @@ -1445,6 +1559,48 @@ print(bubble_sort([5, 4, 3, 2, 1])))"; } } +TEST(Pipeline, ChatGLM4V) { + fs::path model_path = fs::path(__FILE__).parent_path() / "models/chatglm4v-ggml.bin"; + if (!fs::exists(model_path)) { + GTEST_SKIP() << "Skipping ChatGLM4V e2e test (ggml model not found)"; + } + Pipeline pipeline(model_path.string()); + ASSERT_TRUE(dynamic_cast(pipeline.tokenizer.get())); + ASSERT_TRUE(dynamic_cast(pipeline.model.get())); + + // tokenizer + { + Image image = Image::open(fs::path(__FILE__).parent_path() / "examples/03-Confusing-Pictures.jpg"); + std::vector messages{{ChatMessage::ROLE_USER, "描述这张图片", image}}; + std::vector target_ids{151331, 151333, 151336, 198, 151339, 151329, + 151340, 100395, 108627, 100736, 151337}; + std::vector input_ids = pipeline.tokenizer->apply_chat_template(messages, 2048); + EXPECT_EQ(input_ids, target_ids); + } + // chat + { + // check_chat_format(pipeline); + GenerationConfig gen_config; + gen_config.do_sample = false; + std::vector messages{{ChatMessage::ROLE_USER, "你好"}}; + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.content, "你好👋!很高兴见到你,欢迎问我任何问题。"); + } + // chat with image + { + GenerationConfig gen_config; + gen_config.do_sample = false; + fs::path image_path = fs::path(__FILE__).parent_path() / "examples/03-Confusing-Pictures.jpg"; + Image image = Image::open(image_path.string()); + std::vector messages{{ChatMessage::ROLE_USER, "描述这张图片", std::move(image)}}; + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.content, + "这张图片的幽默之处在于场景的荒谬性。看到一个人在出租车后面熨衣服是非常不寻常的,因为这不是出租车通常" + "被用来做的事情。熨衣板和衣服悬挂在车尾,男子站在上面,似乎在专心熨烫衣物。出租车在行驶中,而男子却稳" + "稳地站在上面熨衣服,这样的场景给人一种不稳定的感觉,增加了喜剧效果。"); + } +} + static void run_benchmark(const fs::path &model_path) { if (!fs::exists(model_path)) { GTEST_SKIP() << "Skipping benchmark test (model " << model_path << " not found)"; diff --git a/examples/03-Confusing-Pictures.jpg b/examples/03-Confusing-Pictures.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3bb120c6a7b60646c4b5c46da881eb22e879798 GIT binary patch literal 46296 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 literal 0 HcmV?d00001 diff --git a/examples/cli_demo.py b/examples/cli_demo.py index 6cd3b9a0..429b7f82 100644 --- a/examples/cli_demo.py +++ b/examples/cli_demo.py @@ -37,6 +37,7 @@ def main() -> None: type=Path, help="path to the plain text file that stores the system message", ) + parser.add_argument("--image", default=None, type=str, help="path to the input image for visual language models") parser.add_argument("-i", "--interactive", action="store_true", help="run in interactive mode") parser.add_argument( "-l", "--max_length", default=2048, type=int, help="max total length including prompt and output" @@ -86,9 +87,16 @@ def main() -> None: messages = system_messages.copy() + image = None + if args.image is not None: + import numpy as np + from PIL import Image + + image = chatglm_cpp.Image(np.asarray(Image.open(args.image).convert("RGB"))) + if not args.interactive: if args.mode == "chat": - messages.append(chatglm_cpp.ChatMessage(role="user", content=prompt)) + messages.append(chatglm_cpp.ChatMessage(role="user", content=prompt, image=image)) for chunk in pipeline.chat(messages, **generation_kwargs): print(chunk.content, sep="", end="", flush=True) else: @@ -107,6 +115,7 @@ def main() -> None: if system: print(f"{'System':{prompt_width}} > {system}") + prompt_image = image while True: if messages and messages[-1].tool_calls: (tool_call,) = messages[-1].tool_calls @@ -135,10 +144,12 @@ def main() -> None: if prompt == "stop": break if prompt == "clear": - messages = system_messages + messages = system_messages.copy() + prompt_image = image continue - messages.append(chatglm_cpp.ChatMessage(role=role, content=prompt)) + messages.append(chatglm_cpp.ChatMessage(role=role, content=prompt, image=prompt_image)) + prompt_image = None print(f"{pipeline.model.config.model_type_name} > ", sep="", end="") chunks = [] for chunk in pipeline.chat(messages, **generation_kwargs): diff --git a/examples/hmmm.jpg b/examples/hmmm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..069cb5e7e17abecbb27560de96d56fa7a0f37a9a GIT binary patch literal 144082 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

IrW_b~Qp#-|z{aBmUR? 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 literal 0 HcmV?d00001 diff --git a/examples/openai_client.py b/examples/openai_client.py index 99cadc1d..bad3841f 100644 --- a/examples/openai_client.py +++ b/examples/openai_client.py @@ -1,14 +1,19 @@ import argparse +import base64 +from pathlib import Path from openai import OpenAI parser = argparse.ArgumentParser() +parser.add_argument("--api_key", default="Bearer chatglm-cpp-example", type=str) +parser.add_argument("--base_url", default=None, type=str) parser.add_argument("--stream", action="store_true") parser.add_argument("--prompt", default="你好", type=str) parser.add_argument("--tool_call", action="store_true") +parser.add_argument("--image", default=None, type=str) args = parser.parse_args() -client = OpenAI() +client = OpenAI(api_key=args.api_key, base_url=args.base_url) tools = None if args.tool_call: @@ -33,7 +38,16 @@ } ] -messages = [{"role": "user", "content": args.prompt}] +if args.image is not None: + image_url = args.image + if not image_url.startswith(("http://", "https://")): + base64_image = base64.b64encode(Path(image_url).read_bytes()).decode() + image_url = f"data:image/jpeg;base64,{base64_image}" + user_content = [{"type": "text", "text": args.prompt}, {"type": "image_url", "image_url": {"url": image_url}}] +else: + user_content = args.prompt + +messages = [{"role": "user", "content": user_content}] if args.stream: response = client.chat.completions.create(model="default-model", messages=messages, stream=True, tools=tools) for chunk in response: diff --git a/main.cpp b/main.cpp index 037f8340..bff31e5a 100644 --- a/main.cpp +++ b/main.cpp @@ -27,6 +27,7 @@ struct Args { bool sync = false; std::string prompt = "你好"; std::string system = ""; + std::string image_path = ""; int max_length = 2048; int max_new_tokens = -1; int max_context_length = 512; @@ -50,6 +51,7 @@ static void usage(const std::string &prog) { --pp, --prompt_path path to the plain text file that stores the prompt -s, --system SYSTEM system message to set the behavior of the assistant --sp, --system_path path to the plain text file that stores the system message + --image path to the input image for visual language models -i, --interactive run in interactive mode -l, --max_length N max total length including prompt and output (default: 2048) --max_new_tokens N max number of tokens to generate, ignoring the number of prompt tokens @@ -94,6 +96,8 @@ static Args parse_args(const std::vector &argv) { args.system = argv.at(++i); } else if (arg == "--sp" || arg == "--system_path") { args.system = read_text(argv.at(++i)); + } else if (arg == "--image") { + args.image_path = argv.at(++i); } else if (arg == "-i" || arg == "--interactive") { args.interactive = true; } else if (arg == "-l" || arg == "--max_length") { @@ -219,6 +223,16 @@ static void chat(Args &args) { args.interactive = false; } + if (!args.image_path.empty() && pipeline.model->config.model_type != chatglm::ModelType::CHATGLM4V) { + std::cerr << "image is specified for model without visual ability, falling back to language mode\n"; + args.image_path.clear(); + } + + std::optional image; + if (!args.image_path.empty()) { + image = chatglm::Image::open(args.image_path); + } + std::vector system_messages; if (!args.system.empty()) { system_messages.emplace_back(chatglm::ChatMessage::ROLE_SYSTEM, args.system); @@ -242,7 +256,8 @@ static void chat(Args &args) { std::cout << std::setw(model_name.size()) << std::left << "System" << " > " << args.system << std::endl; } - while (1) { + auto prompt_image = image; + while (true) { std::string role; if (!messages.empty() && !messages.back().tool_calls.empty()) { const auto &tool_call = messages.back().tool_calls.front(); @@ -273,9 +288,11 @@ static void chat(Args &args) { } if (prompt == "clear") { messages = system_messages; + prompt_image = image; continue; } - messages.emplace_back(std::move(role), std::move(prompt)); + messages.emplace_back(std::move(role), std::move(prompt), std::move(prompt_image)); + prompt_image.reset(); std::cout << model_name << " > "; chatglm::ChatMessage output = pipeline.chat(messages, gen_config, streamer.get()); if (args.sync) { @@ -291,7 +308,7 @@ static void chat(Args &args) { } else { if (args.mode == INFERENCE_MODE_CHAT) { std::vector messages = system_messages; - messages.emplace_back(chatglm::ChatMessage::ROLE_USER, args.prompt); + messages.emplace_back(chatglm::ChatMessage::ROLE_USER, args.prompt, std::move(image)); chatglm::ChatMessage output = pipeline.chat(messages, gen_config, streamer.get()); if (args.sync) { print_message(output); diff --git a/tests/data/baichuan13b_model.data b/tests/data/baichuan13b_model.data deleted file mode 100644 index 380b9a3aa96437a647d5df4a606fdf7a080e09c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54932 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ℜr*@TcCw_kBKu+ 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 diff --git a/tests/data/baichuan7b_model.data b/tests/data/baichuan7b_model.data deleted file mode 100644 index d5d05e916638cde4a60e3cd8c7379b7fdd178e8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54932 zcmW)ne_YJz_x@)Sh7BPkEiEk}^d_X{z6?TaNE>34L5K}WXcIdULNX;u!XW*Uj3lYK zkC9{~8A+04BuSDa6~g!R`TpOd$Llq(`#$G7*Y!M#=Tjg}z5{uOGn6o)2~zv{SXf>S zg@+jn{Np&u-rT0DXF8aK9ibK3XGq;VlDwb(B$58N>!MU=d(Hk-COWiNEnj|wWS^fx z{&Fof)<36w=NqV+TSOMV*`!u9Q1i&cu-f>ZHE<1V_MU?KxhRrdtY^Nj2QbgPBgkr8 zLtO(OLss^jNAn}3cktkK-=W>2htGWrto!#TN&oJ`9V2^E!|GBr zQd6Dm(olWtBA5&i9AVkK$g5v0V)Q;Ip0s9_6bbfe_k!=^0x<8_r?~z>g zRN`MPrEldd6e=}%^C@&e}Fhz_(w zK=<-Ad~D7kVe@MY6knstj$dJtyNrBe(|IUO#MC7xNw+nY$DjHJnWQrtaXEstfBa2B zP2*tIEFz2Bdq_2O0z|jpGPIq5{_0`1JbX7yVtbR-mRQI>NO^qZYt&Xf<5P=XkY;PW zM0e8;_O@k^7Q80eZ(3%)_#8CuLr9eKlIy!SGM`~7sOoYDag$2n8`y)@{u=??&#Nf> zu!3yX%;my8min{WS%-|7fJ8^ zC#mgv1SWQ05cIGIR0Yv2Mm7d=HVZ2@JwoWL7);Q{lghW8&dz&A{u8^xWndW}7|bay z^E2s#8=;e|WlG21v@`uYi85T(y-q~qY`|VJ?i_&;Q&Q35`2_NrJ0y0-$Dr<>N%Sg| zN*+I^m|Y@By}h9_?arOPRzmcyH*Bti^TM4A$hYeT-o8T)-(JZq*QJFtlkU-2|GSU| z^di$01*B-5%-hR$!n^qei8L%*b+L`C8qc$u`bPME7W0J22jn(PjKbU1q%a9$rs7ua zb21W&q6pOIj-srqS}1HTF}sU7$hvrfQj@m9`^zS@&D7C^li3vN`X1&Z7ecY;2GuS* zj-Z0eM*s7fyo@$b?TUNMrfV~|I4~c+FVdN|Y(I8 zpI1SDtyZ0M>L3g7n@RPS9u$ClQeWld6RL%-R}(9HP>w9s6Rw|?s@4Zzm5kk0L|s?D zf@X+bQqiXx(t~gKRM-6|-cb*`rwuR;Y(UM1eNfist3`Fj+;Vy z>6&g)(1&->|6af}QG1};whxV|%c(FVi+m>pQuLc#(q3z2CEv!Q+^wC&7lU9Cbc#}E z_|Sn-(U3ei3h}m|unoHc$Ko`y2q$&jo@+FBb}~7iKMYm1JZZn);xOg0yNPU$S>gv{0|H7?!1=bljdQprj2&qc?q|yKd5@fGwR;+Eb`=m6y_QLm&!J7 ze@-~hO^>j|H38y>>!B|UfRp1U6yLrJ(e)x8J*xzo%m`}MPlL{FIE?&GKsq;0GCJ-8 zDUvp_q{IFwy!94Ixkst5{}EVx(6Wl+c4Q4sZmkOl@F)jA{-ip>}Bw$#?!#8}R4w8rXsfRiz|t$>Y^u zvmtUg3fHbjsCH#XQVnb6mDdizY3NHP+ZcwF=Qm;Ox|@8s87kbzpgueqvQclzCNYEg zOlPnwdBi)t4kg{xpWMq`c$X13b6h6&CZ9i5q$Hsje*vveKu_@4;T!C@m?!`5Ng~HnB$YxjgXC?{wDVHASz!2J4hV zh+OgkPSJYqRMM!dkyXPL*9R82T92iN3?@J)Rma87xJC5w@+6d#C$mwAR>J|SG{==_Q=G0u$JzvVr zN8d$OHy@IY+rb*I&t_(i&cmk4g37Mfa+}X$=KcI0b01!anD?<<)OdVS?fpCinBM0u zBX_U@%SaL}J*b{KJq4O$qj^+J2sQ05f+|l8S@2O7^~#fCJ|}bS1V3v3v5x$m-qPrL zIhs4ZCcC0n6t?a&?cH)0$`>Eiw*L&LPCLFL^zsoZjJ^aHe+z09deed5FOhL;GcWrj zB6-?kwQWflg^c=>Jm0=Vqs#yGrk|vwf3Q=L4w>f|xct41X+`^3MoSp7f31d<+h{V` zF#ytY{dn^SXLA1dA1sEQW)>oqq@^jBQf13gs%b~w?sZh_nMYZ(YMBN@B<8FADXH6O zCL5n1X^iG%E4fDNzP!iO0Wsw7T}vL1`%|Oy9W;HoP8t_~lqCEK-w7L7Z2wq@^uK1? zY;oYK16Eu)s2ewN8ccl$-9qH|(-2RuWwqsUsu_?DN4K729;c(mZH`Q{$B~P6?R8K+ zH)RDKPgBF-6j;3a!5WJ`!p8L`&pS7h(h@_+`&AIh9JWwu#|30Q;|hhY`NBd>|3{*p zPbKcRt06J{K>CV}6ta+@Z%HJLeJ1aFFAF}J8ZzzB424A@vu^1{wv~ZYbmS>D4%|e_ zrD?4F_o1Y^Hj#_xY(o2#C*&U5h`PZVq`p~*xk@!wWW9&whf*lh^HDkG3{@tCB0A$b zNk98AD{&-AS07W$`(&!yS}J*D;$CPDzT;9!cZuvm0E&jHC^UZrdFMFpGoRdD+n3Om0B zR&(VlH217|>ZfT)35_RFwH*`99}nl~PmnAX{(tl-=H8$uQREDX%p)2$#i`7u%7^qd zl@hC=k5QH$2lI$c)c(MfM)$c$;TFXYx^6n1`kPBEbi$XnNdkRFT*8ZMDR|6Qc{5W@%e5qj{q-^kQ`7%UII zr{-l}Nw=beB{@9h0k5)=*8TyS?Y@$j;qTG5Lcyl4*h{kY7s+l=F3azcLZQ-p?i#q8 z%H0d0FD>Nym(j4>BjexSl3Wkh!fA;S*)MoU78z3JYwf_5-nNMEJDQ?`FOp(`1Tn9# zBG2ZL&|_;!^rQnT{5FRy_J3qbgG9B};sua=pO4g&sighq2Al`9LGvzCl2V;Zs_;Or z(HTjkfA!}TN0j8~7X-COIQ)-ZgfkC?%lLnBmNmk8@(|K@X;#Z~=8;|YY6_gd(Y7?4 zW>h7?ZT2Ht{pBb+Z7D>$#WV7r@)-pNSA;s?L`CDn5%%9(lJPjTWn4Zqw--pvqe>|t z`Ytp0o=sjO0^k#z4zCfPNh-`i$_rj3GRVmh*VaRPswYWL+M&4MGVHg?DgMR}w7o2# zhTi!|yL|;FYC*H!_`$q3{R1BL%`{FCqOu-Z1IZ526FNQIq?W6fUc|YWfeJIkEzx zFCukg*>LhqK94w~kJPs{mSp$jYW=NfiRRNsRQ{GhjiVBg_DD}&rz>E5E1e3H9U=X; zLg=Mkc-VRk43@@{#eI@^&-n-5l2|e=-9Sk@@A9#hAK~`&8mSH}hGgww3Td}OTd(t6 zx%51D`!Aaue^jHbrCO*%^>DF@W%>a$k}=aH4D0|`!9FM>di~YZ^y&dU?UYJhXAezP_!f& zqD=uzS}}&F?%Ic}>-8vAzd`)dRI0vM2gA;LD9YEAB29CV)axyYuYcj|0;*9pr=C=Y z{J3<=VfD_4AEY=ZL+GPIZd2n&V$<2=k>3mTzA|#ISO#%K9{-W@kd#&->av-YWWB5p zG6uPzIqoY(PER4@H}Nnm`GMLW^AWIP6IuRqlqy$5Vc_snh-%1%>|iFcUax}7yHcjf zxxp+lzo=c8?S|4Jf$1iFXU^Moh@a37(W}!AQwNu#ZR|lN|8+BSKTyf4N~2KF?>PBJ z%wSPNl9BSPnW`T|qSh=HwOO~I>VKapC6lpk{uvzjwFdDo4v=_N61BIKla#)pJgfn- zGipk|U5l;HW6`)tIDgCMkjIX%RFb%lJYQ*1UtCS{xu3aa$Wuw+uw=6En~H$*3gOv? zGGqBziffLh)xI$__U9)-Ya~h%dX$mqpF@(EnpQ;b`U$zYE6={FAn)UT6k_oVvYuVZ z_ktnUG}$oU!c3~Se?o&z^5FXS1ypXhEYzTINEZvWw`QKYe$Fh4bou~M*NgVX8zp>% z-*c!#H5Bu8It(A>k@U$;xV%Z=4Gp1We0Z$TvrdtB^xr7WtVhQ9-$`U!3FZ3p65W0= z6YIZm!|;4G)&UB?H_Y{EElQI!Xl(Cz^7>Sb5exER(wm_=Bod+=F;%y8qTILF;rr_< zp3rg#Uj5Ty;dY;Qf07B`Veg^;eqEw6`N@303-x~9dWx~#N$x{_a?!N^vCxs`h_U<* z-wx|}`D#vzp@VqbkrJ{gmXUGa6->H#DtDZ9isTKK)ibgqaq2<{0*03`(ZvTW|L9YQ zM(xb0m~jC1dpL?$9Y?K~f;j~!;Aa0EzW=?1_lY{xx@0noZ?;VNH{QIf?kx z9QXYhykh4JYMxw%q~G@PvfDY#J$5sN)z2hT`z&M)dB>av?Pen7Rr{cJKeG6js|_7( zDBk!l*!|-{z1E)~Yo~4`%QWK|N=PP3}$6o(Y(d^@W0CTSz~`6-9UV31>5jLStuAnf+x-FM2L$ogI>>$*0jc(3m*| zg=2zRMX8>Dk>Rd~l)8jSUM75#5nZ|WF+DfEI-E>RY7ur|3yBWcP}sBtlsr2r=<_?= zyWb0L`C}d|{;Gssup{=~cu3Xt&tdp25Me_9Sy596=iCL5cI+sr4cGz0kN{GCTufHC z!pXh!H45|SNZ$2tx%V{>+WNPi&PE-F@u=g7-|&Xa3=UFAoiDj>Ph)D^-N>7K0&T77 zaGPa<*-vwDc1JoX-3M~jUk9PO{)I`5vdQk1H<{`T$*64>lK!dT2EW~-knz9K;4gB@ z+S8Z3L;rvxVK{Wh!eI2~4vij?M!w%w2)S^9O2^-#&`L`RE)7Nb|4N|DJSB0Nv5KoK zJyCOF7x|w1!Rto1An{6seWIjA6U`QwvuSsG<7al}|s2CPi2Ha=G z9q0?>ROR=I)H}^#oO4{5efn@!)pIUgZlsp~Ji+6edz13dFR;1Q5usi7QgKBZ#D-^h z{JLTinM+yU-p{DvND|yjcal@235g7C(fI2CUa;;OS*#EuV`Sa)>KkH}MI|JE%>Y0(o5|V#4C6?QRf>{~e9` ze~O`E4rKB7PD)tx0eSO}l6II}sB>oIQxOQq3u9@j0p6mv6)O$a8pX|3XQwA4tAFH^=R4AW0wQbCa{T zNwvB=L<0s$M3HIsMI+l$uGYf-@qz!z9itqg>?&c|?4bD<)0)UAUVs zIRf60qdjVwK{j`OvZ`3n?eJ^}_q=Uy&yHn7S>voI7!668TP2 zON^{xSk;&MhKJA$mkjbAcn-?Q9puD)xCgqdD#1HX zXLAGE$#qQ`QaAq(;V~unarZP84swMk?Wo$K_hLTUaw+v&b}{E6wHQuLo+ouZ6|G_HJJRaPcwV9<6}&!4Th|nl$N7bD z?z|G!`~6{7^%e~-*ARXsTbRel-sVU&pSmTIj2HdOJyRJ0PQIY{rK=Ewf1p47 znRO4Zd-&8le9r%hm;X{YdeyP8c9x&@Yv$j{kVsjT%{4gimW7nv!B#(Tjt%9BTYu?oGoQyBDGxzyfu)CK)(m(!H z+h~Sy+a7C>@%l0}wH0d7@GZ>vW+(D4Y2o$HWaN8SsI8CYqmz3C4PEnr{4Xgesm=}V zM-F54k~&g6?#xQ!uF`?-$4NJMGASx#+-CVz*w`8Hwzn#>kP7}(ry%$(${^pwQIv7) zJG}O-NBz+YX!aAK?S5a3U73uKp*tzVq#hzkEmt0VL-MQ(4(;#0!Z}NWso4rDd%b~d z))Q-=ltzvrQ=l0$m2cgd1Mj|}khTq#baKvvVd&pveOyLaSw^IijAu3$#;kfe>#5ALPE1}Y@u=H#2#UZEirw>_%6|DyF(<;f za`+yu7JH$hpACE>mqN5WOXBrgAJ}voM6rT~HaPhVjlU0NX0DCoTb;~AbLaDt21ghO zSz+_5M9h8?59hlNNLLp{?gx$w=RBT^D!*r|W*RcxNn*|m8%cU=I``h6&f3=)li~h- z$SCw8+0Z~^+Y=nMC^4 zB|Nr33uDO?*0?m0YUe0ed;e4LHonY6-tQeMPehUJ_sI|&2wG|JHPWB*;6gQI`Q23H zEWQb6(Hv5|ddMB$ipZsO81t^w!cjbjM2lT>lu|3MIXP3kbM||b91etCz***a$q+$@ zn*nMiyESjI^;SNKZbS?7&r&+Irx4Mtm&h~HUd{3?dapZ?^rEGjiUQH~AsIkksyeBri#4TiaX3HjR(qOW5v!KimJ+^^kd zzMDS7cl3Ykhk@V^+a6 z;og+GQT5AY8v7_88LtYU=6zth-iMkG2g4-w5`~T>GM{TnH9{7nvevWaRu%GRmqMGi zlSIF*XWD7r)Z!Ec<1TC1*|-KY_7*&guZAS=lrPbHyd#<2KDB;MKc44t2BujjSX*v7 zR*w>Dig6{g&pSdU4ogY?zhFU|)KF%@J8bxQhk}ppgUi*ktmqC$n7KJ>b6;|w_URP1 zT?%C%2_>!UPEm>L5qC`ZJs%8J*Yr@3xTzNvW?Ks1<2@Ip>ayK)S3_kccsahS$bb7U zq?qU$NWbQLe#)zRMA*NHMf&d{dFmoH0HqT_Y@MP#_*Wa z%}kX117cHCvdUeKhIe_;U;01^F0UZ(bBJku0!ie&NRnhS7)qh;wlAn5b>2K7RUexuAgm&tPALSzqngBc%$ zURbb)#pwPelk>aD#(x|OlbxZ_)Br2%UPVpM^FG#xSNbc2wCKb=eRQ*M2c#x0WrcBiDHY4$~Dju?(L9^&Q zKQN0(Q*n)aJ_xx|?tR{FX-_s&)45ZbMDP$_sx4Ov{b%VGhm1e3V(7OTGMP03^;QN% zy>bNov|1gbw}41$z!g4Ud0E~bs?3Uj+yCYh#@3N2e6hpaPj?ZeCkpA13+J8lX~Kl- z5UFc&X7A5J#?PJ9cs`PMUz!2ao}by!-Nj_Lc^X+9Ijy!c+5x)smi)3}sbcD6=%NC+ z%G8FJyxs^=MIW{DKQ9VsScjNJr0u_O(Z~?)l9$Eh^bTY_zQy!0RnWb-#C_^4sjcQA%TGQ`zN_q5hSP7b+Ia-c zJ-b7zm63Q^FVs%!MXKo?X!JWF^M3w6h!(GBssb+>(fbk-{;42+VmujrvnRuKpJ2K? zpV=HuWaiI0K!0wpS~Ybd&ok_Y!Nn)3tjdeB?#_ct^+3LLVHuS^R#KzMC`!+MK-Tw` zQ>PK%$addcXq+5L(=v(a=gOJN^E5Ymra+B6hhom%X8QDeNuzEXNsCvh+s*#QV8v$y z9Cm~CX;%!s)db_U`w+gUgv5g*xK!>4kIzD8vM`fum*|jpqXgOucbFo=0A+o?Fwwug zDZ%a(4a|H(`u9`FaIQJEj6IGSaR*U2*^H7-$bsue=xnEt2vem{m{yOny3ZKw_Xsoo zOd@qaE#c1^fj?NIw%C%QR&HAlxxo_d-f)4XMO2X7e}%+%`>#CmMhXTF_(*M0rx5n1 zjDnOMNOSUqq-@-EW;}K!cc1KsxSc&I=xQQF-zMjDdbNi{nO185#6gts`!345(39L( zE(9X-NYr1I6I3#r#x5_Vj3u9_MXjeF53f<#>7P8Nvn4FdkE_L(PBNF}FHlyXgRyuA zb8k+dLaIT)t0QdgxTkRcnol+R&kGs41PS7&NKG7uu@@dfasLzvN>T7Z*CKT3Wikld z1FHk^)K%4puFCI_SB>ErHDA&F@B`8}DVXuvTTFM)8nVX8P%Y_074xcb_F60~H`|hh zDwDR>#|s+Kk3#*&z|r{wnXPE0X6;#0Xd0;^S(r6{?+)V;-{5^s&G+_7f_#<-wJ%r$ z=|(rTSIc6mUH*pIwzeYUqzUQjH<2juC{k^HA(inCTCuPZCgrQidQ2UK1U-N#;Rva_ z1PGdJG&ExaV39tEjTUNN*Nq&y$d}x!_$MmyBSdq(c1=Ze3 zfYsO#-l_9rAE9X zeN>%Vl=~^(>S2w3@~L-~87+U2OfF#7~!sE|iWr+;TtMW4v;XEqwV z3aPq7AFSyAoTgrSg4$l+U^TrN(wK0jv^yeMQQAyS1MCD&WjPCA(P-}RnPd~*NW^11 z!!~Xfto`4?;LBn1+1HHrqzkmc<35^lGlZFSFrDpomsWiI3VruN7Vj|yu19V|H7bJX zMQO}EkCP@apZSG1QH|i^3{8GW+E+86j@S;H?)!M*v~K8I`-xI>KO^g{A5;rt*zC$s z1WY>24Q70z(o;fz`|yC5ZCC>FgJ*f@_HD!-O=!n{DgJ{?98(62B*thrTdg?n{<^mZJT&BShn7IfTvi71*B` z%KY^wdF|N)&9Ld*(q#<=jMbCY@)>X5un`&Bp>W!6Pr5KSXr^Cg?vXcG*^)5Q968H< ztrm0n$jxy4D^y^Rgx<1xuG+=DD{TLhlFik1tlecP~@E!kl0ct$-l$#fYlEUu-#q_O*{_+`A z{<4e829;8!R`83x-m8PdE@0=r{iN?doLAeLkhXa(jP`dBvI;8{H9baf`aLKg@4$-p z4RG5OLN#Aw1)e0F>g8?Z)4i|27LBLS)o*xNY7q|^T7aM^!JG2Ug8%1%3G9MS^I8)#)JL46glkvH`sqtD)lZ>L2Oq*lvYUl> zY^PoUIY?oJ^dm2WHarsMvl%}n>7KVB^RK0*o1aL&X&WE0a~By0{K>ZJuR*@@Go=-j z!0bgLojrY#;%A&9_~#{5Mm59B(1Xe*N}!p)i|m}H zz%wO}wEoY@WK?IE_@q&Gz8*`AE+8iM3D-GaMtKK;T6)6s*GQsXaE9 ztp0bDd3m{!Ve~5K{yxNhND9dM#|J2vXA2qJP2SQe29}a{hm*>aK47@3Jz0Y z-Vh47vgc?BGF{XFaZ3*CG$xUfwgmIG*4=z>*J@;){Eb4!tfq>^ zflv)d=k2r1&~EKb;++q;Nb^!{I^`OYf>Tg<^eRb5CQI6vI8bEOb@F|gg0h=4;55Dh zZQpMr-6WD?o}OV=f7_DO#{v3_Wo+H_BDBfsxJ{?c+&JwUubTHAb_cV_eN_dCYe8x1 zRLVFdyi=^etYln+o#O=_c5WIueKI3oA;Zo$&ZZRyzfhyiU`VeRL%r$&8jj}Ej3;?C z;mSjVbT=Xsg#-(|n@D%@Us6V$hjQXMZZXG|x=)Fw$^|X(HC%znsRghb@Qy2=k3iOi zO46s?Pr*Of$940D>dwhH~aO%h&o1l67! z(Di6Atftg6x8J*yZKE)61dq${AJc<;kN?L+`Ac*3Hor61COLMpI{X;_5nGdLs8p?? zj0g|dyt>FUdMBa0xm?H;#STesU#Td6KfFqXIpWK_95HHn?c6!gss|#;>^Vycm%_5u z17)*M!)bREDIb22=ryO*JG)mSH0cH}x*h|IkB`apN*h-E{fIQ(*9iXQ3&;Y_s5iVg zL;kK8N!d4%$5fZmLbqg!3!R0M>t{){I?uuPixWAQSCjJBZG<*iRsK$`Qt^u{X49KPMH9Ii47;Z1tVPVh1Fn;e0{h}-ChAowF8PEie zS2ZveW<4!ABSu_?>Tab7%&sG4*%+SmBoE5-Ca9?Ei0Ttsa&P#~^uZIztX5zfJ`UhB zcr3az>X(YllNUq79N zjbklOU!+5TuNPL_%Ok^kg_I%8M1@v*(x^oW+B20-yo*rH^{URu&=*ETDLYXU1Y<3yhjt#o>4%b zXm0U`I~N82B8e6F&aJCIlCfcD@;BOs7_&HmY1xOm({ISG>m^FPIGg0FR;jb?!yxa+ zxZc#BqNNoSUU3D!@0M{zucv%qzc{ieUXR(a0>^)N7c>66kcp(xEX-;e4L(&(<{Knb z^?L*sUU&iBo=)6EKbP$Okn`eLE$Ls^!SuD5@cU!5_gBLv_7IasujV!ZZd~d$j>(p^ z@pU79Qo!*D-Zt$M*IvBFqfB-Q{h*0lj~*rK86i+^@gq}#Q&AVr}i(sAnNml2c0h^ySZwp4$p`6F^_q1cQZqzws?tdikWBpiY+;Oh?JCn(m|0~qQl`JMM5|)?llkuPhY{TAL{k#P$=6oZ=E`C(K8DxEQGdW44n6%kc;FxkG%DhaJ7PKP%(kaw^K1wM*jgV^F zs7`oxweUZBbv+Kb__IUHZ(-2PJI%H8W04|L3*P2`YPH{Lim&a2;JLdY{d9)Y@ ztqtQY;X@Jj*$=M2|AhKqcS;>I1`T^2P>`80SNfZgRJ$K|bO?2xLf;d3A;yO9cR+elL{1Fe@P2>Jw%H2H-Qyw<)Y6{aJ=meQTuluzh*6}H!Z=Bt_sKp zWaU_edsABXa;p9-o>F$+B*j(@EM|UXBetdsp6NEGc-l?K=0^+sh>2uL$MZbq9b$@m6kG_{eeHW#8HDO@p4U>gsWGpi}-kk6gOhOQuJ=XD`t=k2U* z%oN0Y8BbLg(vh`B#g$1qF4}!uJ$7vgNgugz)7#I4XBYM&!XG-gT(%Q5d}p$Iy`M{m zeub#KmKV7`gm|G8rCXEWbEp6-Oi#n~!5K2nn?|dZU#ZdlD0hq)LNR?T;bHMw$T%WM z?$gG6Plscj`T~@{epDNcwj|}YQj%@>gIqsEVDzLk7<(GAkli&D(&ruAG#XNeUxM!H zNM=m!LJyk?@n0nruy-vL^{s=*PM_nOmW14wAE61pC4om8Vl6Z@yXPKizI+93R~jfp z^Bw68RVchJ^pT$F>c(XvwouSI{vq3`e5AlJK0D5Iozm!lQ7c3{k0b15Jeh9a&-UKG zOzn%S$R*`3NdKqiW;NkZ1vQaRRT5=w*Rp~xmk}BzA?J~+pz8RPdymWEs^JC9q~k;i zt~){n2Zd*U@`Y&bb+SoW0OwN;G~?8FXqH+_e0vD@`SV?_e*Qq<11zE2UBKkY=U8r3 z34Fs6NfCX5Z1=o`Vw@Lg@=!$pfI$PK!x?_m)q<9`B2c*-Fzl*pob zB`Mk`F+1CZ)K|!Z{aUj~)FlsXS(EAOqDpjHmo0EWpQ%L9fkpwzFuiu3Nfd9P3L8%i z@6W@%n-AGN8$!+<^2qJw3zYN-LzKmD(3R$J#YR`;H4dZdGg^rKN5P`=8A<9N^T=gV z2a@f23VHY~byZ~^l{{ZVsf&ZiaN!EX3jKU=VXNRPmC@`jkx=dF%;!!$Nwq@GVjkFw zL^Tf_%x1>JvS)8XaVtp&1*%2shjHbE$CNdtoPJDB$LxFW;U!&3>h^ky+PV!^37sM8 zxzAz7mtz$2XJ;sOZz9F1FkbRvCG5Q~Lv~^b8|b1Z^{Q8bj~hp#$HOVC+*|N?Ua(Vl z??IlSpqQD4kdzvr`N>1F(Y|>^gcjkt9LPv#5+*GOsDv!Dj5Iof86|{ibN$jFuh;On-U*Gb?*){ z{hy9EJV=4w{XPr*cAbljlPUGbI_R%>@fD3f5RNATOI1dVVLeEiIh|rsBYDw?V)EGb z1BuhQ^0{`q+EZU+4&Ty6MD>>gpwv!c-U2%y-s=gC{cDNO)~!@o7(wx4 zGAO7-LW%(rvU}g1LRw1%ZsBLP$nQUiQ{PcAeRK(GBLf=R{E}qDZ>zOCE|bRpI5(Gc zA$iV3^@F?uHHM}{)4B=ADC)5fjTn(eR>5C* z_hF$(I(nAr%xcM6(-q3gBba~MG}<}y2&(Gx$h#<3@E86fn}zRL#nnuzDX2u-EgfVv zb|ldo!(-7+ByAJ+_iz)wVjX2|sDbwPEfjLL4@##WL6=y|+=Dzw^y@YU zyBz~juFS^VfK(C%gp%yEAKd&$Qn*n2DjpoC!V#7*xbp}**GHjoP)D*^e1Xm0l7;S% z8cFKW;W zx}xIYPcoICCGo@{DCV3YniviXeK-#-6Ex1E1M23RNo2E(v9P~R!QkyDtUh;~+P~eS z=;nPS?KTppGLEBq+gZ|le5Ur*c`=tE%Y>Q0g4x6_XTFKntkcU-h-fTC8Ds5Z1drQ$ zKpQVQ8U-o0mpGjec53X+$fQbvp`%mD`=yeF{N)Qp?7v*sua#7&WQBd_5&d}|299~8 zQf^=^`6*<*y&F}hoq{^2kff3_zOMf_YFiP_n^WJD&V!TO?g(0X3p`=SHEOID0#j`z zX1~rNMdy0n7<`4=cj*!1-^Oa^qzRnkWyx6MTVz#iLXEF{$Y#e&VXxu^EDw!Atn>-W zhenfu&1owA{ti|*Z!(XLKCo?ahQjeG+vy=k*}(@W^s%IY-&-i`WDD7CaEHr|ldS5_ zXZq2sBcH!p5j!aso;G_>IKu%mnxDbqkHIAFl+Em5i|!GhQ2XvZ1?2sU+P_QD_;4$0 z-nIl5-iKf{RL@38vM4Pmgt~sJfbM_cBszYA^_~6!-ug7O4GqQY<6#*4M?O{ka}#>| z*UWKH9P&pWAeUAdvm2VkLK9!mRKt5T?4CZZD?<3=;(Emc- zbE!6!3WSu!W@Z&7bPX2vN-MCTa}}g|8KUlXhGa6)S(D4CwwM7UjG&CC6JfD+ILmT> z#^qiT7FD$zv_OT`QG8R_$1tFz~%L;7O3+T`a(8XEJCvaR1yP4Ye( zJhm2%9*sXCD0st*Q=qn;0q=ubp}f0Sq8hr4H`|^QIMS7{iH_%1kAz+_W&{E~ zpHbE5=Yp5Nh`#Pq!ouE~*$o%=Vaw+-&w0(LSiFh?E~`+TE!>L_>jZS~6xkKdgXY{D zR#tr$emezzKKUD09JZm{l-=ZiU4)=sTBtwyLDS&@?D_^#-V-f67r!Qrg8*6mQvm(1 znG#j>ez*?~VYLHwP?~AEG9gS-(xsg0x5&tPct>j3c8hGDeIe!Q5LW#ggVW+ye5dd{ z)~C0T#pux_Kf@j3wsuEI#w8ljL50E#!-PHXbk=z5B6K&}{Ng6uU6LW&Wh2xabA zO!FZDF$)UF#_}^uon=bqe#6MZF`X<=2tJnX-|HrKFJP?wGfG!IBj4ptywFPESN8|Q zu`rR`1f4Cr{+8n z95fdus%<=f#X|ERm=XAcG=J1n!s==vUppa@iI1|3dosxF??HWi3U#$qqCvPbhTBe( zbnhl+GUO5(4?W_(6O)LvC2*R2jE5{f0bP%!%y3HtR5rmpJwlBomF>u{Z=rO%2HN{i zC51fyO7g*k>3-tUDyj!9Ig91f>--*{nu z9(mnzCd*P`m*wlPB$jO?`#U+pzS1DBI53`#wLJ>=)-wuVKZ?%BFUItH<0CCe2z>})w)G>l86>H>kJ*+ap(V70mez(4LXr%UN;DFZWF#4t zBuVPIkC7y{AA=-GMnaMd(vDQV=lc)zdNt4U-1j->x~})ZqN?v`LFbFnw<}CDX%qJr zCV}V?WfpfGVKv5Hl%r2W^WB`=S1g3QgN^7p%NI=R)0oC)5|4em3pEw>Y;4a{&~CRB z6l-dk{Kq_QTHV1VV-5L4S2c>njrOvLTT=N@8$NjPE3ka3g!+qpp>VDfR|( zztRb^`Lnt6?W5rCt7Pp1KEdI?UcvIJSSYdc!TKAMK$~j-6<6#)Qaqb0C?le~Hvqc5 zDnP}KA>6fv?zb}+rJ+TgIQFC-WWoK}Hu4LrZWKd<>}9nO_wotL%)A77N#W#&Uw}SO7K3h5cZe_4L(85WC?9?R`$eRqZe1!j zgbvso_5$s#O89(F0mWmU2@_w(K+!P@oS)Q!ljAweInn|J-^#(W|1+-tT0?XFhrIVs zG3Y+Um0Lz-P;jnT@4fxfhW0`w1nyy}nnzn-& z`ydcnlc_G%oCVS4H&_+35aVLb@vQ!LNay(v8g$Q4WyMhSemKfk{m2)&bO?n*K0wv% zL)<8VvoO*pisRkUu-7HZq~2$;QRPzQ$Xu!U_ZLh(N+~D|JkfLCKCHEE21&^nzIt>m zh~u*%uDda|_G-tdiyP5>)=(%mc*L8`?t}5BmpC!86}^v<|LRF8ac#bIC4aZz;xT6T$ru-(_OJ!>#ZkNAVKPYl>)exvy)`46(y zpo{9@IdS{I^XnYUyrlul9toK8cRtv^9{~M&)?r{;G!`!C0)E>mk8~{o8#aC5={YYz zv?xVL2+xMP>ch}*DU|C{y_xCbpICb7N66`W9gD*jQO{%y^Y7k9(`TV5&cBMfH9h#7 za~Hw1`d2XV@`d!wLm0lz0kp3tgZ*p7+{!0V6YmY?>vAAr<|>-Ayaw|r|A6_9VlFE5ROjZyP>C#Y=>3*wG5LaLh@ zjHO?2!$dvQt-b=OvB{_!(ha>&RxQeI3odZA0&0Q+UM|hVn>5G_a-LXi5Nd=7r&X*FNVVSDF(CT48?(B5gxQ{!;)c|G6nAC3iN$~{oiY*AewKPSB8sBD z*yl-Em>J{-rq2wS`<+x~x8niG-H$supQh}-vmF<$9L#)`ds$)k*C;#Q!IVeGu-@72 z5WM9c)l1h=og z(#bn3n?4gVWkx(}cnr7%+d}M`qu4Oo8Li^)a!FcuE^59GvTaw%gO|pQc8#Ukq$~H| z+X1apzk>T{4<=K}g|$0Rz_8{#^t-SG(?60=tN#xW^(vQU&CsAx=VdS&y&n9BTeE(@ ze+Azy1t@Q65nRnrL5q~_g%b0TJD(>x1_m$*1dM+M)c$)jxVVWHb}klu=f#trAN>cCTU?GpzRtv+Kz)bC*Vzcpux8|te;8#om+EJ-*W;CF4urs@MEgk*{D*qv*O-2LGn{H zh+8VS^R$XKSsd7!W}faF$7P)8erI_{7Vx6cxTuTcIX;0`~2l-}KeO3H40 z!D7!$UXi#At@~wbaA}B_WlAb5e%(9j01m3CMwqS!K@Wp7;%8k@|*1_ z3V7n6`L~jVi;E$E=9E?ToQY5T05|;u_BnD*u9-trNgpcb~VnwSq$Q0CZE=qTQ>zFxMJk z@3l-2x{SaPy|%(}F9jC9iv-cwW%&)Zhd}Os4*Zu|fqeHc2sp3;5p^?em??ym&FITlTmI+*F)n{eD(1CpDcQFdS! zivRIOi{D*f?(s<6V2}l#@iZ?ywk+TK{tTws=88Pb z&P)LH1Y-y`ISV$42e9`v9Y#I%1)tJxSiK|~-^g1bs{ag#8~*?d+#Z5v(QV8re*^M< zbo=Cy^e|JFR*4rqjY>CINFx(qMzK`iILF!#d z9-L~ae-QaUrXIy8{ctq9LH^Ry?;-YvHQ3okL3YSKTom@99l(0CP9*K~cwIjH_S}x$QJoL@Y#)P-Bq8pTcrw0+dyr#(s)tD4A-_ifvbb z#I!$??aaiQfD{ZE44@fuhRIzhf0MBfJ;eyhS4o2My9gB55>dtFyk(LIQ$F9p&GZZd z_Kt&+`m-n=+XM7{+jvM^8!BHsV469pyz^B8F|ytZitr;?7&98Jj!b}>Pq`=?J&}0~ zyNMa8w=wtpb$;0XKD6hp#ch&ktm)y7t;dN|a&j$C8eD^#rE?*!PYdoX`-I7o54eOf zqn;ffS#B;urY;JrgNb)B;4!YA;PVARDE_s$;@WTz7Jv!zkSD?%N5ja<&!sa6>E}4QI31QkfNeFQCH&9ND{!a z{1sQkxMSvt4h)nW0?qRMthF)+!+W1)YqzCf)0XZyUm12{D3Dc+`j~>-ke5v!wB?R>I_S)bs&Be%?5lV zjYYeOM~yMU)Eh_9mj8x?8 zimv3zJ(!8=9dw>IUduPRa0VrQyIA_()vLqU5-7*DuKTcQT~~~Waqq7=EQO)Z%t{3^+#b9JI1QTC=#zj3epnbR(^=(nyzwbDnvg!%= z6wUG88k?6purX0n=!!c^62qZsuLHCYB+^X^^C`VLdfFA?x_xH>`XEr2! ztHZLs$)K8{frsnMFt0rcB@2Fo^rXe`&@2j6kE2;ssWlp|JOSa4%UA$UM8z2uCU!4F zJ>7Sbd1=giegt0<84e{S9-z530SZ?<#FCa?P&_V!sm;zvjpn}xr`C%g^94Gplq58t-lZ1L1V!<<2LBkaxUL&Efv|QGTdK zP|Z(Z{@+w+-`57~AI$-okAc+Kp%sd!xS;I5gb5a_(XKrbAMR_z5fN^bG1~}vS!W^e z#2xPT4}eARP|BzLCxrLT;HpL2Fn67rYaew(w;3WZT-O7wB46XgY3E^eWfP?KtOn(S ziLCwF255Auz=u1_q5er57X6ok_M>TL@aIgZ`rU*W5ml^39|6glOb9Qw#))D7VZqXu zP!&zyncvPbAp+5iWny8sTFS3hL74R`eB(|%OhFnhDm;$G8{b3KzEob{jiJc0l>?Nb z_s=hwcH9UIPdo_ocM6a`8gPU?y)!E`Qe{$&0IP^&7Uav+uPvlbk?H8UpL5T<%g`h| z9o=@ips3_;A^dhVx@RTh^pt%V^QH)O4&G4o2=q^t?D*_c7&G?)DBrC{`9i(aXPFBs zcCO_1Qsid3Tr6(m+;B%2RE&;5$&C>#)wd2j4{?D0aWG_C^JqfG#T?D^={z>P??-$R@;8k7o6UD>0gdHht}I9pGDQPHtDD73 zTrI%Go@)FwfxIFSFg@gF+&p7H3@dsFM&t=K{b0d0e?4aErRh?)P6rHqH4;ZHxCuV9 zGXV}ip?pOxREo2)_wafY&X6YYzewIb{wT!NOhsAjJybt*z`{#j)N}S`;ZOeMCT?v| z`0W)o#aKe`*qa!>B%4?D`Hbd+>bN@lA|G3S5ad<21bub_3p2jYt8bEy+P4lQ=_8<@&t35DT8%A}|D^0) zEN-qlMgP}#H0{V_>IL(e=)4Bf&v>Ez%py=|mvWh8m$by>2FkDg0FR|T!8*1OY&*we z;6+QUSbPZz4&H-e3CkqQ!&~sOdTp>S#70e}aPPm^3cVFlTaG&Ko;#VUi*eYTNWMpz<5W zgm!}6hEEv$j@TNjQ&>*aCE}dML2k+cbg)dI8RHL3cbW`_O-<85gEeCg#jQ z?%M%SF?=jqh983Bg45JrErC&AvdHI9f;ID#u%X*kD7pSOh>NFS=2aCKi%x-Lu!fuN z@5a2_=W)612J-xjLBId+;on%|qM(x~3&Xq_x-?_!YYyy9wSU6HsI} zSqSNy3yK#C$X)vlERqj{OUoj(qr9_xZ2`+Y*vzZ;_69?qsFGKI~lZBV)O32F{BpQT|}uac18>6gn54 z0!8=ptUB%!juMrl#j`p(_sgZ;nKJT+r!sXHXCcF-14LUNNJZaPI%@n~pkx5$wh#UU z-j7YVcce8ckG2W9YcyCNI34%;EyfF{o+U@tm>lFqR_;PwYlr`ikh-%s%LE)yVN zcq8#z+Xa8s7cTi&1kRQnAXQP_^v4KLEt&+%V}Y1N84o}IanRalKV@%jz{GJ{IQ;G# zs4o-0%6q6#MSi7(>&94-P>SJQ)45_u2n3$K#Og+WKdh(Pqm6pDrBCA_Gy-&t^I@sJ6~XX6S3r$P_Gm>lMmiYxwZ4R z!Lu}vweOk>Mt|G}(_bv1W^e>Ln`og%^#waaZ{fD_xuCaG@XSRU!E?}6^gBZy;$E*H zxnL+{225pgXVNZ@Zo%Fr+>sdo#&kG}i)2IQGOWrH=& zsn9Q34V}sNAp7V~pg!g$sCJKo!%^j6krs&3?|-0srzIwSs0LZLEZC570n`PTS^XXX zy>F#+<)uuY)*TRMRC8xa9by-8czeFC&A^n&{$%I&64K|@C^rX1r~wXKue$QvNEz8H0X zk+;~vm`QF^#%FT|_Z{gDo^Esp^6%JW;Deg@EyT1Toz*(PMf1< z^iD2cz6p;GTOWb9E59E!1irK4MAmea0@kqy`di)6?_yc8(W~E{9obHs-S|Qaw z3>D%-_k$BZ3++DZK{;d-mMkNd&0Qv_vrM`8+rMD3?<;u(Tev6ns>+Y#sj%%J=1&$I$*5|7Mtrm5EYSW6RGAAPj=sw(X6h&t`jwlUJPp%5 zH=#eBwNbXGK|H7va$oAXde%OsEbEXKmz)5zr*pxj9|!!h7i(W|@LZwcmeN!Vs8mB6 zX_j%mU9lnVX9#+U81u(~+s1Ghz|!-!pu#Ep)@K&ub@zSACzFDAZA-b>!ub`dINiHUoF)4-E!974Tcn!-OypLrk{Z3qjGH&wl zB(&eTge6l+E2%bR{oblj)Nm@leeDd4>HG?bHpJI?x*c48{mlK!2IBp7$>?(Z0_yHO zU}j#X=;!K>RvlNEf9G5_|M*8@0(+3JoHUZH9?W)=6Pn)CFnM7SXh&r5Akquml@`Ry zdx*`8&qCS1O?dym{U|FkWU>zfac>JA`YGPGo+w z#E?8@D+-mDP{?_Rg1gl^-9b)upGn z(6bBL=2fGrG#<>78QM=HudJ;Hcun_%I2$FOzJCUU_pf9A+kRj_bL#URFNF;kOVEDp zaP;{rjCi#f5F9WEdT)t>ZdDl=JA~#!gQ_85xdIKBOVPYPK-IHDtjaBkYrp@@R##ks z|LJekgZ(X`WN1h zPr$sgZ`eZGtBt`?$V?Alm5Lf@4W$0QKk=#Fy#`bA87dY~?_Hh5EjG$PPuX>&w5PoI zXf+OaTL{Ki-(kO7r|A1uq38BACfWQCHhiObTJkjTOWh0^rsQ#v=y1CEaP;g(J#|(D z*FQ^vBA-T3&g;uWPfilorUKgblTO|u!sftpfU94lM)xoGQ5s<6oKqOuCj;$Aguxqa zC?uu4CH*D_8^nXK*PF&7;buj zw+%ZFi^gX|;N)nOcO1)iZ$7}qtIV0wI*yqa9p+ZE^Ld*gF)cq8L8144P!!$fVw=-a zh1V!1Gs+P(hdj8||8BC*XyTY{+X4l1t3fmODATCDP?CKGY%c1dU{N{*_U;Ap?F+fi zVHcD=YX-Pg0phv!Ocj>J6aFg)D}x5!DBp_#|NaCGnU`6uX&d@a4dC*-Zv{iIT9CZi z2`xcMICx+&4BnMQbNL5Q>}`Sd-@9O(PR~os|AzF?Xz*@cgXs_Kq2;ek)bz^c!R6Js z;aE9{hTRjCeaE3;=OK9bsD(n&F~rO<7n)+5QFWl1HJvlV@a8!u1Li&T2{%zx zqMy4Cl^+tM8ucy+GUaGB{tc^Mnu*!f6KOvV{lD|xvdAzF_5HtsAuETm0clX?P5SWE ztLRa52_`0Ffi5(I$JV%_av*sjyt9S9za(Ndae^m)4TDO%a?qG~Ft3UC!0ALMCZ0Qw z$5UQIiK7|Vj+D~h?WgyQd{8@f2u;Vg zpg{n6B#z95+EsMMd!7fkz=fbPD`47e${9@>fW`@DAb6%0L`HiZ{rpCN$ZoulvON~E zdp-v1ecqsn2*>PxmSC`p^n;NBLhi($An>;|X8E}Zi;o^;=D+Mg+dtl8KiX^Jed)5) z?)^9VHr{aE)N0h2C8OlgUFyLb&g%2pr5mg+GWkn034cUI6D{!jh} z1CH^(CZPP_--6wlNJxC}01xkMLUETtH1|zs0pC2KDtiKC`Yq&jUT;wMS;Sv@mTJZbqxK^=SIx z14;xVzIH?zMqWLP39lxA_^mV5`NSefN#>2>chHy`4lXkiS?i#SOcjW8+|ApgN1C-t%rU>n=yZlCl~8If}&(&`@f|2>IY7M@3Q zIL57f@|c4>24a4XK>fJad}8-gsJ`P$UL+&5Kf8eVe5F$5mSD)UKTP`)zG2fdLy!%5 z!NtEH7UZs`($Jp7eE#zmpWjBa+Wxsr>m)*TcN->MfLOCO0JT5QWrjYTptSggme)^# z|A28&Eo5Nbqi<01Bnaj8MOkDQLD)?&IAnX7t-R>KhM&y@NeQ4WK#IoLS_7ia~|$E?34phNh;? z0co8^;g(t8;jYqzhWNESW`<&&~yfQ z`YsI?>P_vj(Pl5kMcYuOj~EROZBTPo4B2yt{oWEnHKsQ=jH2ℜr*@TcCw_kBKu+ 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 diff --git a/tests/data/glm4v_model.data b/tests/data/glm4v_model.data new file mode 100644 index 0000000000000000000000000000000000000000..df2133effc2bd404454a8f0416892e9709360108 GIT binary patch literal 116224 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 U3r>*5tKzBh9L?|38oTiS0S=1)TL1t6 literal 0 HcmV?d00001 diff --git a/tests/data/internlm_model.data b/tests/data/internlm_model.data deleted file mode 100644 index 821b36e48763b3450ad22d1ee633149a0d807582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55444 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 input_ids(corpus_ids.begin() + begin, corpus_ids.begin() + end); - ggml_tensor *lm_logits = pipeline.model->forward_graph_compute(input_ids, 0, 0, false); + ggml_tensor *lm_logits = pipeline.model->forward_graph_compute(input_ids, std::nullopt, 0, 0, false); const auto clk_fwd = std::chrono::system_clock::now(); diff --git a/tests/test_chatglm_cpp.py b/tests/test_chatglm_cpp.py index a490740d..3749daa8 100644 --- a/tests/test_chatglm_cpp.py +++ b/tests/test_chatglm_cpp.py @@ -1,7 +1,10 @@ +import base64 from pathlib import Path import chatglm_cpp +import numpy as np import pytest +from PIL import Image PROJECT_ROOT = Path(__file__).resolve().parent.parent @@ -9,6 +12,7 @@ CHATGLM2_MODEL_PATH = PROJECT_ROOT / "models/chatglm2-ggml.bin" CHATGLM3_MODEL_PATH = PROJECT_ROOT / "models/chatglm3-ggml.bin" CHATGLM4_MODEL_PATH = PROJECT_ROOT / "models/chatglm4-ggml.bin" +CHATGLM4V_MODEL_PATH = PROJECT_ROOT / "models/chatglm4v-ggml.bin" CODEGEEX2_MODEL_PATH = PROJECT_ROOT / "models/codegeex2-ggml.bin" @@ -16,8 +20,8 @@ def test_chatglm_version(): print(chatglm_cpp.__version__) -def check_pipeline(model_path, prompt, target, gen_kwargs={}): - messages = [chatglm_cpp.ChatMessage(role="user", content=prompt)] +def check_pipeline(model_path, prompt, target, gen_kwargs={}, image=None): + messages = [chatglm_cpp.ChatMessage(role="user", content=prompt, image=image)] pipeline = chatglm_cpp.Pipeline(model_path) output = pipeline.chat(messages, do_sample=False, **gen_kwargs).content @@ -76,7 +80,26 @@ def test_chatglm4_pipeline(): check_pipeline( model_path=CHATGLM4_MODEL_PATH, prompt="你好", - target="你好👋!我是人工智能助手,很高兴见到你,有什么可以帮助你的吗?", + target="你好👋!很高兴能帮助你,有什么问题或者需要帮助的地方吗?", + ) + + +@pytest.mark.skipif(not CHATGLM4V_MODEL_PATH.exists(), reason="model file not found") +def test_chatglm4v_pipeline(): + check_pipeline( + model_path=CHATGLM4V_MODEL_PATH, + prompt="你好", + target="你好👋!很高兴见到你,欢迎问我任何问题。", + ) + + image = chatglm_cpp.Image( + np.asarray(Image.open(PROJECT_ROOT / "examples/03-Confusing-Pictures.jpg").convert("RGB")) + ) + check_pipeline( + model_path=CHATGLM4V_MODEL_PATH, + prompt="这张图片有什么不寻常之处", + image=image, + target="这张图片中不寻常的是,一个男人站在一辆黄色SUV的后备箱上,正在使用一个铁板熨烫衣物。通常情况下,熨衣是在室内进行的,使用的是家用电熨斗,而不是在户外使用汽车后备箱作为工作台。此外,他似乎是在一个繁忙的城市街道上,周围有行驶的车辆和建筑物,这增加了场景的异想天开性。", ) @@ -117,7 +140,7 @@ def test_langchain_api(): client = TestClient(app) response = client.post("/", json={"prompt": "你好", "temperature": 0}) assert response.status_code == 200 - assert response.json()["response"] == "你好👋!我是人工智能助手,很高兴见到你,有什么可以帮助你的吗?" + assert response.json()["response"] == "你好👋!很高兴能帮助你,有什么问题或者需要帮助的地方吗?" @pytest.mark.skipif(not CHATGLM4_MODEL_PATH.exists(), reason="model file not found") @@ -137,4 +160,67 @@ def test_openai_api(): assert response.status_code == 200 response_message = response.json()["choices"][0]["message"] assert response_message["role"] == "assistant" - assert response_message["content"] == "你好👋!我是人工智能助手,很高兴见到你,有什么可以帮助你的吗?" + assert response_message["content"] == "你好👋!很高兴能帮助你,有什么问题或者需要帮助的地方吗?" + + +@pytest.mark.skipif(not CHATGLM4V_MODEL_PATH.exists(), reason="model file not found") +def test_openai_api_vision(): + import os + from unittest.mock import patch + + from fastapi.testclient import TestClient + + with patch.dict(os.environ, {"MODEL": str(CHATGLM4V_MODEL_PATH)}): + from chatglm_cpp.openai_api import app + + client = TestClient(app) + + # request with image url + payload = { + "messages": [ + { + "role": "user", + "content": [ + {"type": "text", "text": "这张图片有什么不寻常之处"}, + { + "type": "image_url", + "image_url": { + "url": "https://www.barnorama.com/wp-content/uploads/2016/12/03-Confusing-Pictures.jpg" + }, + }, + ], + } + ], + "temperature": 0, + } + response = client.post("/v1/chat/completions", json=payload) + assert response.status_code == 200 + response_message = response.json()["choices"][0]["message"] + assert response_message["role"] == "assistant" + assert ( + response_message["content"] + == "这张图片中不寻常的是,一个男人站在一辆黄色SUV的后备箱上,正在使用一个铁板熨烫衣物。通常情况下,熨衣是在室内进行的,使用的是家用电熨斗,而不是在户外使用汽车后备箱作为工作台。此外,他似乎是在一个繁忙的城市街道上,周围有行驶的车辆和建筑物,这增加了场景的异想天开性。" + ) + + # request with base64 image + base64_image = base64.b64encode(Path(PROJECT_ROOT / "examples/03-Confusing-Pictures.jpg").read_bytes()).decode() + payload = { + "messages": [ + { + "role": "user", + "content": [ + {"type": "text", "text": "这张图片有什么不寻常之处"}, + {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}, + ], + } + ], + "temperature": 0, + } + response = client.post("/v1/chat/completions", json=payload) + assert response.status_code == 200 + response_message = response.json()["choices"][0]["message"] + assert response_message["role"] == "assistant" + assert ( + response_message["content"] + == "这张图片中不寻常的是,一个男人站在一辆黄色SUV的后备箱上,正在使用一个铁板熨烫衣物。通常情况下,熨衣是在室内进行的,使用的是家用电熨斗,而不是在户外使用汽车后备箱作为工作台。此外,他似乎是在一个繁忙的城市街道上,周围有行驶的车辆和建筑物,这增加了场景的异想天开性。" + ) diff --git a/tests/test_convert.py b/tests/test_convert.py index 25955999..b74a495e 100644 --- a/tests/test_convert.py +++ b/tests/test_convert.py @@ -1,4 +1,6 @@ +import re import sys +from contextlib import contextmanager from pathlib import Path import torch @@ -175,8 +177,19 @@ def test_quantize_q5_1(): assert (q_tensor == ggml_q_tensor).all() +@contextmanager +def relative_to_absolute_import(path): + code = Path(path).read_text() + fix_code = re.sub(r"(from )\.(.+ import)", r"\1\2", code) + Path(path).write_text(fix_code) + try: + yield + finally: + Path(path).write_text(code) + + CHATGLM2_MODEL_PATH = Path( - "~/.cache/huggingface/hub/models--THUDM--chatglm2-6b/snapshots/b1502f4f75c71499a3d566b14463edd62620ce9f" + "~/.cache/huggingface/hub/models--THUDM--chatglm2-6b/snapshots/7fabe56db91e085c9c027f56f1c654d137bdba40" ).expanduser() @@ -277,7 +290,8 @@ def _forward_steps(model, seq_len): ).expanduser() sys.path.append(str(CHATGLM_MODEL_PATH)) - from modeling_chatglm import ChatGLMModel + with relative_to_absolute_import(CHATGLM_MODEL_PATH / "modeling_chatglm.py"): + from modeling_chatglm import ChatGLMModel from transformers import AutoConfig config = AutoConfig.from_pretrained(CHATGLM_MODEL_PATH, trust_remote_code=True) @@ -366,33 +380,13 @@ def _forward_steps(model, seq_len): y3.data.numpy().tofile(f) -def make_data_glm2_model(): - sys.path.append(str(CHATGLM2_MODEL_PATH)) - from modeling_chatglm import ChatGLMModel - from transformers import AutoConfig - - config = AutoConfig.from_pretrained(CHATGLM2_MODEL_PATH, trust_remote_code=True) - config.hidden_size = 32 - config.num_attention_heads = 8 - config.num_layers = 1 - config.padded_vocab_size = 5 - config.multi_query_group_num = 2 - config.ffn_hidden_size = 48 - config.kv_channels = config.hidden_size // config.num_attention_heads - config.torch_dtype = torch.float32 - - m = ChatGLMModel(config).float().eval() - for param in m.parameters(): - param.data.uniform_(-0.5, 0.5) - - seq_len = 3 - +def _forward_steps(model, seq_len, **kwargs): # self attention x1 = torch.arange(seq_len, dtype=torch.int64)[None, :] position_ids = torch.arange(seq_len, dtype=torch.int64)[None, :] attn_mask = torch.ones(1, seq_len, dtype=torch.int64) with torch.no_grad(): - out = m(x1, position_ids=position_ids, attention_mask=attn_mask, use_cache=True) + out = model(x1, position_ids=position_ids, attention_mask=attn_mask, use_cache=True, **kwargs) y1 = out.last_hidden_state kv_cache = out.past_key_values @@ -401,7 +395,9 @@ def make_data_glm2_model(): position_ids = torch.tensor([[seq_len]], dtype=torch.int64) attn_mask = torch.ones(1, seq_len + 1, dtype=torch.int64) with torch.no_grad(): - out = m(x2, position_ids=position_ids, attention_mask=attn_mask, past_key_values=kv_cache, use_cache=True) + out = model( + x2, position_ids=position_ids, attention_mask=attn_mask, past_key_values=kv_cache, use_cache=True, **kwargs + ) y2 = out.last_hidden_state kv_cache = out.past_key_values @@ -410,10 +406,37 @@ def make_data_glm2_model(): position_ids = torch.tensor([[seq_len + 1]], dtype=torch.int64) attn_mask = torch.ones(1, seq_len + 2, dtype=torch.int64) with torch.no_grad(): - out = m(x3, position_ids=position_ids, attention_mask=attn_mask, past_key_values=kv_cache, use_cache=True) + out = model( + x3, position_ids=position_ids, attention_mask=attn_mask, past_key_values=kv_cache, use_cache=True, **kwargs + ) y3 = out.last_hidden_state kv_cache = out.past_key_values + return x1, y1, x2, y2, x3, y3 + + +def make_data_glm2_model(): + sys.path.append(str(CHATGLM2_MODEL_PATH)) + with relative_to_absolute_import(CHATGLM2_MODEL_PATH / "modeling_chatglm.py"): + from modeling_chatglm import ChatGLMModel + from transformers import AutoConfig + + config = AutoConfig.from_pretrained(CHATGLM2_MODEL_PATH, trust_remote_code=True) + config.hidden_size = 32 + config.num_attention_heads = 8 + config.num_layers = 1 + config.padded_vocab_size = 5 + config.multi_query_group_num = 2 + config.ffn_hidden_size = 48 + config.kv_channels = config.hidden_size // config.num_attention_heads + config.torch_dtype = torch.float32 + + m = ChatGLMModel(config).float().eval() + for param in m.parameters(): + param.data.uniform_(-0.5, 0.5) + + x1, y1, x2, y2, x3, y3 = _forward_steps(m, seq_len=3) + print(m) with open(HERE / "data/glm2_model.data", "wb") as f: @@ -437,46 +460,13 @@ def make_data_glm2_model(): def make_data_glm3_model(): - def _forward_steps(model, seq_len): - # self attention - x1 = torch.arange(seq_len, dtype=torch.int64)[None, :] - position_ids = torch.arange(seq_len, dtype=torch.int64)[None, :] - attn_mask = torch.ones(1, seq_len, dtype=torch.int64) - with torch.no_grad(): - out = model(x1, position_ids=position_ids, attention_mask=attn_mask, use_cache=True) - y1 = out.last_hidden_state - kv_cache = out.past_key_values - - # cross attention - x2 = torch.tensor([[seq_len]], dtype=torch.int64) - position_ids = torch.tensor([[seq_len]], dtype=torch.int64) - attn_mask = torch.ones(1, seq_len + 1, dtype=torch.int64) - with torch.no_grad(): - out = model( - x2, position_ids=position_ids, attention_mask=attn_mask, past_key_values=kv_cache, use_cache=True - ) - y2 = out.last_hidden_state - kv_cache = out.past_key_values - - # cross attention - x3 = torch.tensor([[seq_len + 1]], dtype=torch.int64) - position_ids = torch.tensor([[seq_len + 1]], dtype=torch.int64) - attn_mask = torch.ones(1, seq_len + 2, dtype=torch.int64) - with torch.no_grad(): - out = model( - x3, position_ids=position_ids, attention_mask=attn_mask, past_key_values=kv_cache, use_cache=True - ) - y3 = out.last_hidden_state - kv_cache = out.past_key_values - - return x1, y1, x2, y2, x3, y3 - CHATGLM3_MODEL_PATH = Path( - "~/.cache/huggingface/hub/models--THUDM--chatglm3-6b/snapshots/a5ba5501eb873d40d48bd0983bd2a8dd006bb838" + "~/.cache/huggingface/hub/models--THUDM--chatglm3-6b/snapshots/6f3b58ec10f088978ae174398f9d20b6dfc71552" ).expanduser() sys.path.append(str(CHATGLM3_MODEL_PATH)) - from modeling_chatglm import ChatGLMModel + with relative_to_absolute_import(CHATGLM3_MODEL_PATH / "modeling_chatglm.py"): + from modeling_chatglm import ChatGLMModel from transformers import AutoConfig config = AutoConfig.from_pretrained(CHATGLM3_MODEL_PATH, trust_remote_code=True) @@ -552,46 +542,13 @@ def _forward_steps(model, seq_len): def make_data_glm4_model(): - def _forward_steps(model, seq_len): - # self attention - x1 = torch.arange(seq_len, dtype=torch.int64)[None, :] - position_ids = torch.arange(seq_len, dtype=torch.int64)[None, :] - attn_mask = torch.ones(1, seq_len, dtype=torch.int64) - with torch.no_grad(): - out = model(x1, position_ids=position_ids, attention_mask=attn_mask, use_cache=True) - y1 = out.last_hidden_state - kv_cache = out.past_key_values - - # cross attention - x2 = torch.tensor([[seq_len]], dtype=torch.int64) - position_ids = torch.tensor([[seq_len]], dtype=torch.int64) - attn_mask = torch.ones(1, seq_len + 1, dtype=torch.int64) - with torch.no_grad(): - out = model( - x2, position_ids=position_ids, attention_mask=attn_mask, past_key_values=kv_cache, use_cache=True - ) - y2 = out.last_hidden_state - kv_cache = out.past_key_values - - # cross attention - x3 = torch.tensor([[seq_len + 1]], dtype=torch.int64) - position_ids = torch.tensor([[seq_len + 1]], dtype=torch.int64) - attn_mask = torch.ones(1, seq_len + 2, dtype=torch.int64) - with torch.no_grad(): - out = model( - x3, position_ids=position_ids, attention_mask=attn_mask, past_key_values=kv_cache, use_cache=True - ) - y3 = out.last_hidden_state - kv_cache = out.past_key_values - - return x1, y1, x2, y2, x3, y3 - CHATGLM4_MODEL_PATH = Path( - "~/.cache/huggingface/hub/models--THUDM--glm-4-9b-chat/snapshots/6f060dcb542d48b6bc743628634924b271545428" + "~/.cache/huggingface/hub/models--THUDM--glm-4-9b-chat/snapshots/04419001bc63e05e70991ade6da1f91c4aeec278" ).expanduser() sys.path.append(str(CHATGLM4_MODEL_PATH)) - from modeling_chatglm import ChatGLMModel + with relative_to_absolute_import(CHATGLM4_MODEL_PATH / "modeling_chatglm.py"): + from modeling_chatglm import ChatGLMModel from transformers import AutoConfig config = AutoConfig.from_pretrained(CHATGLM4_MODEL_PATH, trust_remote_code=True) @@ -633,59 +590,124 @@ def _forward_steps(model, seq_len): y3.numpy().tofile(f) -def make_glm4_pipeline_data(): - from transformers import AutoModelForCausalLM, AutoTokenizer - - tokenizer = AutoTokenizer.from_pretrained("THUDM/glm-4-9b-chat", trust_remote_code=True) - - # tiktoken - chktxt = "\n \n\n \n\n\n \t \t\t \t\n \n \n \n \n🚀 (normal) 😶\u200d🌫️ (multiple emojis concatenated) ✅ 🦙🦙 3 33 333 3333 33333 333333 3333333 33333333 3.3 3..3 3...3 កាន់តែពិសេសអាច😁 ?我想在apple工作1314151天~ ------======= нещо на Български ''''''```````\"\"\"\"......!!!!!!?????? I've been 'told he's there, 'RE you sure? 'M not sure I'll make it, 'D you like some tea? We'Ve a'lL" - print("tiktoken:", tokenizer.tokenizer.encode(chktxt, disallowed_special=())) +def make_data_glm4v_model(): + CHATGLM4V_MODEL_PATH = Path( + "~/.cache/huggingface/hub/models--THUDM--glm-4v-9b/snapshots/6c2e4732db8443f64a48d5af04b74425a7d169c4" + ).expanduser() - # tokenizer - inputs = tokenizer("你好") - print(f"encode: {inputs=}") + sys.path.append(str(CHATGLM4V_MODEL_PATH)) + with relative_to_absolute_import(CHATGLM4V_MODEL_PATH / "modeling_chatglm.py"): + from modeling_chatglm import ChatGLMModel + from transformers import AutoConfig - conversation = [{"role": "user", "content": "你好"}] - inputs = tokenizer.apply_chat_template( - conversation, - add_generation_prompt=True, - tokenize=True, - return_tensors="pt", - return_dict=True, + config = AutoConfig.from_pretrained(CHATGLM4V_MODEL_PATH, trust_remote_code=True) + config.hidden_size = 32 + config.num_attention_heads = 8 + config.num_layers = 1 + config.padded_vocab_size = 8 + config.multi_query_group_num = 2 + config.ffn_hidden_size = 48 + config.kv_channels = config.hidden_size // config.num_attention_heads + config.torch_dtype = torch.float32 + config.vision_config.update( + num_hidden_layers=1, + hidden_size=32, + patch_size=7, + num_heads=2, + intermediate_size=56, + num_positions=17, + image_size=28, ) - print(f"apply_chat_template: {conversation=} {inputs=}") - # round 1 - inputs = inputs.to("cuda") - model = AutoModelForCausalLM.from_pretrained( - "THUDM/glm-4-9b-chat", - torch_dtype=torch.bfloat16, - low_cpu_mem_usage=True, - trust_remote_code=True, - device_map="auto", - ).eval() - - outputs = model.generate(**inputs, do_sample=False) - outputs = outputs[:, inputs["input_ids"].shape[1] :] - response = tokenizer.decode(outputs[0], skip_special_tokens=True).strip() - print(f"generate: {response=}") + m = ChatGLMModel(config).float().eval() + for param in m.parameters(): + param.data.uniform_(-0.5, 0.5) - conversation += [{"role": "assistant", "content": response}, {"role": "user", "content": "晚上睡不着应该怎么办"}] - inputs = tokenizer.apply_chat_template( - conversation, - add_generation_prompt=True, - tokenize=True, - return_tensors="pt", - return_dict=True, - ) - print(f"apply_chat_template: {conversation=} {inputs=}") + print(m) - # round 2 - outputs = model.generate(**inputs, do_sample=False) - outputs = outputs[:, inputs["input_ids"].shape[1] :] - response = tokenizer.decode(outputs[0], skip_special_tokens=True).strip() - print(f"generate: {response=}") + x1, y1, x2, y2, x3, y3 = _forward_steps(m, seq_len=3) + + # text + with open(HERE / "data/glm4v_model_text.data", "wb") as f: + tensors = [ + # text model + m.embedding.word_embeddings.weight, + m.encoder.layers[0].input_layernorm.weight, + m.encoder.layers[0].self_attention.query_key_value.weight, + m.encoder.layers[0].self_attention.query_key_value.bias, + m.encoder.layers[0].self_attention.dense.weight, + m.encoder.layers[0].post_attention_layernorm.weight, + m.encoder.layers[0].mlp.dense_h_to_4h.weight, + m.encoder.layers[0].mlp.dense_4h_to_h.weight, + m.encoder.final_layernorm.weight, + # inputs & outputs + x1.int(), + y1, + x2.int(), + y2, + x3.int(), + y3, + ] + for tensor in tensors: + tensor.data.numpy().tofile(f) + + m.config.boi_token_id = 2 + m.config.eoi_token_id = 4 + + images = torch.randn(1, 3, config.vision_config["image_size"], config.vision_config["image_size"]) + x1, y1, x2, y2, x3, y3 = _forward_steps(m, seq_len=6, images=images) + + # vision & text + with open(HERE / "data/glm4v_model.data", "wb") as f: + tensors = [ + # vision model + m.vision.patch_embedding.cls_embedding.half(), + m.vision.patch_embedding.proj.weight.half(), + m.vision.patch_embedding.proj.bias, + m.vision.patch_embedding.position_embedding.weight, + m.vision.transformer.layers[0].input_layernorm.weight, + m.vision.transformer.layers[0].input_layernorm.bias, + m.vision.transformer.layers[0].attention.query_key_value.weight, + m.vision.transformer.layers[0].attention.query_key_value.bias, + m.vision.transformer.layers[0].attention.dense.weight, + m.vision.transformer.layers[0].attention.dense.bias, + m.vision.transformer.layers[0].mlp.fc1.weight, + m.vision.transformer.layers[0].mlp.fc1.bias, + m.vision.transformer.layers[0].mlp.fc2.weight, + m.vision.transformer.layers[0].mlp.fc2.bias, + m.vision.transformer.layers[0].post_attention_layernorm.weight, + m.vision.transformer.layers[0].post_attention_layernorm.bias, + m.vision.conv.weight.half(), + m.vision.conv.bias, + m.vision.linear_proj.linear_proj.weight, + m.vision.linear_proj.norm1.weight, + m.vision.linear_proj.norm1.bias, + m.vision.linear_proj.gate_proj.weight, + m.vision.linear_proj.dense_h_to_4h.weight, + m.vision.linear_proj.dense_4h_to_h.weight, + m.vision.boi.half(), + m.vision.eoi.half(), + # text model + m.embedding.word_embeddings.weight, + m.encoder.layers[0].input_layernorm.weight, + m.encoder.layers[0].self_attention.query_key_value.weight, + m.encoder.layers[0].self_attention.query_key_value.bias, + m.encoder.layers[0].self_attention.dense.weight, + m.encoder.layers[0].post_attention_layernorm.weight, + m.encoder.layers[0].mlp.dense_h_to_4h.weight, + m.encoder.layers[0].mlp.dense_4h_to_h.weight, + m.encoder.final_layernorm.weight, + # inputs & outputs + images, + x1.int(), + y1, + x2.int(), + y2, + x3.int(), + y3, + ] + for tensor in tensors: + tensor.data.numpy().tofile(f) def make_glm4_pipeline_data(): @@ -753,11 +775,27 @@ def make_glm4_pipeline_data(): print(f"apply_chat_template: {conversation=} {inputs=}") # round 2 + inputs = inputs.to("cuda") outputs = model.generate(**inputs, do_sample=False) outputs = outputs[:, inputs["input_ids"].shape[1] :] response = tokenizer.decode(outputs[0], skip_special_tokens=True).strip() print(f"generate: {response=}") + # with image + from PIL import Image + + tokenizer = AutoTokenizer.from_pretrained("THUDM/glm-4v-9b", trust_remote_code=True) + image = Image.open(HERE / "../examples/03-Confusing-Pictures.jpg") + conversation = [{"role": "user", "content": "描述这张图片", "image": image}] + inputs = tokenizer.apply_chat_template( + conversation, + add_generation_prompt=True, + tokenize=True, + return_tensors="pt", + return_dict=True, + ) + print(f"apply_chat_template: {conversation=} {inputs=}") + def main(): torch.manual_seed(0) @@ -769,7 +807,8 @@ def main(): # make_data_glm2_model() # make_data_glm3_model() # make_data_glm4_model() - make_glm4_pipeline_data() + make_data_glm4v_model() + # make_glm4_pipeline_data() if __name__ == "__main__": diff --git a/third_party/stb b/third_party/stb new file mode 160000 index 00000000..013ac3be --- /dev/null +++ b/third_party/stb @@ -0,0 +1 @@ +Subproject commit 013ac3beddff3dbffafd5177e7972067cd2b5083