From 1b9b010ced1a0b642f5bd57868ded2134b14b562 Mon Sep 17 00:00:00 2001 From: "zhenglaiwen.zlw" Date: Wed, 29 May 2024 10:10:47 +0800 Subject: [PATCH] support Qwen2, change dashinfer model extensions - support Qwen2, add model_type Qwen_v20 - change dashinfer model extensions (asgraph, asparam -> dimodel, ditensors) - remove xxx_quantize.json config file, use command line arg instead --- README.md | 4 +- README_CN.md | 21 ++- csrc/common/as_engine.cpp | 65 +++---- csrc/common/engine_runtime.h | 1 + csrc/core/model/qwen/qwen.cpp | 1 + csrc/core/model/qwen/qwen.h | 6 + .../general/get_last_line/get_last_line.h | 2 +- .../operator/general/rotary/rotary_op.cpp | 45 +++-- csrc/core/operator/general/rotary/rotary_op.h | 3 + .../generate_opt/batch_mqa/batch_mqa_op.cpp | 31 ++-- csrc/interface/allspark.h | 104 +++++++++-- documents/CN/examples_python.md | 2 +- documents/EN/examples_python.md | 2 +- documents/resources/image/workflow-deps.jpg | Bin 165655 -> 165019 bytes examples/cpp/0_basic/example_qwen.cpp | 10 +- examples/cpp/1_apiserver/apiserver.cpp | 8 +- examples/cpp/utils/misc.hpp | 16 +- .../python/0_basic/basic_example_chatglm2.py | 8 +- .../python/0_basic/basic_example_chatglm3.py | 8 +- .../python/0_basic/basic_example_llama2.py | 8 +- .../python/0_basic/basic_example_qwen_v10.py | 8 +- .../0_basic/basic_example_qwen_v10_io.ipynb | 16 +- .../0_basic/basic_example_qwen_v10_io.py | 6 + .../python/0_basic/basic_example_qwen_v15.py | 8 +- .../0_basic/basic_example_qwen_v15_dimodel.py | 122 +++++++++++++ .../basic_example_qwen_v15_dimodel_simple.py | 38 ++++ .../python/0_basic/basic_example_qwen_v20.py | 172 ++++++++++++++++++ .../1_performance/performance_test_llama2.py | 4 +- .../performance_test_qwen_v15.py | 4 +- .../2_evaluation/evaluate_chat_ceval.py | 3 +- .../2_evaluation/evaluate_chat_gsm8k.py | 3 +- .../2_evaluation/evaluate_chat_humaneval.py | 3 +- .../python/2_evaluation/evaluate_chat_mmlu.py | 3 +- .../model_config/config_chatglm2_6b.json | 13 +- .../model_config/config_chatglm2_6b_32k.json | 13 +- .../config_chatglm2_6b_32k_quantize.json | 40 ---- .../config_chatglm2_6b_quantize.json | 40 ---- .../model_config/config_chatglm3_6b.json | 13 +- .../model_config/config_chatglm3_6b_32k.json | 13 +- .../config_chatglm3_6b_32k_quantize.json | 40 ---- .../config_chatglm3_6b_quantize.json | 40 ---- .../python/model_config/config_llama2_7b.json | 13 +- .../config_llama2_7b_quantize.json | 40 ---- .../model_config/config_qwen_v10_14b.json | 13 +- .../model_config/config_qwen_v10_1_8b.json | 13 +- .../config_qwen_v10_1_8b_quantize.json | 51 ------ .../model_config/config_qwen_v10_7b.json | 13 +- .../model_config/config_qwen_v15_0_5b.json | 13 +- .../model_config/config_qwen_v15_14b.json | 13 +- .../config_qwen_v15_14b_quantize.json | 51 ------ .../model_config/config_qwen_v15_1_8b.json | 13 +- .../config_qwen_v15_1_8b_quantize.json | 52 ------ .../model_config/config_qwen_v15_4b.json | 13 +- .../config_qwen_v15_4b_quantize.json | 51 ------ .../model_config/config_qwen_v15_7b.json | 13 +- .../config_qwen_v15_7b_quantize.json | 51 ------ ...uantize.json => config_qwen_v20_0_5b.json} | 10 +- ...uantize.json => config_qwen_v20_1_5b.json} | 12 +- ..._quantize.json => config_qwen_v20_7b.json} | 12 +- python/allspark_binding.cpp | 93 +++++++--- python/dashinfer/allspark/engine.py | 11 +- python/dashinfer/allspark/model/__init__.py | 2 + python/dashinfer/allspark/model/qwen_v15.py | 39 +++- python/dashinfer/allspark/model/qwen_v20.py | 26 +++ python/dashinfer/helper/helper.py | 10 +- scripts/release/python_manylinux_test.sh | 3 +- scripts/release/python_pypi_test.sh | 3 +- 67 files changed, 867 insertions(+), 714 deletions(-) create mode 100644 examples/python/0_basic/basic_example_qwen_v15_dimodel.py create mode 100644 examples/python/0_basic/basic_example_qwen_v15_dimodel_simple.py create mode 100644 examples/python/0_basic/basic_example_qwen_v20.py delete mode 100644 examples/python/model_config/config_chatglm2_6b_32k_quantize.json delete mode 100644 examples/python/model_config/config_chatglm2_6b_quantize.json delete mode 100644 examples/python/model_config/config_chatglm3_6b_32k_quantize.json delete mode 100644 examples/python/model_config/config_chatglm3_6b_quantize.json delete mode 100644 examples/python/model_config/config_llama2_7b_quantize.json delete mode 100644 examples/python/model_config/config_qwen_v10_1_8b_quantize.json delete mode 100644 examples/python/model_config/config_qwen_v15_14b_quantize.json delete mode 100644 examples/python/model_config/config_qwen_v15_1_8b_quantize.json delete mode 100644 examples/python/model_config/config_qwen_v15_4b_quantize.json delete mode 100644 examples/python/model_config/config_qwen_v15_7b_quantize.json rename examples/python/model_config/{config_qwen_v15_0_5b_quantize.json => config_qwen_v20_0_5b.json} (90%) rename examples/python/model_config/{config_qwen_v10_7b_quantize.json => config_qwen_v20_1_5b.json} (88%) rename examples/python/model_config/{config_qwen_v10_14b_quantize.json => config_qwen_v20_7b.json} (88%) create mode 100644 python/dashinfer/allspark/model/qwen_v20.py diff --git a/README.md b/README.md index 41eaef57..93b3cc4f 100644 --- a/README.md +++ b/README.md @@ -94,12 +94,12 @@ During inference, the quantized weight is recovered as bfloat16 for matrix multi ![Workflow and Dependency](documents/resources/image/workflow-deps.jpg?row=true) -1. **Model Loading and Serialization**: This procedure involves loading model weights, setting up transformation parameters, and quantization settings. Based on this information, the model is serialized and converted into the DashInfer format (.asparam, .asgraph). This functionality is accessible exclusively through a Python interface and relies on the PyTorch and transformers libraries to access the weights. The version requirements for PyTorch and transformers may vary from model to model. DashInfer itself does not impose any specific version constraints. +1. **Model Loading and Serialization**: This procedure involves loading model weights, setting up transformation parameters, and quantization settings. Based on this information, the model is serialized and converted into the DashInfer format (.dimodel, .ditensors). This functionality is accessible exclusively through a Python interface and relies on the PyTorch and transformers libraries to access the weights. The version requirements for PyTorch and transformers may vary from model to model. DashInfer itself does not impose any specific version constraints. 2. **Model Inference**: This step is responsible for executing the model inference using the serialized model with DashInfer, without depending on components like PyTorch. DashInfer employs [DLPack](https://github.com/dmlc/dlpack) format tensors to facilitate interaction with external frameworks, such as PyTorch. Tensors in DLPack format can be manually created or generated through tensor conversion functions provided by deep learning frameworks. Regarding the C++ interface, since most dependencies have been statically linked, it primarily relies on the OpenMP runtime library and C++ system libraries. We applied [control over symbol exports](https://anadoxin.org/blog/control-over-symbol-exports-in-gcc.html/) to ensure that only DashInfer's API interface symbols are visible, thereby preventing version conflicts with existing libraries in the user's system, such as protobuf. > Note: -> - .asparam, .asgraph is a special model format defined by DashInfer kernel (allspark). +> - .dimodel, .ditensors is a special model format defined by DashInfer kernel. > - When utilizing the Python interface, you can combine the code from steps 1 and 2. However, due to the lack of functionality for loading Huggingface models at the C++ level, the C++ interface is limited to conducting inferences with models in the DashInfer format. Therefore, it's essential to serialize the model first using the Python interface before proceeding with the C++ interface. ## Single-NUMA Architecture diff --git a/README_CN.md b/README_CN.md index fcae9a54..ed57ebc8 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,6 +1,19 @@ -# 简介 +
+ +[![PyPI](https://img.shields.io/pypi/v/dashinfer)](https://pypi.org/project/dashinfer/) + + +

+

+ English | + 中文 +

+

-DashInfer用于推理预训练大语言模型(LLM)的推理引擎。 + +
+ +# 简介 DashInfer采用C++ Runtime编写,提供C++和Python语言接口。DashInfer具有生产级别的高性能表现,适用于多种CPU架构,包括x86和ARMv9。DashInfer支持连续批处理(Continuous Batching)和多NUMA推理(NUMA-Aware),能够充分利用服务器级CPU的算力,为推理14B及以下的LLM模型提供更多的硬件选择。 @@ -82,12 +95,12 @@ $$ x_{u8} = x_{fp32} / scale + zeropoint $$ ![Workflow and Dependency](documents/resources/image/workflow-deps.jpg?row=true) -1. **模型加载与序列化**:此过程负责读取模型权重、配置模型转换参数及量化参数,并根据这些信息对模型进行序列化,并生成DashInfer格式(.asparam、.asgraph)的模型。此功能仅提供Python接口,并依赖于PyTorch和transformers库来访问权重。不同模型对PyTorch和transformers的版本要求可能有所不同,DashInfer本身并没有特殊的版本要求。 +1. **模型加载与序列化**:此过程负责读取模型权重、配置模型转换参数及量化参数,并根据这些信息对模型进行序列化,并生成DashInfer格式(.dimodel、.ditensors)的模型。此功能仅提供Python接口,并依赖于PyTorch和transformers库来访问权重。不同模型对PyTorch和transformers的版本要求可能有所不同,DashInfer本身并没有特殊的版本要求。 2. **模型推理**:此步骤负责执行模型推理,使用DashInfer推理序列化后的模型,不依赖PyTorch等组件。DashInfer采用[DLPack](https://github.com/dmlc/dlpack)格式的tensor来实现与外部框架(如PyTorch)的交互。DLPack格式的tensor,可以通过手动创建或由深度学习框架的tensor转换函数产生。对于C++接口,由于已经将几乎所有依赖静态编译,仅对openmp运行时库以及C++系统库的有依赖。我们进行了[链接符号处理](https://anadoxin.org/blog/control-over-symbol-exports-in-gcc.html/),以确保只有DashInfer的API接口符号可见,避免与客户系统中已有的公共库(如protobuf等)发生版本冲突。 > 说明: -> - .asparam、.asgraph是由DashInfer内核(allspark)定义的一种特殊的模型格式。 +> - .dimodel、.ditensors是由DashInfer内核定义的一种特殊的模型格式。 > - 使用Python接口时,可以将步骤1和2的代码放在一起。由于缺少C++层面加载Huggingface模型的功能,C++接口只能进行DashInfer格式的模型推理,因此在使用C++接口前,必须先用Python接口先对模型进行序列化。 ## 单NUMA架构图 diff --git a/csrc/common/as_engine.cpp b/csrc/common/as_engine.cpp index f683b40d..adeeef30 100644 --- a/csrc/common/as_engine.cpp +++ b/csrc/common/as_engine.cpp @@ -245,10 +245,6 @@ AsStatus AsEngineImpl::SetNumThreads(int num_threads) { DLOG(INFO) << "AsEngineImpl::SetNumThreads()" << std::endl; AsStatus ret = AsStatus::ALLSPARK_SUCCESS; device_ctx_->SetNumThreads(num_threads); - if (nranks_ > threadpool_size_) { - threadpool_size_ = nranks_ * 2; - threadpool_ = std::make_unique(threadpool_size_); - } std::future result[nranks_]; for (int i = 0; i < workers_.size(); ++i) { result[i] = threadpool_->enqueue([this, i, &num_threads]() { @@ -561,10 +557,6 @@ AsStatus AsEngineImpl::UnloadModelFromDeviceMemory(const char* model_name) { DLOG(INFO) << "[" << model_name << "] " << "AsEngineImpl::UnloadModelFromDeviceMemory()" << std::endl; AsStatus ret = AsStatus::ALLSPARK_SUCCESS; - if (nranks_ > threadpool_size_) { - threadpool_size_ = nranks_ * 2; - threadpool_ = std::make_unique(threadpool_size_); - } std::future result[nranks_]; for (int i = 0; i < nranks_; ++i) { result[i] = threadpool_->enqueue( @@ -635,10 +627,6 @@ AsStatus AsEngineImpl::StartModel(const char* model_name, bool do_warmup) { int64_t min_bytes_available = std::numeric_limits::max(); int64_t rank_0_bytes_available{0}; if (use_adaptive_cache_) { - if (nranks_ > threadpool_size_) { - threadpool_size_ = nranks_ * 2; - threadpool_ = std::make_unique(threadpool_size_); - } std::future result[nranks_]; for (int i = 0; i < nranks_; ++i) { result[i] = threadpool_->enqueue([this, i]() -> int64_t { @@ -850,6 +838,7 @@ AsStatus AsEngineImpl::StopModel(const char* model_name) { model_state->cond_var->notify_all(); auto ret = reply_promise->get_future().get(); + model_state->model_stopping = true; if (ret != AsStatus::ALLSPARK_SUCCESS) { LOG(ERROR) << "[" << model_name << "] " @@ -885,10 +874,6 @@ AsStatus AsEngineImpl::ReloadModelFromDeviceMemory(const char* model_name) { } AsStatus ret = AsStatus::ALLSPARK_SUCCESS; - if (nranks_ > threadpool_size_) { - threadpool_size_ = nranks_ * 2; - threadpool_ = std::make_unique(threadpool_size_); - } std::future result[nranks_]; for (int i = 0; i < nranks_; ++i) { result[i] = threadpool_->enqueue([this, i, &model_ir]() { @@ -1159,10 +1144,6 @@ AsStatus AsEngineImpl::RunTextGenerationContinue(const char* model_name) { return AsStatus::ALLSPARK_INVALID_CALL_ERROR; } AsStatus ret = AsStatus::ALLSPARK_SUCCESS; - if (nranks_ > threadpool_size_) { - threadpool_size_ = nranks_ * 2; - threadpool_ = std::make_unique(threadpool_size_); - } std::future result[nranks_]; for (int i = 0; i < nranks_; ++i) { result[i] = threadpool_->enqueue([this, i]() { @@ -1236,10 +1217,6 @@ AsStatus AsEngineImpl::RunTextGenerationContext(const char* model_name) { return AsStatus::ALLSPARK_INVALID_CALL_ERROR; } AsStatus ret = AsStatus::ALLSPARK_SUCCESS; - if (nranks_ > threadpool_size_) { - threadpool_size_ = nranks_ * 2; - threadpool_ = std::make_unique(threadpool_size_); - } std::future result[nranks_]; for (int i = 0; i < nranks_; ++i) { result[i] = threadpool_->enqueue([this, i]() { @@ -1293,11 +1270,7 @@ AsStatus AsEngineImpl::StopRequestByRequestID(const char* model_name, LOG(ERROR) << "Invalid model name : " << model_name << std::endl; return AsStatus::ALLSPARK_PARAM_ERROR; } - AsStatus ret = AsStatus::ALLSPARK_SUCCESS; - if (nranks_ > threadpool_size_) { - threadpool_size_ = nranks_ * 2; - threadpool_ = std::make_unique(threadpool_size_); - } + std::future result[nranks_]; for (int i = 0; i < nranks_; ++i) { result[i] = threadpool_->enqueue([this, i, request_id]() { @@ -1305,6 +1278,7 @@ AsStatus AsEngineImpl::StopRequestByRequestID(const char* model_name, }); } + AsStatus ret = AsStatus::ALLSPARK_SUCCESS; // 即使失败、异常,也要让各子线程运行完毕,以保证原子性。在可恢复的情况下,确保下一次请求有干净的环境 AsStatus failed_ret = AsStatus::ALLSPARK_SUCCESS; for (int i = 0; i < nranks_; ++i) { @@ -1333,11 +1307,7 @@ AsStatus AsEngineImpl::ReleaseRequestByRequestID(const char* model_name, LOG(ERROR) << "Invalid model name : " << model_name << std::endl; return AsStatus::ALLSPARK_PARAM_ERROR; } - AsStatus ret = AsStatus::ALLSPARK_SUCCESS; - if (nranks_ > threadpool_size_) { - threadpool_size_ = nranks_ * 2; - threadpool_ = std::make_unique(threadpool_size_); - } + std::future result[nranks_]; for (int i = 0; i < nranks_; ++i) { result[i] = threadpool_->enqueue([this, i, request_id]() { @@ -1345,6 +1315,7 @@ AsStatus AsEngineImpl::ReleaseRequestByRequestID(const char* model_name, }); } + AsStatus ret = AsStatus::ALLSPARK_SUCCESS; // 即使失败、异常,也要让各子线程运行完毕,以保证原子性。在可恢复的情况下,确保下一次请求有干净的环境 AsStatus failed_ret = AsStatus::ALLSPARK_SUCCESS; for (int i = 0; i < nranks_; ++i) { @@ -1461,10 +1432,6 @@ AsStatus AsEngineImpl::StartRequestImpl( {out_name, std::make_shared(out_name, DeviceType::CPU, DataType::INT64, DataMode::DENSE, Shape{1, engine_max_length_})}); - if (nranks_ > threadpool_size_) { - threadpool_size_ = nranks_ * 2; - threadpool_ = std::make_unique(threadpool_size_); - } std::future result[nranks_]; for (int i = 0; i < nranks_; ++i) { result[i] = threadpool_->enqueue( @@ -1668,7 +1635,6 @@ void AsEngineImpl::ModelRunningThread( s.c_str()); // set the name (pthread_self() returns the // pthread_t of the current thread) bool looping = true; - long loop_cnt = 0; bool graceful_stop_phase = false; bool graceful_final_released = false; std::unique_ptr graceful_stop_msg = nullptr; @@ -1682,7 +1648,6 @@ void AsEngineImpl::ModelRunningThread( while (looping) { util::Timer time_outer; - loop_cnt++; UpdateAsEngineStat(); // print the engine state for easier service trace. // for multiple numa, only print this info on node 0. @@ -1957,6 +1922,7 @@ void AsEngineImpl::ModelRunningThread( if (graceful_final_released) { assert(graceful_stop_msg != nullptr); graceful_stop_msg->promise->set_value(AsStatus::ALLSPARK_SUCCESS); + model_state->model_stopped = true; DLOG(INFO) << "All done, gracefully stopped!"; break; } @@ -2144,4 +2110,23 @@ std::string AsEngineStat::ToString() const { return result; } +std::map AsEngineStat::ToMap() const { + std::map engine_stat_map; + engine_stat_map["free_token"] = std::to_string(free_token); + engine_stat_map["total_token"] = std::to_string(total_token); + engine_stat_map["pendding_request"] = std::to_string(pendding_request); + engine_stat_map["running_request"] = std::to_string(running_request); + engine_stat_map["total_device_memory_pool_size"] = + std::to_string(total_device_memory_pool_size); + engine_stat_map["used_device_memory_pool_size"] = + std::to_string(used_device_memory_pool_size); + engine_stat_map["total_generated_token"] = + std::to_string(total_generated_token); + engine_stat_map["total_prefill_token"] = std::to_string(total_prefill_token); + engine_stat_map["generate_token_persec"] = + std::to_string(generate_token_persec); + engine_stat_map["process_token_persec"] = + std::to_string(process_token_persec); + return engine_stat_map; +} } // namespace allspark diff --git a/csrc/common/engine_runtime.h b/csrc/common/engine_runtime.h index cf8f11a3..f0f39a38 100644 --- a/csrc/common/engine_runtime.h +++ b/csrc/common/engine_runtime.h @@ -35,6 +35,7 @@ class ModelControlState final { result_queue_map; bool model_stopping = false; // after GracefulStopModel called... + bool model_stopped = false; // after GracefulStopModel is done. ModelControlState(const std::string& name) : model_name(name) { lock = std::make_unique(); diff --git a/csrc/core/model/qwen/qwen.cpp b/csrc/core/model/qwen/qwen.cpp index 049ed113..483d1444 100644 --- a/csrc/core/model/qwen/qwen.cpp +++ b/csrc/core/model/qwen/qwen.cpp @@ -24,4 +24,5 @@ AsStatus QwenModel::Init(const TransformerProto& model_proto, REGISTER_MODEL("Qwen", QwenModel) REGISTER_MODEL("Qwen_v10", QwenModel_v10) REGISTER_MODEL("Qwen_v15", QwenModel_v15) +REGISTER_MODEL("Qwen_v20", QwenModel_v20) } // namespace allspark diff --git a/csrc/core/model/qwen/qwen.h b/csrc/core/model/qwen/qwen.h index de5616f5..95fda201 100644 --- a/csrc/core/model/qwen/qwen.h +++ b/csrc/core/model/qwen/qwen.h @@ -31,4 +31,10 @@ class QwenModel_v15 : public QwenModel { : QwenModel(model_type){}; }; +class QwenModel_v20 : public QwenModel { + public: + explicit QwenModel_v20(const std::string& model_type = "") + : QwenModel(model_type){}; +}; + } // namespace allspark diff --git a/csrc/core/operator/general/get_last_line/get_last_line.h b/csrc/core/operator/general/get_last_line/get_last_line.h index 40f9d5be..9615e6f9 100644 --- a/csrc/core/operator/general/get_last_line/get_last_line.h +++ b/csrc/core/operator/general/get_last_line/get_last_line.h @@ -14,7 +14,7 @@ namespace allspark { class GetLastLineOp : public AsOperator { public: explicit GetLastLineOp(const std::string& op_type = "") - : AsOperator(op_type), batch_(0), seq_(0), hid_(0) {} + : AsOperator(op_type) {} AsStatus Init(const OperatorProto& op_proto, const DeviceContext& ctx, const TensorMap& weights_map, TensorMap* tensor_map); AsStatus Reshape() override; diff --git a/csrc/core/operator/general/rotary/rotary_op.cpp b/csrc/core/operator/general/rotary/rotary_op.cpp index c79b4d7e..e7b2e6b0 100644 --- a/csrc/core/operator/general/rotary/rotary_op.cpp +++ b/csrc/core/operator/general/rotary/rotary_op.cpp @@ -98,10 +98,14 @@ AsStatus RotaryOp::Init(const OperatorProto& op_proto, const DeviceContext& ctx, if (attr_map.find("rotary_base") != attr_map.end()) { base_ = *(float*)(attr_map.at("rotary_base").c_str()); } - xlogn_ = -1; - if (attr_map.find("logn_model_embedding") != attr_map.end()) { - xlogn_ = *(int*)(attr_map.at("logn_model_embedding").c_str()); + + // attr.8 multi_query_group_num + if (attr_map.find("multi_query_group_num") != attr_map.end()) { + group_num_ = *(int*)(attr_map.at("multi_query_group_num").c_str()); + } else { + group_num_ = num_heads_; } + size_per_head_ = ctx.GetSizePerHead(); // backend switch DeviceType backend = ctx.GetDeviceType(); @@ -109,6 +113,9 @@ AsStatus RotaryOp::Init(const OperatorProto& op_proto, const DeviceContext& ctx, case DeviceType::CPU: { const CPUContext* cpu_ctx = static_cast(ctx_); num_heads_ /= cpu_ctx->GetNranks(); + if (group_num_ != 1) { + group_num_ /= cpu_ctx->GetNranks(); + } break; } default: @@ -116,6 +123,8 @@ AsStatus RotaryOp::Init(const OperatorProto& op_proto, const DeviceContext& ctx, << DeviceType_Name(backend) << " device type" << std::endl; return AsStatus::ALLSPARK_RUNTIME_ERROR; } + kv_stride_ = size_per_head_ * group_num_; + hidden_size_ = size_per_head_ * num_heads_; return AsStatus::ALLSPARK_SUCCESS; } AsStatus RotaryOp::Reshape(RuntimeContext* runtime_ctx) { @@ -124,42 +133,40 @@ AsStatus RotaryOp::Reshape(RuntimeContext* runtime_ctx) { Shape y_shape(x_shape); batch_size_ = y_shape[0]; seq_len_ = y_shape[1]; - hidden_size_ = y_shape[2] / 3; - tensor_map_->at(out_names_[0])->SetShape(std::move(y_shape)); - // set variable - if (hidden_size_ % num_heads_) { - LOG(ERROR) << "Invalid attribute in RotaryOp. hidden_size : " - << hidden_size_ << ", num_heads : " << num_heads_ << std::endl; + qkv_stride_ = y_shape[2]; + if (qkv_stride_ != hidden_size_ + 2 * kv_stride_) { + LOG(ERROR) << "Invalid qkv_stride_ in RotaryOp" + << ", qkv_strde = " << qkv_stride_ + << ", hidden_size = " << hidden_size_ + << ", kv_stride = " << kv_stride_ << std::endl; return AsStatus::ALLSPARK_RUNTIME_ERROR; } - size_per_head_ = hidden_size_ / num_heads_; - gemm_batch_ = batch_size_ * num_heads_; + tensor_map_->at(out_names_[0])->SetShape(std::move(y_shape)); return AsStatus::ALLSPARK_SUCCESS; } AsStatus RotaryOp::RunRotary(int run_batch_size, AsTensor* rotary_step, AsTensor* rotary_inv_freq) { int* run_step = (int*)rotary_step->GetDataPtr(); float* inv_freq = (float*)rotary_inv_freq->GetDataPtr(); - int qkv_stride = 3 * hidden_size_; + int qkv_stride = qkv_stride_; int* batch_offset = nullptr; - int offset = hidden_size_ * SizeofType(dtype_); void* q_buf = (char*)tensor_map_->at(in_names_[0])->GetDataPtr(); - void* k_buf = (char*)q_buf + offset; - void* v_buf = (char*)k_buf + offset; + void* k_buf = (char*)q_buf + hidden_size_ * SizeofType(dtype_); + void* v_buf = (char*)k_buf + kv_stride_ * SizeofType(dtype_); void* outq_buf = (char*)tensor_map_->at(out_names_[0])->GetDataPtr(); - void* outk_buf = (char*)outq_buf + offset; - void* outv_buf = (char*)outk_buf + offset; + void* outk_buf = (char*)outq_buf + hidden_size_ * SizeofType(dtype_); + void* outv_buf = (char*)outk_buf + kv_stride_ * SizeofType(dtype_); rotary_launcher(dtype_, outq_buf, q_buf, inv_freq, batch_offset, run_batch_size, seq_len_, run_step, hidden_size_, num_heads_, size_per_head_, 0, qkv_stride, rotary_type_, rotary_pct_, xlogn_, ctx_); rotary_launcher(dtype_, outk_buf, k_buf, inv_freq, batch_offset, - run_batch_size, seq_len_, run_step, hidden_size_, num_heads_, + run_batch_size, seq_len_, run_step, hidden_size_, group_num_, size_per_head_, 0, qkv_stride, rotary_type_, rotary_pct_, -1, ctx_); rotary_launcher(dtype_, outv_buf, v_buf, nullptr, batch_offset, - run_batch_size, seq_len_, run_step, hidden_size_, num_heads_, + run_batch_size, seq_len_, run_step, hidden_size_, group_num_, size_per_head_, 0, qkv_stride, rotary_type_, rotary_pct_, -1, ctx_); return AsStatus::ALLSPARK_SUCCESS; diff --git a/csrc/core/operator/general/rotary/rotary_op.h b/csrc/core/operator/general/rotary/rotary_op.h index 2d0d7a71..6175206a 100644 --- a/csrc/core/operator/general/rotary/rotary_op.h +++ b/csrc/core/operator/general/rotary/rotary_op.h @@ -82,6 +82,9 @@ class RotaryOp : public AsOperator { float rotary_pct_; float seqlen_extrapolation_; int ntk_model_embed_; + int group_num_ = 0; + int qkv_stride_ = 0; + int kv_stride_ = 0; }; } // namespace allspark diff --git a/csrc/core/operator/generate_opt/batch_mqa/batch_mqa_op.cpp b/csrc/core/operator/generate_opt/batch_mqa/batch_mqa_op.cpp index 3c4f7179..fa71ccbe 100644 --- a/csrc/core/operator/generate_opt/batch_mqa/batch_mqa_op.cpp +++ b/csrc/core/operator/generate_opt/batch_mqa/batch_mqa_op.cpp @@ -84,6 +84,7 @@ AsStatus BatchMQAOp::Init(const OperatorProto& op_proto, // type inference dtype_ = tensor_map_->at(in_names_[0])->GetDataType(); tensor_map_->at(out_names_[0])->SetDataType(dtype_); + // attr auto& attr_map = op_proto.attr(); if (attr_map.find("multinode") != attr_map.end()) { @@ -91,28 +92,19 @@ AsStatus BatchMQAOp::Init(const OperatorProto& op_proto, } else { multi_nodes_ = true; } + if (attr_map.find("num_heads") == attr_map.end()) { LOG(ERROR) << "BatchMQAOp : can't find num_heads attribute." << std::endl; return AsStatus::ALLSPARK_PARAM_ERROR; } num_heads_ = *(int*)(attr_map.at("num_heads").c_str()); - if (attr_map.find("hidden_size") == attr_map.end()) { - LOG(ERROR) << "BatchMQAOp : can't find hidden_size attribute." << std::endl; - return AsStatus::ALLSPARK_PARAM_ERROR; - } - hidden_size_ = *(int*)(attr_map.at("hidden_size").c_str()); - if (hidden_size_ % num_heads_) { - LOG(ERROR) << "Invalid attribute in BatchMQAOp. hidden_size : " - << hidden_size_ << ", num_heads : " << num_heads_ << std::endl; - return AsStatus::ALLSPARK_RUNTIME_ERROR; - } - size_per_head_ = hidden_size_ / num_heads_; - if (attr_map.find("multi_query_group_num") == attr_map.end()) { - LOG(ERROR) << "BatchMQAOp : can't find multi_query_group_num attribute." - << std::endl; - return AsStatus::ALLSPARK_PARAM_ERROR; + + size_per_head_ = ctx.GetSizePerHead(); + if (attr_map.find("multi_query_group_num") != attr_map.end()) { + group_num_ = *(int*)(attr_map.at("multi_query_group_num").c_str()); + } else { + group_num_ = num_heads_; } - group_num_ = *(int*)(attr_map.at("multi_query_group_num").c_str()); DeviceType backend = ctx.GetDeviceType(); switch (backend) { @@ -120,7 +112,6 @@ AsStatus BatchMQAOp::Init(const OperatorProto& op_proto, kernel_launcher = cpu_dec_single_mqa; if (multi_nodes_) { const CPUContext* cpu_ctx = static_cast(ctx_); - hidden_size_ /= cpu_ctx->GetNranks(); num_heads_ /= cpu_ctx->GetNranks(); if (group_num_ != 1) { group_num_ /= cpu_ctx->GetNranks(); @@ -134,6 +125,7 @@ AsStatus BatchMQAOp::Init(const OperatorProto& op_proto, return AsStatus::ALLSPARK_RUNTIME_ERROR; } kv_stride_ = size_per_head_ * group_num_; + hidden_size_ = size_per_head_ * num_heads_; return AsStatus::ALLSPARK_SUCCESS; } AsStatus BatchMQAOp::Reshape(RuntimeContext* runtime_ctx) { @@ -146,11 +138,12 @@ AsStatus BatchMQAOp::Reshape(RuntimeContext* runtime_ctx) { qkv_stride_ = y_shape[2]; if (qkv_stride_ != hidden_size_ + 2 * kv_stride_) { LOG(ERROR) << "Invalid qkv_stride_ in BatchMQAOp" - << "qkv_strde = " << qkv_stride_ - << ",hidden_size = " << hidden_size_ + << ", qkv_strde = " << qkv_stride_ + << ", hidden_size = " << hidden_size_ << ", kv_stride = " << kv_stride_ << std::endl; return AsStatus::ALLSPARK_RUNTIME_ERROR; } + // set variable gemm_batch_ = single_batch * num_heads_; if (alpha_ < 0) { diff --git a/csrc/interface/allspark.h b/csrc/interface/allspark.h index a45c03e5..8ed47e2a 100644 --- a/csrc/interface/allspark.h +++ b/csrc/interface/allspark.h @@ -36,7 +36,7 @@ enum class AsCacheMode { }; /** - * Converted asparam, asgraph file info class. + * Converted ditensors, dimodel file info class. */ class AsFileInfo { @@ -74,8 +74,8 @@ struct GenerateConfig { bad_words_ids; ///< IDs of words to avoid during generation, will supress ///< thoese ids's generation. float temperature = 1.0; ///< Sampling temperature. - int top_k = 1; ///< Top-K sampling hyperparameter. - float top_p = 0.0; ///< Top-P sampling hyperparameter. + int top_k = 50; ///< Top-K sampling hyperparameter. + float top_p = 1.0; ///< Top-P sampling hyperparameter. float repetition_penalty = 1.0; ///< Penalty for word repetition. float length_penalty = 1.0; ///< Penalty for the length of the sequence. float presence_penalty = 0; ///< Penalty for the presence of words. @@ -153,6 +153,7 @@ class AsEngineStat { AsEngineStat(std::string in_model_name) : model_name(std::move(in_model_name)) {} std::string ToString() const; + std::map ToMap() const; public: std::string model_name; @@ -213,19 +214,41 @@ class AsEngine final { GenerateConfig config; }; - // two type of elements, one is generated IDs, the other is for - // oridinary requests. + /** + * The GeneratedElements class represents generated elements and associated + * probability information. It consists of four main data members: + * 1. ids_from_generate - Stores generated IDs, which only keep new results + * and exclude historical ones. + * 2. log_probs_list - Stores a probability list for each token, along with + * the top_logprobs tokens and their probabilities when generated. + * 3. token_logprobs_list - Stores the probability value for each selected + * token. + * 4. tensors_from_model_inference - Contains tensors from model inference. + */ class GeneratedElements { public: - std::vector - ids_from_generate; /// this output is for GPT style generative - /// models, only keeps new results and will not - /// include history results. + /** + * Stores generated IDs used by GPT-style generative models, excluding + * historical results. + */ + std::vector ids_from_generate; + + /** + * A probability list for each token, including the top_logprobs tokens and + * their probabilities when generated. Dimension: [num_token][top_logprobs], + * where each token has a pair [token_id, prob]. + */ std::vector>> log_probs_list; + + /** + * Stores the probability value for each selected token. + */ std::vector token_logprobs_list; - DLTensorMap - tensors_from_model_inference; /// this output only has data when - /// infer mode is model inference. + + /** + * Tensor outputs from model inference. + */ + DLTensorMap tensors_from_model_inference; }; enum class GenerateRequestStatus { @@ -238,26 +261,78 @@ class AsEngine final { /// was unfortunedly stopped. }; + /** + * @class ResultQueue + * + * The ResultQueue class is designed to generate status, and retrieve results + * in a queue. It provides four main virtual methods: + * 1. A method for generating status; + * 2. A method to get the length of generated results; + * 3. A method to fetch a result from the queue; and + * 4. A method to fetch a result without waiting. + */ class ResultQueue { public: + /** + * Generates the status of a request. + * + * @return GenerateRequestStatus Returns the status of the generation + * request. + */ virtual GenerateRequestStatus GenerateStatus() { throw std::runtime_error("Function not implemented."); } + + /** + * Retrieves the length of generated results. + * + * @return size_t Returns the length of the generated results. + */ virtual size_t GeneratedLength() { throw std::runtime_error("Function not implemented."); } + + /** + * Fetches a result from the queue, will be block until new token generated + * + * @return std::shared_ptr Returns a smart pointer to the + * generated elements. + */ virtual std::shared_ptr Get() { throw std::runtime_error("Function not implemented."); } + + /** + * Retrieves a result from the queue without waiting. + * + * @return std::shared_ptr Returns a smart pointer to the + * generated elements. + */ virtual std::shared_ptr GetNoWait() { throw std::runtime_error("Function not implemented."); } }; + + /** + * @typedef ResultQueue_t + * + * ResultQueue_t is an alias for a pointer to a ResultQueue object, providing + * a clearer syntax for pointer usage. + */ typedef ResultQueue* ResultQueue_t; AsEngine(); ~AsEngine(); + /** + * Builds a model from the provided configuration structure. + * + * @param model_config A reference to the model configuration struct + * containing all necessary settings for building the model. + * @return Returns an AsStatus value indicating the success or failure of the + * model building operation. If successful, returns AS_SUCCESS; otherwise, + * returns an error code indicating the specific issue. + */ AsStatus BuildModelFromConfigStruct(AsModelConfig& model_config); /** @@ -341,6 +416,11 @@ class AsEngine final { */ AsStatus SyncRequest(const char* model_name, RequestHandle_t request_handle); + /** + * Retrieves the statistic information for specified model + * @param model_name the model name already install into engine. + * @return return the statistic information structure + */ AsEngineStat GetAsEngineStat(const char* model_name); /** diff --git a/documents/CN/examples_python.md b/documents/CN/examples_python.md index 70bc7275..a975fbc8 100644 --- a/documents/CN/examples_python.md +++ b/documents/CN/examples_python.md @@ -304,7 +304,7 @@ To create a public link, set `share=True` in `launch()`. 以下是对config中的参数说明: - `model_name`: DashInfer模型名称,自定义; -- `model_type`: DashInfer模型类型,可选项:LLaMA_v2、ChatGLM_v2、ChatGLM_v3、Qwen_v10、Qwen_v15; +- `model_type`: DashInfer模型类型,可选项:LLaMA_v2、ChatGLM_v2、ChatGLM_v3、Qwen_v10、Qwen_v15、Qwen_v20; - `model_path`: DashInfer模型导出路径; - `data_type`: 输出的数据类型,可选项:float32; - `device_type`: 推理硬件,可选项:CPU; diff --git a/documents/EN/examples_python.md b/documents/EN/examples_python.md index 5f9d994a..6351fcaa 100644 --- a/documents/EN/examples_python.md +++ b/documents/EN/examples_python.md @@ -304,7 +304,7 @@ The `/examples/python/model_config` directory provides severa Here is an explanation of the parameters within the config: - `model_name`: Custom name for the DashInfer model. -- `model_type`: The type of the DashInfer model. Options include: LLaMA_v2, ChatGLM_v2, ChatGLM_v3, Qwen_v10, Qwen_v15. +- `model_type`: The type of the DashInfer model. Options include: LLaMA_v2, ChatGLM_v2, ChatGLM_v3, Qwen_v10, Qwen_v15, Qwen_v20. - `model_path`: The export path for the DashInfer model. - `data_type`: The data type of the output. Options include: float32. - `device_type`: The inference hardware. Options include: CPU. diff --git a/documents/resources/image/workflow-deps.jpg b/documents/resources/image/workflow-deps.jpg index f912988268ecabd0eefacb9e3affb0ee9c6dff29..bf7843e10b54ec42d21d60e734522dc8dbd8c9e2 100644 GIT binary patch literal 165019 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

xeM&NLvNu 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 diff --git a/examples/cpp/0_basic/example_qwen.cpp b/examples/cpp/0_basic/example_qwen.cpp index f3ee916d..8606ea4f 100644 --- a/examples/cpp/0_basic/example_qwen.cpp +++ b/examples/cpp/0_basic/example_qwen.cpp @@ -72,8 +72,8 @@ int main(int argc, char** argv) { auto all_exists = check_model_file_exists(model_path, tiktoken_file); if (!all_exists) return 1; - std::string asgraph_file = model_path + ".asgraph"; - std::string asparam_file = model_path + ".asparam"; + std::string dimodel_file = model_path + ".dimodel"; + std::string ditensors_file = model_path + ".ditensors"; // create an inference engine instance. std::unique_ptr as_engine = std::make_unique(); @@ -88,15 +88,15 @@ int main(int argc, char** argv) { // the convert model part, please see python example, // it will generate a running model from // a huggleface type model to a allspark model, - // file name will be like "qwen_v15.asparam, qwen_v15.asgraph" + // file name will be like "qwen_v15.ditensors, qwen_v15.dimodel" // // use model config builder to build model config. AsModelConfigBuilder model_config_builder; auto model_config = model_config_builder.withModelName(model_name) - .withModelPath(asgraph_file) - .withWeightsPath(asparam_file) + .withModelPath(dimodel_file) + .withWeightsPath(ditensors_file) .withEngineMaxLength(default_engine_max_length) .withEngineMaxBatch(16) .withMatmulPrecision("medium") diff --git a/examples/cpp/1_apiserver/apiserver.cpp b/examples/cpp/1_apiserver/apiserver.cpp index ed68233e..ca00e4eb 100644 --- a/examples/cpp/1_apiserver/apiserver.cpp +++ b/examples/cpp/1_apiserver/apiserver.cpp @@ -383,8 +383,8 @@ int main(int argc, const char** argv) { auto all_exists = check_model_file_exists(model_path, tiktoken_file); if (!all_exists) return 1; - std::string asgraph_file = model_path + ".asgraph"; - std::string asparam_file = model_path + ".asparam"; + std::string dimodel_file = model_path + ".dimodel"; + std::string ditensors_file = model_path + ".ditensors"; // create an inference engine instance. setup_tiktoken_tokenizer(tiktoken_file, tokenizer); @@ -395,8 +395,8 @@ int main(int argc, const char** argv) { AsModelConfigBuilder model_config_builder; auto model_config = model_config_builder.withModelName(model_name) - .withModelPath(asgraph_file) - .withWeightsPath(asparam_file) + .withModelPath(dimodel_file) + .withWeightsPath(ditensors_file) .withEngineMaxLength(default_engine_max_length) .withEngineMaxBatch(16) .withMatmulPrecision("medium") diff --git a/examples/cpp/utils/misc.hpp b/examples/cpp/utils/misc.hpp index 5e179b9e..243252f4 100644 --- a/examples/cpp/utils/misc.hpp +++ b/examples/cpp/utils/misc.hpp @@ -20,22 +20,22 @@ static bool file_exists(const std::string& path) { static bool check_model_file_exists(const std::string& model_path, const std::string& tiktoken_file) { - std::string asgraph_file = model_path + ".asgraph"; - std::string asparam_file = model_path + ".asparam"; + std::string dimodel_file = model_path + ".dimodel"; + std::string ditensors_file = model_path + ".ditensors"; std::cout << "Model Path: " << model_path << std::endl; - std::cout << "ASGraph File: " << asgraph_file << std::endl; - std::cout << "ASParam File: " << asparam_file << std::endl; + std::cout << "Dash-Infer Model File: " << dimodel_file << std::endl; + std::cout << "Dash-Infer Tensor File: " << ditensors_file << std::endl; std::cout << "Token table File: " << tiktoken_file << std::endl; - if (!file_exists(asgraph_file)) { - std::cerr << "Error: ASGraph file does not exist at '" << asgraph_file + if (!file_exists(dimodel_file)) { + std::cerr << "Error: dimodel file does not exist at '" << dimodel_file << "'" << std::endl; return false; } - if (!file_exists(asparam_file)) { - std::cerr << "Error: ASParam file does not exist at '" << asparam_file + if (!file_exists(ditensors_file)) { + std::cerr << "Error: ditensors file does not exist at '" << ditensors_file << "'" << std::endl; return false; } diff --git a/examples/python/0_basic/basic_example_chatglm2.py b/examples/python/0_basic/basic_example_chatglm2.py index 9d90543c..fa6b731c 100644 --- a/examples/python/0_basic/basic_example_chatglm2.py +++ b/examples/python/0_basic/basic_example_chatglm2.py @@ -3,11 +3,10 @@ # @file basic_example_chatglm2.py # import os -import sys import copy import time -import queue import random +import argparse import subprocess from jinja2 import Template from concurrent.futures import ThreadPoolExecutor @@ -83,8 +82,13 @@ def done_callback(future): if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--quantize', action='store_true') + args = parser.parse_args() + config_file = "../model_config/config_chatglm2_6b.json" config = ConfigManager.get_config_from_json(config_file) + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" package_location = subprocess.run(cmd, diff --git a/examples/python/0_basic/basic_example_chatglm3.py b/examples/python/0_basic/basic_example_chatglm3.py index 56273ca0..fb6f3279 100644 --- a/examples/python/0_basic/basic_example_chatglm3.py +++ b/examples/python/0_basic/basic_example_chatglm3.py @@ -3,11 +3,10 @@ # @file basic_example_chatglm3.py # import os -import sys import copy import time -import queue import random +import argparse import subprocess from jinja2 import Template from concurrent.futures import ThreadPoolExecutor @@ -86,8 +85,13 @@ def done_callback(future): if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--quantize', action='store_true') + args = parser.parse_args() + config_file = "../model_config/config_chatglm3_6b.json" config = ConfigManager.get_config_from_json(config_file) + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" package_location = subprocess.run(cmd, diff --git a/examples/python/0_basic/basic_example_llama2.py b/examples/python/0_basic/basic_example_llama2.py index b0702488..5b8b7289 100644 --- a/examples/python/0_basic/basic_example_llama2.py +++ b/examples/python/0_basic/basic_example_llama2.py @@ -3,11 +3,10 @@ # @file basic_example_llama2.py # import os -import sys import copy import time -import queue import random +import argparse import subprocess from jinja2 import Template from concurrent.futures import ThreadPoolExecutor @@ -74,8 +73,13 @@ def done_callback(future): if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--quantize', action='store_true') + args = parser.parse_args() + config_file = "../model_config/config_llama2_7b.json" config = ConfigManager.get_config_from_json(config_file) + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" package_location = subprocess.run(cmd, diff --git a/examples/python/0_basic/basic_example_qwen_v10.py b/examples/python/0_basic/basic_example_qwen_v10.py index 8b860a6d..4b2ca4f8 100644 --- a/examples/python/0_basic/basic_example_qwen_v10.py +++ b/examples/python/0_basic/basic_example_qwen_v10.py @@ -3,11 +3,10 @@ # @file basic_example_qwen_v10.py # import os -import sys import copy import time -import queue import random +import argparse import subprocess from jinja2 import Template from concurrent.futures import ThreadPoolExecutor @@ -92,8 +91,13 @@ def done_callback(future): if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--quantize', action='store_true') + args = parser.parse_args() + config_file = "../model_config/config_qwen_v10_1_8b.json" config = ConfigManager.get_config_from_json(config_file) + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" package_location = subprocess.run(cmd, diff --git a/examples/python/0_basic/basic_example_qwen_v10_io.ipynb b/examples/python/0_basic/basic_example_qwen_v10_io.ipynb index 7e09606f..bf3368d2 100644 --- a/examples/python/0_basic/basic_example_qwen_v10_io.ipynb +++ b/examples/python/0_basic/basic_example_qwen_v10_io.ipynb @@ -226,7 +226,7 @@ "### convert_config: {'do_dynamic_quantize_convert': False}\n", "### engine_config: {'engine_max_length': 2048, 'engine_max_batch': 8, 'do_profiling': False, 'num_threads': 0, 'matmul_precision': 'medium'}\n", "\n", - "No such file or directory: ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.asgraph\n", + "No such file or directory: ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.dimodel\n", "\n" ] }, @@ -245,11 +245,11 @@ "trans model from huggingface model: /mnt/workspace/.cache/modelscope/qwen/Qwen-1_8B-Chat\n", "Dashinfer model will save to ./dashinfer_models/\n", "### model_config: {'vocab_size': 151936, 'hidden_size': 2048, 'intermediate_size': 11008, 'num_hidden_layers': 24, 'num_attention_heads': 16, 'emb_dropout_prob': 0.0, 'attn_dropout_prob': 0.0, 'layer_norm_epsilon': 1e-06, 'initializer_range': 0.02, 'scale_attn_weights': True, 'use_cache': True, 'max_position_embeddings': 8192, 'bf16': False, 'fp16': False, 'fp32': True, 'kv_channels': 128, 'rotary_pct': 1.0, 'rotary_emb_base': 10000, 'use_dynamic_ntk': True, 'use_logn_attn': True, 'use_flash_attn': False, 'no_bias': True, 'use_cache_quantization': False, 'use_cache_kernel': False, 'softmax_in_fp32': False, 'return_dict': True, 'output_hidden_states': False, 'output_attentions': False, 'torchscript': False, 'torch_dtype': None, 'use_bfloat16': False, 'tf_legacy_loss': False, 'pruned_heads': {}, 'tie_word_embeddings': False, 'chunk_size_feed_forward': 0, 'is_encoder_decoder': False, 'is_decoder': False, 'cross_attention_hidden_size': None, 'add_cross_attention': False, 'tie_encoder_decoder': False, 'max_length': 20, 'min_length': 0, 'do_sample': False, 'early_stopping': False, 'num_beams': 1, 'num_beam_groups': 1, 'diversity_penalty': 0.0, 'temperature': 1.0, 'top_k': 50, 'top_p': 1.0, 'typical_p': 1.0, 'repetition_penalty': 1.0, 'length_penalty': 1.0, 'no_repeat_ngram_size': 0, 'encoder_no_repeat_ngram_size': 0, 'bad_words_ids': None, 'num_return_sequences': 1, 'output_scores': False, 'return_dict_in_generate': False, 'forced_bos_token_id': None, 'forced_eos_token_id': None, 'remove_invalid_values': False, 'exponential_decay_length_penalty': None, 'suppress_tokens': None, 'begin_suppress_tokens': None, 'architectures': ['QWenLMHeadModel'], 'finetuning_task': None, 'id2label': {0: 'LABEL_0', 1: 'LABEL_1'}, 'label2id': {'LABEL_0': 0, 'LABEL_1': 1}, 'tokenizer_class': 'QWenTokenizer', 'prefix': None, 'bos_token_id': None, 'pad_token_id': None, 'eos_token_id': None, 'sep_token_id': None, 'decoder_start_token_id': None, 'task_specific_params': None, 'problem_type': None, '_name_or_path': '/mnt/workspace/.cache/modelscope/qwen/Qwen-1_8B-Chat', '_commit_hash': None, '_attn_implementation_internal': None, 'transformers_version': '4.32.0', 'auto_map': {'AutoConfig': 'configuration_qwen.QWenConfig', 'AutoModelForCausalLM': 'modeling_qwen.QWenLMHeadModel'}, 'model_type': 'qwen', 'onnx_safe': None, 'seq_length': 8192, 'size_per_head': 128}\n", - "save asgraph to ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.asgraph\n", - "save asparam to ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.asparam\n", + "save dimodel to ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.dimodel\n", + "save ditensors to ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.ditensors\n", "parse weight time: 8.782530069351196\n", "current allspark version major[ 1 ] minor[ 0 ] patch[ 4 ] commit = 0549ab25\n", - "calculate md5 of asgraph = 2d5d46b154e9f0c8bd51274775675eea\n", + "calculate md5 of dimodel = 2d5d46b154e9f0c8bd51274775675eea\n", "torch build meta: \t model_name \t: Qwen-1_8B-Chat_cpu_single_float32\n", "torch build meta: \t model_type \t: Qwen_v10\n", "torch build meta: \t save_dir \t: ./dashinfer_models/\n", @@ -272,8 +272,8 @@ "I20240513 10:46:39.666299 732 as_engine.cpp:384] Build model use following config:\n", "AsModelConfig :\n", "\tmodel_name: Qwen-1_8B-Chat_cpu_single_float32\n", - "\tmodel_path: ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.asgraph\n", - "\tweights_path: ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.asparam\n", + "\tmodel_path: ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.dimodel\n", + "\tweights_path: ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.ditensors\n", "\tcompute_unit: CPU:0\n", "\tnum_threads: 32\n", "\tmatmul_precision: medium\n", @@ -282,7 +282,7 @@ "\tengine_max_length = 2048\n", "\tengine_max_batch = 8\n", "\n", - "I20240513 10:46:39.666332 732 as_engine.cpp:388] Load model from : ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.asgraph\n", + "I20240513 10:46:39.666332 732 as_engine.cpp:388] Load model from : ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.dimodel\n", "I20240513 10:46:39.666359 732 as_engine.cpp:303] SetDeviceIds: DeviceIDs.size() 1\n", "I20240513 10:46:39.666363 732 as_engine.cpp:310] Start create 1 Device: CPU workers.\n", "I20240513 10:46:39.666476 988 cpu_context.cpp:114] CPUContext::InitMCCL() rank: 0 nRanks: 1\n", @@ -290,7 +290,7 @@ "I20240513 10:46:39.720805 732 as_engine.cpp:511] Start BuildModel\n", "I20240513 10:46:39.720876 990 as_engine.cpp:521] Start Build model for rank: 0\n", "I20240513 10:46:39.720901 990 weight_manager.cpp:131] Start Loading weight for model RankInfo[0/1]\n", - "I20240513 10:46:39.720912 990 weight_manager.cpp:52] Start open model file ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.asparam\n", + "I20240513 10:46:39.720912 990 weight_manager.cpp:52] Start open model file ./dashinfer_models/Qwen-1_8B-Chat_cpu_single_float32.ditensors\n", "I20240513 10:46:39.720919 990 weight_manager.cpp:59] Open model file " ] }, diff --git a/examples/python/0_basic/basic_example_qwen_v10_io.py b/examples/python/0_basic/basic_example_qwen_v10_io.py index cc611272..eabd10b8 100644 --- a/examples/python/0_basic/basic_example_qwen_v10_io.py +++ b/examples/python/0_basic/basic_example_qwen_v10_io.py @@ -7,6 +7,7 @@ import copy import time import random +import argparse import subprocess from jinja2 import Template from concurrent.futures import ThreadPoolExecutor @@ -71,8 +72,13 @@ def print_in_place(generator): if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--quantize', action='store_true') + args = parser.parse_args() + config_file = "../model_config/config_qwen_v10_1_8b.json" config = ConfigManager.get_config_from_json(config_file) + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" package_location = subprocess.run(cmd, diff --git a/examples/python/0_basic/basic_example_qwen_v15.py b/examples/python/0_basic/basic_example_qwen_v15.py index 963836b7..0ff39a03 100644 --- a/examples/python/0_basic/basic_example_qwen_v15.py +++ b/examples/python/0_basic/basic_example_qwen_v15.py @@ -3,11 +3,10 @@ # @file basic_example_qwen_v15.py # import os -import sys import copy import time -import queue import random +import argparse import subprocess from jinja2 import Template from concurrent.futures import ThreadPoolExecutor @@ -106,8 +105,13 @@ def done_callback(future): if __name__ == '__main__': check_transformers_version() + parser = argparse.ArgumentParser() + parser.add_argument('--quantize', action='store_true') + args = parser.parse_args() + config_file = "../model_config/config_qwen_v15_1_8b.json" config = ConfigManager.get_config_from_json(config_file) + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" package_location = subprocess.run(cmd, diff --git a/examples/python/0_basic/basic_example_qwen_v15_dimodel.py b/examples/python/0_basic/basic_example_qwen_v15_dimodel.py new file mode 100644 index 00000000..31146f3c --- /dev/null +++ b/examples/python/0_basic/basic_example_qwen_v15_dimodel.py @@ -0,0 +1,122 @@ +# +# Copyright (c) Alibaba, Inc. and its affiliates. +# @file basic_example_qwen_v15_dimodel.py +# +import os +import copy +import time +import random +import argparse +import subprocess +from jinja2 import Template +from concurrent.futures import ThreadPoolExecutor + +from modelscope import snapshot_download +from dashinfer.helper import EngineHelper, ConfigManager + + +def create_test_prompt(default_gen_cfg=None): + input_list = [ + "浙江的省会在哪", + "Where is the capital of Zhejiang?", + "将“温故而知新”翻译成英文,并解释其含义", + ] + + start_text = "<|im_start|>" + end_text = "<|im_end|>" + system_msg = {"role": "system", "content": "You are a helpful assistant."} + user_msg = {"role": "user", "content": ""} + assistant_msg = {"role": "assistant", "content": ""} + + prompt_template = Template( + "{{start_text}}" + "{{system_role}}\n" + "{{system_content}}" + "{{end_text}}\n" + + "{{start_text}}" + "{{user_role}}\n" + "{{user_content}}" + "{{end_text}}\n" + + "{{start_text}}" + "{{assistant_role}}\n") + + gen_cfg_list = [] + prompt_list = [] + for i in range(len(input_list)): + user_msg["content"] = input_list[i] + prompt = prompt_template.render(start_text=start_text, end_text=end_text, + system_role=system_msg["role"], system_content=system_msg["content"], + user_role=user_msg["role"], user_content=user_msg["content"], + assistant_role=assistant_msg["role"]) + prompt_list.append(prompt) + if default_gen_cfg != None: + gen_cfg = copy.deepcopy(default_gen_cfg) + gen_cfg["seed"] = random.randint(0, 10000) + gen_cfg_list.append(gen_cfg) + + return prompt_list, gen_cfg_list + + +def process_request(request_list, engine_helper: EngineHelper): + + def done_callback(future): + request = future.argument + future.result() + engine_helper.print_inference_result(request) + + # create a threadpool + executor = ThreadPoolExecutor( + max_workers=engine_helper.engine_config["engine_max_batch"]) + + try: + # submit all tasks to the threadpool + futures = [] + for request in request_list: + future = executor.submit(engine_helper.process_one_request, request) + future.argument = request + future.add_done_callback(done_callback) + futures.append(future) + finally: + executor.shutdown(wait=True) + + return + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--quantize', action='store_true') + args = parser.parse_args() + + model_path = snapshot_download("dash-infer/Qwen1.5-1.8B-Chat-DI") + + config_file = model_path + "/" + "di_config.json" + config = ConfigManager.get_config_from_json(config_file) + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize + config["model_path"] = model_path + + cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" + package_location = subprocess.run(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, + text=True) + package_location = package_location.stdout.strip() + os.environ["AS_DAEMON_PATH"] = package_location + "/dashinfer/allspark/bin" + os.environ["AS_NUMA_NUM"] = str(len(config["device_ids"])) + os.environ["AS_NUMA_OFFSET"] = str(config["device_ids"][0]) + + ## init EngineHelper class + engine_helper = EngineHelper(config) + engine_helper.verbose = True + engine_helper.init_tokenizer(model_path) + + ## inference + engine_helper.init_engine() + + prompt_list, gen_cfg_list = create_test_prompt( + engine_helper.default_gen_cfg) + request_list = engine_helper.create_request(prompt_list, gen_cfg_list) + + global_start = time.time() + process_request(request_list, engine_helper) + global_end = time.time() + + total_timecost = global_end - global_start + # engine_helper.print_inference_result_all(request_list) + engine_helper.print_profiling_data(request_list, total_timecost) + print(f"total timecost: {total_timecost} s") + + engine_helper.uninit_engine() diff --git a/examples/python/0_basic/basic_example_qwen_v15_dimodel_simple.py b/examples/python/0_basic/basic_example_qwen_v15_dimodel_simple.py new file mode 100644 index 00000000..a175a825 --- /dev/null +++ b/examples/python/0_basic/basic_example_qwen_v15_dimodel_simple.py @@ -0,0 +1,38 @@ +# +# Copyright (c) Alibaba, Inc. and its affiliates. +# @file basic_example_qwen_v15_dimodel_simple.py +# +import copy +import random + +from modelscope import snapshot_download +from dashinfer.helper import EngineHelper, ConfigManager + +model_path = snapshot_download("dash-infer/Qwen1.5-1.8B-Chat-DI") + +config_file = model_path + "/" + "di_config.json" +config = ConfigManager.get_config_from_json(config_file) +config["model_path"] = model_path + +## init EngineHelper class +engine_helper = EngineHelper(config) +engine_helper.verbose = True +engine_helper.init_tokenizer(model_path) + +## init engine +engine_helper.init_engine() + +## prepare inputs and generation configs +user_input = "浙江的省会在哪" +prompt = "<|im_start|>" + "system\n" + "You are a helpful assistant." + "<|im_end|>\n" + \ + "<|im_start|>" + "user\n" + user_input + "<|im_end|>\n" + \ + "<|im_start|>" + "assistant\n" +gen_cfg = copy.deepcopy(engine_helper.default_gen_cfg) +gen_cfg["seed"] = random.randint(0, 10000) +request_list = engine_helper.create_request([prompt], [gen_cfg]) + +## inference +engine_helper.process_one_request(request_list[0]) +engine_helper.print_inference_result_all(request_list) + +engine_helper.uninit_engine() diff --git a/examples/python/0_basic/basic_example_qwen_v20.py b/examples/python/0_basic/basic_example_qwen_v20.py new file mode 100644 index 00000000..a2d2c0b0 --- /dev/null +++ b/examples/python/0_basic/basic_example_qwen_v20.py @@ -0,0 +1,172 @@ +# +# Copyright (c) Alibaba, Inc. and its affiliates. +# @file basic_example_qwen_v20.py +# +import os +import copy +import time +import random +import argparse +import subprocess +from jinja2 import Template +from concurrent.futures import ThreadPoolExecutor + +from dashinfer.helper import EngineHelper, ConfigManager + + +def check_transformers_version(): + import transformers + required_version = "4.37.0" + current_version = transformers.__version__ + + if current_version < required_version: + raise Exception( + f"Transformers version {current_version} is lower than required version {required_version}. Please upgrade transformers to version {required_version}." + ) + exit() + + +def download_model(model_id, revision, source="modelscope"): + print(f"Downloading model {model_id} (revision: {revision}) from {source}") + if source == "modelscope": + from modelscope import snapshot_download + model_dir = snapshot_download(model_id, revision=revision) + elif source == "huggingface": + from huggingface_hub import snapshot_download + model_dir = snapshot_download(repo_id=model_id) + else: + raise ValueError("Unknown source") + + print(f"Save model to path {model_dir}") + + return model_dir + + +def create_test_prompt(default_gen_cfg=None): + input_list = [ + "浙江的省会在哪", + "Where is the capital of Zhejiang?", + "将“温故而知新”翻译成英文,并解释其含义", + ] + + start_text = "<|im_start|>" + end_text = "<|im_end|>" + system_msg = {"role": "system", "content": "You are a helpful assistant."} + user_msg = {"role": "user", "content": ""} + assistant_msg = {"role": "assistant", "content": ""} + + prompt_template = Template( + "{{start_text}}" + "{{system_role}}\n" + "{{system_content}}" + "{{end_text}}\n" + + "{{start_text}}" + "{{user_role}}\n" + "{{user_content}}" + "{{end_text}}\n" + + "{{start_text}}" + "{{assistant_role}}\n") + + gen_cfg_list = [] + prompt_list = [] + for i in range(len(input_list)): + user_msg["content"] = input_list[i] + prompt = prompt_template.render(start_text=start_text, end_text=end_text, + system_role=system_msg["role"], system_content=system_msg["content"], + user_role=user_msg["role"], user_content=user_msg["content"], + assistant_role=assistant_msg["role"]) + prompt_list.append(prompt) + if default_gen_cfg != None: + gen_cfg = copy.deepcopy(default_gen_cfg) + gen_cfg["seed"] = random.randint(0, 10000) + gen_cfg_list.append(gen_cfg) + + return prompt_list, gen_cfg_list + + +def process_request(request_list, engine_helper: EngineHelper): + + def done_callback(future): + request = future.argument + future.result() + engine_helper.print_inference_result(request) + + # create a threadpool + executor = ThreadPoolExecutor( + max_workers=engine_helper.engine_config["engine_max_batch"]) + + try: + # submit all tasks to the threadpool + futures = [] + for request in request_list: + future = executor.submit(engine_helper.process_one_request, request) + future.argument = request + future.add_done_callback(done_callback) + futures.append(future) + finally: + executor.shutdown(wait=True) + + return + + +if __name__ == '__main__': + check_transformers_version() + + parser = argparse.ArgumentParser() + parser.add_argument('--quantize', action='store_true') + args = parser.parse_args() + + config_file = "../model_config/config_qwen_v20_1_5b.json" + config = ConfigManager.get_config_from_json(config_file) + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize + + cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" + package_location = subprocess.run(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, + text=True) + package_location = package_location.stdout.strip() + os.environ["AS_DAEMON_PATH"] = package_location + "/dashinfer/allspark/bin" + os.environ["AS_NUMA_NUM"] = str(len(config["device_ids"])) + os.environ["AS_NUMA_OFFSET"] = str(config["device_ids"][0]) + + ## download original model + ## download model from huggingface + # original_model = { + # "source": "huggingface", + # "model_id": "Qwen/Qwen2-1.5B", + # "revision": "", + # "model_path": "" + # } + + ## download model from modelscope + original_model = { + "source": "modelscope", + "model_id": "qwen/Qwen2-1.5B", + "revision": "master", + "model_path": "" + } + original_model["model_path"] = download_model(original_model["model_id"], + original_model["revision"], + original_model["source"]) + + ## init EngineHelper class + engine_helper = EngineHelper(config) + engine_helper.verbose = True + engine_helper.init_tokenizer(original_model["model_path"]) + + ## convert huggingface model to dashinfer model + ## only one conversion is required + engine_helper.convert_model(original_model["model_path"]) + + ## inference + engine_helper.init_engine() + + prompt_list, gen_cfg_list = create_test_prompt( + engine_helper.default_gen_cfg) + request_list = engine_helper.create_request(prompt_list, gen_cfg_list) + + global_start = time.time() + process_request(request_list, engine_helper) + global_end = time.time() + + total_timecost = global_end - global_start + # engine_helper.print_inference_result_all(request_list) + engine_helper.print_profiling_data(request_list, total_timecost) + print(f"total timecost: {total_timecost} s") + + engine_helper.uninit_engine() diff --git a/examples/python/1_performance/performance_test_llama2.py b/examples/python/1_performance/performance_test_llama2.py index 3ebbe928..81f55944 100644 --- a/examples/python/1_performance/performance_test_llama2.py +++ b/examples/python/1_performance/performance_test_llama2.py @@ -8,10 +8,10 @@ import time import queue import random +import argparse import subprocess import numpy as np from concurrent.futures import ThreadPoolExecutor -import argparse from dashinfer.helper import EngineHelper, ConfigManager @@ -76,6 +76,7 @@ def done_callback(future): parser.add_argument('--config_file', type=str, default='config_llama2_7b.json') parser.add_argument('--device_ids', nargs='+', type=int, default=[0]) parser.add_argument('--multinode_mode', action='store_true') + parser.add_argument('--quantize', action='store_true') args = parser.parse_args() @@ -86,6 +87,7 @@ def done_callback(future): config["generation_config"]["stop_words_ids"] = [] config["device_ids"] = args.device_ids config["multinode_mode"] = args.multinode_mode + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" package_location = subprocess.run(cmd, diff --git a/examples/python/1_performance/performance_test_qwen_v15.py b/examples/python/1_performance/performance_test_qwen_v15.py index 88e72dc5..9bdc222d 100644 --- a/examples/python/1_performance/performance_test_qwen_v15.py +++ b/examples/python/1_performance/performance_test_qwen_v15.py @@ -8,10 +8,10 @@ import time import queue import random +import argparse import subprocess import numpy as np from concurrent.futures import ThreadPoolExecutor -import argparse from dashinfer.helper import EngineHelper, ConfigManager @@ -76,6 +76,7 @@ def done_callback(future): parser.add_argument('--config_file', type=str, default='config_qwen_v15_4b.json') parser.add_argument('--device_ids', nargs='+', type=int, default=[0]) parser.add_argument('--multinode_mode', action='store_true') + parser.add_argument('--quantize', action='store_true') args = parser.parse_args() @@ -86,6 +87,7 @@ def done_callback(future): config["generation_config"]["stop_words_ids"] = [] config["device_ids"] = args.device_ids config["multinode_mode"] = args.multinode_mode + config["convert_config"]["do_dynamic_quantize_convert"] = args.quantize cmd = f"pip show dashinfer | grep 'Location' | cut -d ' ' -f 2" package_location = subprocess.run(cmd, diff --git a/examples/python/2_evaluation/evaluate_chat_ceval.py b/examples/python/2_evaluation/evaluate_chat_ceval.py index f82bd41a..a9edf571 100644 --- a/examples/python/2_evaluation/evaluate_chat_ceval.py +++ b/examples/python/2_evaluation/evaluate_chat_ceval.py @@ -445,6 +445,7 @@ def prepare(args): os.environ["AS_NUMA_NUM"] = str(len(config["device_ids"])) os.environ["AS_NUMA_OFFSET"] = str(config["device_ids"][0]) config["model_path"] = args.model_path + config["convert_config"]["do_dynamic_quantize_convert"] = True ## download model from modelscope original_model = { @@ -476,7 +477,7 @@ def prepare(args): if __name__ == "__main__": parser = argparse.ArgumentParser(description="Test HF checkpoint.") parser.add_argument('--model_path', type=str, default='~/dashinfer_models/') - parser.add_argument('--config_file', type=str, default='../model_config/config_qwen_v10_7b_quantize.json') + parser.add_argument('--config_file', type=str, default='../model_config/config_qwen_v10_7b.json') # Provide extra arguments required for tasks group = parser.add_argument_group(title="Evaluation options") diff --git a/examples/python/2_evaluation/evaluate_chat_gsm8k.py b/examples/python/2_evaluation/evaluate_chat_gsm8k.py index d8c7c86d..b75d386b 100644 --- a/examples/python/2_evaluation/evaluate_chat_gsm8k.py +++ b/examples/python/2_evaluation/evaluate_chat_gsm8k.py @@ -114,6 +114,7 @@ def prepare(args): os.environ["AS_NUMA_NUM"] = str(len(config["device_ids"])) os.environ["AS_NUMA_OFFSET"] = str(config["device_ids"][0]) config["model_path"] = args.model_path + config["convert_config"]["do_dynamic_quantize_convert"] = True ## download model from modelscope original_model = { @@ -145,7 +146,7 @@ def prepare(args): if __name__ == "__main__": parser = argparse.ArgumentParser(description="Test HF checkpoint.") parser.add_argument('--model_path', type=str, default='~/dashinfer_models/') - parser.add_argument('--config_file', type=str, default='../model_config/config_qwen_v10_7b_quantize.json') + parser.add_argument('--config_file', type=str, default='../model_config/config_qwen_v10_7b.json') parser.add_argument("-f", "--sample-input-file", type=str, default=None) parser.add_argument( diff --git a/examples/python/2_evaluation/evaluate_chat_humaneval.py b/examples/python/2_evaluation/evaluate_chat_humaneval.py index 95b091e3..ad650d1f 100644 --- a/examples/python/2_evaluation/evaluate_chat_humaneval.py +++ b/examples/python/2_evaluation/evaluate_chat_humaneval.py @@ -94,6 +94,7 @@ def prepare(args): os.environ["AS_NUMA_NUM"] = str(len(config["device_ids"])) os.environ["AS_NUMA_OFFSET"] = str(config["device_ids"][0]) config["model_path"] = args.model_path + config["convert_config"]["do_dynamic_quantize_convert"] = True ## download model from modelscope original_model = { @@ -125,7 +126,7 @@ def prepare(args): if __name__ == "__main__": parser = argparse.ArgumentParser(description="Test HF checkpoint.") parser.add_argument('--model_path', type=str, default='~/dashinfer_models/') - parser.add_argument('--config_file', type=str, default='../model_config/config_qwen_v10_7b_quantize.json') + parser.add_argument('--config_file', type=str, default='../model_config/config_qwen_v10_7b.json') parser.add_argument( "-f", diff --git a/examples/python/2_evaluation/evaluate_chat_mmlu.py b/examples/python/2_evaluation/evaluate_chat_mmlu.py index 44498408..52329387 100644 --- a/examples/python/2_evaluation/evaluate_chat_mmlu.py +++ b/examples/python/2_evaluation/evaluate_chat_mmlu.py @@ -298,6 +298,7 @@ def prepare(args): os.environ["AS_NUMA_NUM"] = str(len(config["device_ids"])) os.environ["AS_NUMA_OFFSET"] = str(config["device_ids"][0]) config["model_path"] = args.model_path + config["convert_config"]["do_dynamic_quantize_convert"] = True ## download model from modelscope original_model = { @@ -329,7 +330,7 @@ def prepare(args): if __name__ == "__main__": parser = argparse.ArgumentParser(description="Test HF checkpoint.") parser.add_argument('--model_path', type=str, default='~/dashinfer_models/') - parser.add_argument('--config_file', type=str, default='../model_config/config_qwen_v10_7b_quantize.json') + parser.add_argument('--config_file', type=str, default='../model_config/config_qwen_v10_7b.json') # Provide extra arguments required for tasks group = parser.add_argument_group(title="Evaluation options") diff --git a/examples/python/model_config/config_chatglm2_6b.json b/examples/python/model_config/config_chatglm2_6b.json index 8d267d78..9f3b9b61 100644 --- a/examples/python/model_config/config_chatglm2_6b.json +++ b/examples/python/model_config/config_chatglm2_6b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -31,5 +28,13 @@ "eos_token_id": 2, "seed": 1234 }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 512 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_chatglm2_6b_32k.json b/examples/python/model_config/config_chatglm2_6b_32k.json index 511f9afe..166730ff 100644 --- a/examples/python/model_config/config_chatglm2_6b_32k.json +++ b/examples/python/model_config/config_chatglm2_6b_32k.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 11000, "engine_max_batch": 8, @@ -31,5 +28,13 @@ "eos_token_id": 2, "seed": 1234 }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 512 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_chatglm2_6b_32k_quantize.json b/examples/python/model_config/config_chatglm2_6b_32k_quantize.json deleted file mode 100644 index 6753730e..00000000 --- a/examples/python/model_config/config_chatglm2_6b_32k_quantize.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "model_name": "chatglm2-6b-32k", - "model_type": "ChatGLM_v2", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 11000, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "temperature": 0.8, - "early_stopping": true, - "top_k": 1024, - "top_p": 0.8, - "repetition_penalty": 1.0, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 11000, - "no_repeat_ngram_size": 0, - "eos_token_id": 2, - "seed": 1234 - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 512 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_chatglm2_6b_quantize.json b/examples/python/model_config/config_chatglm2_6b_quantize.json deleted file mode 100644 index cb448420..00000000 --- a/examples/python/model_config/config_chatglm2_6b_quantize.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "model_name": "chatglm2-6b", - "model_type": "ChatGLM_v2", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 2048, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "temperature": 0.8, - "early_stopping": true, - "top_k": 1024, - "top_p": 0.8, - "repetition_penalty": 1.0, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 2048, - "no_repeat_ngram_size": 0, - "eos_token_id": 2, - "seed": 1234 - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 512 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_chatglm3_6b.json b/examples/python/model_config/config_chatglm3_6b.json index 8af7c8fd..a33e4990 100644 --- a/examples/python/model_config/config_chatglm3_6b.json +++ b/examples/python/model_config/config_chatglm3_6b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -31,5 +28,13 @@ "eos_token_id": 2, "seed": 1234 }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 512 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_chatglm3_6b_32k.json b/examples/python/model_config/config_chatglm3_6b_32k.json index 94fbbfc5..5a64b6ba 100644 --- a/examples/python/model_config/config_chatglm3_6b_32k.json +++ b/examples/python/model_config/config_chatglm3_6b_32k.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 11000, "engine_max_batch": 8, @@ -31,5 +28,13 @@ "eos_token_id": 2, "seed": 1234 }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 512 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_chatglm3_6b_32k_quantize.json b/examples/python/model_config/config_chatglm3_6b_32k_quantize.json deleted file mode 100644 index 6173dbb7..00000000 --- a/examples/python/model_config/config_chatglm3_6b_32k_quantize.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "model_name": "chatglm3-6b-32k", - "model_type": "ChatGLM_v3", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 11000, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "temperature": 0.8, - "early_stopping": true, - "top_k": 1024, - "top_p": 0.8, - "repetition_penalty": 1.0, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 11000, - "no_repeat_ngram_size": 0, - "eos_token_id": 2, - "seed": 1234 - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 512 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_chatglm3_6b_quantize.json b/examples/python/model_config/config_chatglm3_6b_quantize.json deleted file mode 100644 index 279d5e8d..00000000 --- a/examples/python/model_config/config_chatglm3_6b_quantize.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "model_name": "chatglm3-6b", - "model_type": "ChatGLM_v3", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 2048, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "temperature": 0.8, - "early_stopping": true, - "top_k": 1024, - "top_p": 0.8, - "repetition_penalty": 1.0, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 2048, - "no_repeat_ngram_size": 0, - "eos_token_id": 2, - "seed": 1234 - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 512 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_llama2_7b.json b/examples/python/model_config/config_llama2_7b.json index b34cfadc..40c7fb4a 100644 --- a/examples/python/model_config/config_llama2_7b.json +++ b/examples/python/model_config/config_llama2_7b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -31,5 +28,13 @@ "eos_token_id": 2, "seed": 1234 }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 512 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_llama2_7b_quantize.json b/examples/python/model_config/config_llama2_7b_quantize.json deleted file mode 100644 index 8f7b7a33..00000000 --- a/examples/python/model_config/config_llama2_7b_quantize.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "model_name": "Llama-2-7b-chat-ms", - "model_type": "LLaMA_v2", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 2048, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "temperature": 0.6, - "early_stopping": true, - "top_k": 1024, - "top_p": 0.9, - "repetition_penalty": 1.0, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 2048, - "no_repeat_ngram_size": 0, - "eos_token_id": 2, - "seed": 1234 - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 512 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v10_14b.json b/examples/python/model_config/config_qwen_v10_14b.json index 46a5b350..9f1798ac 100644 --- a/examples/python/model_config/config_qwen_v10_14b.json +++ b/examples/python/model_config/config_qwen_v10_14b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,5 +39,13 @@ ] ] }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 64 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v10_1_8b.json b/examples/python/model_config/config_qwen_v10_1_8b.json index 07753814..c72a70e9 100644 --- a/examples/python/model_config/config_qwen_v10_1_8b.json +++ b/examples/python/model_config/config_qwen_v10_1_8b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,5 +39,13 @@ ] ] }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 64 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v10_1_8b_quantize.json b/examples/python/model_config/config_qwen_v10_1_8b_quantize.json deleted file mode 100644 index 48be1dae..00000000 --- a/examples/python/model_config/config_qwen_v10_1_8b_quantize.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "model_name": "Qwen-1_8B-Chat", - "model_type": "Qwen_v10", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 2048, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "temperature": 1.0, - "early_stopping": true, - "top_k": 1024, - "top_p": 0.8, - "repetition_penalty": 1.1, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 2048, - "no_repeat_ngram_size": 0, - "eos_token_id": 151643, - "seed": 1234, - "stop_words_ids": [ - [ - 151643 - ], - [ - 151644 - ], - [ - 151645 - ] - ] - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 64 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v10_7b.json b/examples/python/model_config/config_qwen_v10_7b.json index 9c50db40..fe8383b2 100644 --- a/examples/python/model_config/config_qwen_v10_7b.json +++ b/examples/python/model_config/config_qwen_v10_7b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,5 +39,13 @@ ] ] }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 128 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_0_5b.json b/examples/python/model_config/config_qwen_v15_0_5b.json index 01d3f3b6..02a14ab5 100644 --- a/examples/python/model_config/config_qwen_v15_0_5b.json +++ b/examples/python/model_config/config_qwen_v15_0_5b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,5 +39,13 @@ ] ] }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 512 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_14b.json b/examples/python/model_config/config_qwen_v15_14b.json index fad80f48..27dd079d 100644 --- a/examples/python/model_config/config_qwen_v15_14b.json +++ b/examples/python/model_config/config_qwen_v15_14b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,5 +39,13 @@ ] ] }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 256 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_14b_quantize.json b/examples/python/model_config/config_qwen_v15_14b_quantize.json deleted file mode 100644 index 4edd5583..00000000 --- a/examples/python/model_config/config_qwen_v15_14b_quantize.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "model_name": "Qwen1.5-14B-Chat", - "model_type": "Qwen_v15", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 2048, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "temperature": 0.7, - "early_stopping": true, - "top_k": 20, - "top_p": 0.8, - "repetition_penalty": 1.05, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 2048, - "no_repeat_ngram_size": 0, - "eos_token_id": 151643, - "seed": 1234, - "stop_words_ids": [ - [ - 151643 - ], - [ - 151644 - ], - [ - 151645 - ] - ] - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 256 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_1_8b.json b/examples/python/model_config/config_qwen_v15_1_8b.json index 82910dd8..a72dd0fb 100644 --- a/examples/python/model_config/config_qwen_v15_1_8b.json +++ b/examples/python/model_config/config_qwen_v15_1_8b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,5 +39,13 @@ ] ] }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 256 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_1_8b_quantize.json b/examples/python/model_config/config_qwen_v15_1_8b_quantize.json deleted file mode 100644 index b56bcb9e..00000000 --- a/examples/python/model_config/config_qwen_v15_1_8b_quantize.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "model_name": "Qwen1.5-1.8B-Chat", - "model_type": "Qwen_v15", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 2048, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "num_return_sequences": 1, - "temperature": 1.0, - "early_stopping": true, - "top_k": 1024, - "top_p": 0.8, - "repetition_penalty": 1.1, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 2048, - "no_repeat_ngram_size": 0, - "eos_token_id": 151643, - "seed": 1234, - "stop_words_ids": [ - [ - 151643 - ], - [ - 151644 - ], - [ - 151645 - ] - ] - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 256 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_4b.json b/examples/python/model_config/config_qwen_v15_4b.json index d6ef01a5..4a24ad10 100644 --- a/examples/python/model_config/config_qwen_v15_4b.json +++ b/examples/python/model_config/config_qwen_v15_4b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,5 +39,13 @@ ] ] }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 128 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_4b_quantize.json b/examples/python/model_config/config_qwen_v15_4b_quantize.json deleted file mode 100644 index a28580c0..00000000 --- a/examples/python/model_config/config_qwen_v15_4b_quantize.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "model_name": "Qwen1.5-4B-Chat", - "model_type": "Qwen_v15", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 2048, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "temperature": 1.0, - "early_stopping": true, - "top_k": 1024, - "top_p": 0.8, - "repetition_penalty": 1.1, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 2048, - "no_repeat_ngram_size": 0, - "eos_token_id": 151643, - "seed": 1234, - "stop_words_ids": [ - [ - 151643 - ], - [ - 151644 - ], - [ - 151645 - ] - ] - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 128 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_7b.json b/examples/python/model_config/config_qwen_v15_7b.json index 1ea3cf52..e8dee605 100644 --- a/examples/python/model_config/config_qwen_v15_7b.json +++ b/examples/python/model_config/config_qwen_v15_7b.json @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": false - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,5 +39,13 @@ ] ] }, - "quantization_config": null + "convert_config": { + "do_dynamic_quantize_convert": false + }, + "quantization_config": { + "activation_type": "bfloat16", + "weight_type": "uint8", + "SubChannel": true, + "GroupSize": 512 + } } \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_7b_quantize.json b/examples/python/model_config/config_qwen_v15_7b_quantize.json deleted file mode 100644 index c6f30603..00000000 --- a/examples/python/model_config/config_qwen_v15_7b_quantize.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "model_name": "Qwen1.5-7B-Chat", - "model_type": "Qwen_v15", - "model_path": "~/dashinfer_models/", - "data_type": "float32", - "device_type": "CPU", - "device_ids": [ - 0 - ], - "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, - "engine_config": { - "engine_max_length": 2048, - "engine_max_batch": 8, - "do_profiling": false, - "num_threads": 0, - "matmul_precision": "medium" - }, - "generation_config": { - "temperature": 0.7, - "early_stopping": true, - "top_k": 20, - "top_p": 0.8, - "repetition_penalty": 1.05, - "presence_penalty": 0.0, - "min_length": 0, - "max_length": 2048, - "no_repeat_ngram_size": 0, - "eos_token_id": 151643, - "seed": 1234, - "stop_words_ids": [ - [ - 151643 - ], - [ - 151644 - ], - [ - 151645 - ] - ] - }, - "quantization_config": { - "activation_type": "bfloat16", - "weight_type": "uint8", - "SubChannel": true, - "GroupSize": 512 - } -} \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v15_0_5b_quantize.json b/examples/python/model_config/config_qwen_v20_0_5b.json similarity index 90% rename from examples/python/model_config/config_qwen_v15_0_5b_quantize.json rename to examples/python/model_config/config_qwen_v20_0_5b.json index cb3c19b4..6ab5cf5c 100644 --- a/examples/python/model_config/config_qwen_v15_0_5b_quantize.json +++ b/examples/python/model_config/config_qwen_v20_0_5b.json @@ -1,6 +1,6 @@ { - "model_name": "Qwen1.5-0.5B-Chat", - "model_type": "Qwen_v15", + "model_name": "Qwen2-0.5B", + "model_type": "Qwen_v20", "model_path": "~/dashinfer_models/", "data_type": "float32", "device_type": "CPU", @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,6 +39,9 @@ ] ] }, + "convert_config": { + "do_dynamic_quantize_convert": false + }, "quantization_config": { "activation_type": "bfloat16", "weight_type": "uint8", diff --git a/examples/python/model_config/config_qwen_v10_7b_quantize.json b/examples/python/model_config/config_qwen_v20_1_5b.json similarity index 88% rename from examples/python/model_config/config_qwen_v10_7b_quantize.json rename to examples/python/model_config/config_qwen_v20_1_5b.json index 1b7822cd..b282b330 100644 --- a/examples/python/model_config/config_qwen_v10_7b_quantize.json +++ b/examples/python/model_config/config_qwen_v20_1_5b.json @@ -1,6 +1,6 @@ { - "model_name": "Qwen-7B-Chat", - "model_type": "Qwen_v10", + "model_name": "Qwen2-1.5B", + "model_type": "Qwen_v20", "model_path": "~/dashinfer_models/", "data_type": "float32", "device_type": "CPU", @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,10 +39,13 @@ ] ] }, + "convert_config": { + "do_dynamic_quantize_convert": false + }, "quantization_config": { "activation_type": "bfloat16", "weight_type": "uint8", "SubChannel": true, - "GroupSize": 128 + "GroupSize": 512 } } \ No newline at end of file diff --git a/examples/python/model_config/config_qwen_v10_14b_quantize.json b/examples/python/model_config/config_qwen_v20_7b.json similarity index 88% rename from examples/python/model_config/config_qwen_v10_14b_quantize.json rename to examples/python/model_config/config_qwen_v20_7b.json index 4a6e1ac0..e734b735 100644 --- a/examples/python/model_config/config_qwen_v10_14b_quantize.json +++ b/examples/python/model_config/config_qwen_v20_7b.json @@ -1,6 +1,6 @@ { - "model_name": "Qwen-14B-Chat", - "model_type": "Qwen_v10", + "model_name": "Qwen2-7B", + "model_type": "Qwen_v20", "model_path": "~/dashinfer_models/", "data_type": "float32", "device_type": "CPU", @@ -8,9 +8,6 @@ 0 ], "multinode_mode": false, - "convert_config": { - "do_dynamic_quantize_convert": true - }, "engine_config": { "engine_max_length": 2048, "engine_max_batch": 8, @@ -42,10 +39,13 @@ ] ] }, + "convert_config": { + "do_dynamic_quantize_convert": false + }, "quantization_config": { "activation_type": "bfloat16", "weight_type": "uint8", "SubChannel": true, - "GroupSize": 64 + "GroupSize": 512 } } \ No newline at end of file diff --git a/python/allspark_binding.cpp b/python/allspark_binding.cpp index c5cafdf4..8e1b1884 100644 --- a/python/allspark_binding.cpp +++ b/python/allspark_binding.cpp @@ -186,9 +186,11 @@ PYBIND11_MODULE(_allspark, m) { .def(py::init<>( [](std::string model_name) { return new AsEngineStat(model_name); })) .def("ToString", [](AsEngineStat* self) { return self->ToString(); }) + .def("dict", [](AsEngineStat* self) { return self->ToMap(); }) // required field: model_name / model_path / weights_path .def_readwrite("model_name", &AsEngineStat::model_name) .def_readwrite("free_token", &AsEngineStat::free_token) + .def_readwrite("total_token", &AsEngineStat::total_token) .def_readwrite("pendding_request", &AsEngineStat::pendding_request) .def_readwrite("running_request", &AsEngineStat::running_request) .def_readwrite("total_generated_token", @@ -204,12 +206,24 @@ PYBIND11_MODULE(_allspark, m) { &AsEngineStat::used_device_memory_pool_size); py::class_>( - m, "GeneratedElements") + m, "GeneratedElements", py::module_local(), + "Generated Token class, contains token(s) and related information, it " + "may contains multiple tokens between last get.") .def(py::init<>()) // 默认构造函数 - .def_readwrite("ids_from_generate", &GeneratedElements::ids_from_generate) - .def_readwrite("log_probs_list", &GeneratedElements::log_probs_list) + .def_readwrite("ids_from_generate", &GeneratedElements::ids_from_generate, + "Token(s) from this generation") + .def_readwrite( + "log_probs_list", &GeneratedElements::log_probs_list, + "A probability list for each token, including the top_logprobs " + "tokens and their probabilities when generated.\n" + "Dimension: [num_token][top_logprobs], where each token has a " + "pair [token_id, prob].") + .def_readwrite("token_logprobs_list", + &GeneratedElements::token_logprobs_list, + "Stores the probability value for each selected token.") .def_readwrite("tensors_from_model_inference", - &GeneratedElements::tensors_from_model_inference); + &GeneratedElements::tensors_from_model_inference, + "Tensor outputs from model inference."); // Allspark API // We should make sure interfaces are the same with AsClientEngine @@ -279,7 +293,10 @@ PYBIND11_MODULE(_allspark, m) { return emptyVec; } }, - py::return_value_policy::copy) + py::return_value_policy::copy, + "get output token non-block api, return None if no new token " + "available" + "[deprecated function] please use ResultQueue function.") .def( "_get_wait", [](AsEngine* self, const char* model_name, void* result_queue) { @@ -296,7 +313,10 @@ PYBIND11_MODULE(_allspark, m) { return emptyVec; } }, - py::return_value_policy::copy) + py::return_value_policy::copy, + "get output token block api, will block until new token or status " + "change" + ". [deprecated function] please use ResultQueue function.") .def("_get_request_status", [](AsEngine* self, const char* model_name, void* result_queue) { return ((AsEngine::ResultQueue_t)result_queue)->GenerateStatus(); @@ -524,29 +544,46 @@ PYBIND11_MODULE(_allspark, m) { util::set_global_header(weights_path); }); - py::class_>(m, "ResultQueue") + py::class_>( + m, "ResultQueue", py::module_local(), + "The ResultQueue class is designed to generate status and retrieve " + "results") .def(py::init<>()) // Assuming there's a default constructor - .def("GenerateStatus", &ResultQueue::GenerateStatus) - .def("GeneratedLength", &ResultQueue::GeneratedLength) - .def("Get", - [](ResultQueue* self) -> py::object { - py::gil_scoped_release release; - auto ele = self->Get(); - py::gil_scoped_acquire acquire; - if (ele == nullptr) { - return py::none(); - } else { - return py::cast(ele); - } - }) - .def("GetNoWait", [](ResultQueue* self) -> py::object { - auto ele = self->GetNoWait(); - if (ele == nullptr) { - return py::none(); - } else { - return py::cast(ele); - } - }); + + .def("GenerateStatus", &ResultQueue::GenerateStatus, + "Get generation status, this api will not block.") + + .def("GeneratedLength", &ResultQueue::GeneratedLength, + "Get current generated length, it's accumulated generate token " + "number") + + .def( + "Get", + [](ResultQueue* self) -> py::object { + py::gil_scoped_release release; + auto ele = self->Get(); + py::gil_scoped_acquire acquire; + if (ele == nullptr) { + return py::none(); + } else { + return py::cast(ele); + } + }, + "Fetches new tokens(s) from the queue, will be block until new token " + "generated.") + + .def( + "GetNoWait", + [](ResultQueue* self) -> py::object { + auto ele = self->GetNoWait(); + if (ele == nullptr) { + return py::none(); + } else { + return py::cast(ele); + } + }, + "Fetches new token(s) from the queue, will return None if no new " + "tokens, non block api."); } #undef CHECK_CONFIG diff --git a/python/dashinfer/allspark/engine.py b/python/dashinfer/allspark/engine.py index a80d7b07..a8189c6f 100644 --- a/python/dashinfer/allspark/engine.py +++ b/python/dashinfer/allspark/engine.py @@ -22,6 +22,7 @@ def __init__(self): "ChatGLM_v3": ChatGLM_v3, "Qwen_v10": Qwen_v10, "Qwen_v15": Qwen_v15, + "Qwen_v20": Qwen_v20, } self.version = "" @@ -65,12 +66,12 @@ def serialize_model_from_torch(self, if not path.isdir(save_dir): makedirs(save_dir) assert model_name, 'model_name should not be empty!' - model_path = path.join(save_dir, model_name + ".asgraph") - weights_path = path.join(save_dir, model_name + ".asparam") + model_path = path.join(save_dir, model_name + ".dimodel") + weights_path = path.join(save_dir, model_name + ".ditensors") start_time = time.time() - print("save asgraph to ", model_path) - print("save asparam to ", weights_path) + print("save dimodel to ", model_path) + print("save ditensors to ", weights_path) # 清空原本的权重文件 with open(weights_path, "w") as f: f.truncate(0) @@ -128,7 +129,7 @@ def dump_build_meta_to_proto(self, model_proto, weights_path, hash_length = len(weight_file_content) hash.hash_length.extend([hash_length]) hash_md5 = hashlib.md5(weight_file_content).hexdigest() - print("calculate md5 of asgraph = ", hash_md5) + print("calculate md5 of dimodel = ", hash_md5) hash.hash.extend([hash_md5]) # config dict def valid_torch_kvpair(key, value) -> bool: diff --git a/python/dashinfer/allspark/model/__init__.py b/python/dashinfer/allspark/model/__init__.py index efc58be3..bef28fba 100644 --- a/python/dashinfer/allspark/model/__init__.py +++ b/python/dashinfer/allspark/model/__init__.py @@ -7,6 +7,7 @@ from .chatglm_v3 import * from .qwen_v10 import * from .qwen_v15 import * +from .qwen_v20 import * __all__ = [ "LLaMA_v2", @@ -14,4 +15,5 @@ "ChatGLM_v3", "Qwen_v10", "Qwen_v15", + "Qwen_v20", ] diff --git a/python/dashinfer/allspark/model/qwen_v15.py b/python/dashinfer/allspark/model/qwen_v15.py index a538290e..c5880bd9 100644 --- a/python/dashinfer/allspark/model/qwen_v15.py +++ b/python/dashinfer/allspark/model/qwen_v15.py @@ -34,6 +34,8 @@ def _build_graph(self, torch_cfg, derive_type): cfg.ln_eps = torch_cfg.get('rms_norm_eps', 1e-5) cfg.num_heads = torch_cfg.get('num_attention_heads', 12) cfg.multi_query_group_num = torch_cfg.get('num_key_value_heads', 0) + if (cfg.multi_query_group_num == 0): + cfg.multi_query_group_num = cfg.num_heads cfg.dec_layer = torch_cfg.get('num_hidden_layers', 12) hidden_size_ = torch_cfg.get('hidden_size', 4096) cfg.kv_channels = int(hidden_size_ / cfg.num_heads) @@ -113,7 +115,7 @@ def _build_graph(self, torch_cfg, derive_type): self.split_map["embedding.word_embeddings"] = VSPLIT for i in range(cfg.dec_layer): prefix = "decoder.layer.{}.".format(i) - if cfg.multi_query_group_num == 0 or cfg.multi_query_group_num == cfg.num_heads: + if cfg.multi_query_group_num == cfg.num_heads: self.split_map[prefix + "attention.self.weight"] = QKVSPLIT self.split_map[prefix + "attention.self.bias"] = QKVSPLIT else: @@ -203,16 +205,32 @@ def _build_graph(self, torch_cfg, derive_type): if self.use_logn_attn and hasattr(self, "model_sequence_length"): rotary_attributes["logn_model_embedding"] = int( self.model_sequence_length) + if cfg.multi_query_group_num != cfg.num_heads: + rotary_attributes["multi_query_group_num"] = int( + cfg.multi_query_group_num) rotary_embedding = Rotary( prefix + "rotary", [attn_self_gemm.outputs[0], mask.outputs[1]], rotary_attributes, )() - attn = MultiHeadAttention( - prefix + "attention", - [rotary_embedding.outputs[0], mask.outputs[0]], - {"num_heads": cfg.num_heads}, - )() + if cfg.multi_query_group_num == cfg.num_heads: + attn = MultiHeadAttention( + prefix + "attention", + [rotary_embedding.outputs[0], mask.outputs[0]], + {"num_heads": cfg.num_heads}, + )() + else: + attn = MultiQueryAttention( + prefix + "attention", + [rotary_embedding.outputs[0], mask.outputs[0]], + { + "num_heads": cfg.num_heads, + "size_per_head": cfg.size_per_head, + "multi_query_group_num": cfg.multi_query_group_num, + "multinode": 1, + "hidden_size": hidden_size_ + }, + )() attn_op_list = [] ffn_op_list = [] ffn_ln = None @@ -360,6 +378,8 @@ def _build_graph(self, torch_cfg, derive_type): op.inputs[0].CopyFrom(preprocess_ids.outputs[0]) elif op.op_type == "MultiHeadAttention": op.op_type = "DecOptMHA" + elif op.op_type == "MultiQueryAttention": + op.op_type = "DecOptMQA" gen_op = GenerateOp( "generate", [graph.ops[-1].outputs[0], preprocess_ids.outputs[1]], @@ -388,6 +408,7 @@ def _trans_weight(self, torch_weight): k for k, v in Model.dtype_dict.items() if v == self.dtype ][0] for key, torch_name in weight_name_map.items(): + # print("trans_tensor: {}, {}".format(key, torch_name)) if isinstance(torch_name, list): # attention qkv weights tensor = (torch.concat( [torch_weight[name] for name in torch_name]).cpu()) @@ -403,11 +424,11 @@ def _trans_weight(self, torch_weight): else: group_list = [ self.model.model_conf.num_heads * - self.model.model_conf.kv_channels, + self.model.model_conf.size_per_head, self.model.model_conf.multi_query_group_num * - self.model.model_conf.kv_channels, + self.model.model_conf.size_per_head, self.model.model_conf.multi_query_group_num * - self.model.model_conf.kv_channels + self.model.model_conf.size_per_head ] quantize_mode = False if key not in quantize_map else quantize_map[ key] diff --git a/python/dashinfer/allspark/model/qwen_v20.py b/python/dashinfer/allspark/model/qwen_v20.py new file mode 100644 index 00000000..688876e3 --- /dev/null +++ b/python/dashinfer/allspark/model/qwen_v20.py @@ -0,0 +1,26 @@ +# +# Copyright (c) Alibaba, Inc. and its affiliates. +# @file qwen_v20.py +# +from .qwen_v15 import * + + +class Qwen_v20(Qwen_v15): + + def __init__(self, torch_model, data_type, derive_type, **kwargs): + super(Qwen_v15, self).__init__("Qwen_v20", data_type, **kwargs) + self.model.inputs.append( + make_tensor("input_ids", np.empty(shape=(0, 0), dtype=np.int64))) + self.model.inputs.append( + make_tensor("attention_mask", np.empty(shape=(0, 0), + dtype=np.int64))) + self.model.outputs.append(make_tensor("last_hidden_state")) + self.is_generate = kwargs.get('is_generate', True) + self.weight_real_names = set() + for v in torch_model: + self.weight_real_names.add(v) + self._build_graph(self.model_config, derive_type) + start_time = time.time() + self._trans_weight(torch_model) + print("parse weight time: ", time.time() - start_time) + diff --git a/python/dashinfer/helper/helper.py b/python/dashinfer/helper/helper.py index 6c0ccda0..3fae1f66 100644 --- a/python/dashinfer/helper/helper.py +++ b/python/dashinfer/helper/helper.py @@ -231,12 +231,12 @@ def _uninit_torch_model(self): def check_model_exist(self): model_path = os.path.join(self.model_path, - self.model_name + ".asgraph") + self.model_name + ".dimodel") if not os.path.exists(model_path): print(f"\nNo such file or directory: {model_path}\n") return False model_path = os.path.join(self.model_path, - self.model_name + ".asparam") + self.model_name + ".ditensors") if not os.path.exists(model_path): print(f"\nNo such file or directory: {model_path}\n") return False @@ -279,9 +279,9 @@ def get_physical_cores_per_numa_node(): as_model_config = allspark.AsModelConfig( model_name=self.model_name, model_path=os.path.join(self.model_path, - self.model_name + ".asgraph"), + self.model_name + ".dimodel"), weights_path=os.path.join(self.model_path, - self.model_name + ".asparam"), + self.model_name + ".ditensors"), engine_max_length=self.engine_config["engine_max_length"], engine_max_batch=self.engine_config["engine_max_batch"], ) @@ -620,7 +620,7 @@ def check_config(config): raise ValueError("config['{}']: key not exists or unsupported value".format(key)) key = "model_type" - model_types = ["LLaMA_v2", "ChatGLM_v2", "ChatGLM_v3", "Qwen_v10", "Qwen_v15"] + model_types = ["LLaMA_v2", "ChatGLM_v2", "ChatGLM_v3", "Qwen_v10", "Qwen_v15", "Qwen_v20"] if key in config and isinstance(config[key], str) and config[key] in model_types: pass else: diff --git a/scripts/release/python_manylinux_test.sh b/scripts/release/python_manylinux_test.sh index 96483b68..8f7ee3cb 100755 --- a/scripts/release/python_manylinux_test.sh +++ b/scripts/release/python_manylinux_test.sh @@ -34,8 +34,9 @@ run_python_example() { # python basic_example_chatglm2.py # python basic_example_chatglm3.py # python basic_example_llama2.py - python basic_example_qwen_v15.py python basic_example_qwen_v10.py + python basic_example_qwen_v15.py + # python basic_example_qwen_v20.py cd ${root_path} cd ${root_path}/examples/python/1_performance diff --git a/scripts/release/python_pypi_test.sh b/scripts/release/python_pypi_test.sh index 1dc63a94..93e17f0f 100755 --- a/scripts/release/python_pypi_test.sh +++ b/scripts/release/python_pypi_test.sh @@ -27,8 +27,9 @@ run_python_example() { # python basic_example_chatglm2.py # python basic_example_chatglm3.py # python basic_example_llama2.py - python basic_example_qwen_v15.py python basic_example_qwen_v10.py + python basic_example_qwen_v15.py + # python basic_example_qwen_v20.py cd ${root_path} cd ${root_path}/examples/python/1_performance