diff --git a/adapt-310p.patch b/adapt-310p.patch index 55a9978cf4a326ef41540d30371329a87819a29e..bbd38f34c73269d113cbf2a0ab82840e52dfb1bb 100644 --- a/adapt-310p.patch +++ b/adapt-310p.patch @@ -268,7 +268,7 @@ index 25fc8ea..ed9b0ad 100644 - True) + + if is_310p(): -+ //memory_obj -> tmp_gpu_buffer -> kvcaches ++ # memory_obj -> tmp_gpu_buffer -> kvcaches + assert self.gpu_buffer.device == kvcaches[0][0].device + self.gpu_buffer.zero_() + tmp_gpu_buffer = self.gpu_buffer[:, :, : end - start, :] diff --git "a/docs/tutorials/Deepseek-R1&LMCache\351\203\250\347\275\262\346\214\207\345\215\227.md" "b/docs/tutorials/Deepseek-R1&LMCache\351\203\250\347\275\262\346\214\207\345\215\227.md" index a39a88886e99f5059357a6f4b9865d7f034ed333..39185aa27fd12fec6ed190c7e40964e45aa898eb 100644 --- "a/docs/tutorials/Deepseek-R1&LMCache\351\203\250\347\275\262\346\214\207\345\215\227.md" +++ "b/docs/tutorials/Deepseek-R1&LMCache\351\203\250\347\275\262\346\214\207\345\215\227.md" @@ -56,12 +56,17 @@ DeepSeek R1 671B W8A8模型需满足以下硬件要求: ### 3.1 镜像拉取 -使用以下命令拉取预构建镜像: +使用以下命令拉取预构建镜像(未安装LMCache,需根据后续教程手动安装): ``` docker pull hub.oepkgs.net/oedeploy/openeuler/aarch64/intelligence_boom:0.1.0-aarch64-800I-A2-mindspore2.7-openeuler24.03-lts-sp2 ``` +或使用以下命令拉取预构建镜像(已默认安装LMCache-0.3.1,无需手动安装): + +``` +docker pull hub.oepkgs.net/oedeploy/openeuler/aarch64/intelligence_boom:0.1.0-aarch64-800I-A2-mindspore2.7-lmcache0.3.1-openeuler24.03-lts-sp2-20250918 +``` ### 3.2 容器创建 创建并启动容器(根据实际路径调整挂载目录): diff --git "a/docs/tutorials/Qwen3-32B&LMCache(\351\200\202\351\205\215Atlas 300I Duo)\351\203\250\347\275\262\346\214\207\345\215\227.md" "b/docs/tutorials/Qwen3-32B&LMCache(\351\200\202\351\205\215Atlas 300I Duo)\351\203\250\347\275\262\346\214\207\345\215\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..8d95f66e5ab55d9e4710ba6e1feb6c2f6c08ed7b --- /dev/null +++ "b/docs/tutorials/Qwen3-32B&LMCache(\351\200\202\351\205\215Atlas 300I Duo)\351\203\250\347\275\262\346\214\207\345\215\227.md" @@ -0,0 +1,331 @@ +本文档以Qwen3-32B为例介绍Atlas 300I Duo服务器适配LMCache的部署流程。为确保执行配置(包括模型配置文件路径、Python环境等)一致,以通过 docker 镜像创建容器的方式避免执行差异。 + +## 1. 硬件配置 + +Qwen3-32B 模型需满足以下硬件要求: +- 设备需求:300Duo 服务器中双卡部署(四颗310P3核心) +- 显存:四卡部署时,每个NPU核心需要 16G 显存存储权重数据 +- 内存:设备需要分配内存以供卸载到主机侧的 kvcache 存储,可根据设备情况和实际需要调整并在 `lmcache_config.yaml` 文件中设置。 + +## 2.模型权重获取与准备 +通过 Hugging Face 获取 Qwen3-32B 模型权重: +- 下载地址:https://huggingface.co/Qwen/Qwen3-32B + +## 3. Docker +### 3.1 镜像拉取 + +使用以下命令拉取预构建镜像·: + +```bash +docker pull hub.oepkgs.net/oedeploy/openeuler/aarch64/intelligence_boom:0.1.0-aarch64-300I-Duo-mindspore2.7-openeuler24.03-lts-sp2 +``` +### 3.2 容器创建 + +创建并启动容器(根据实际路径调整挂载目录): + +```bash +docker run -itd \ + --shm-size 128g \ + --privileged \ + --net=host \ + --device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 \ + --device=/dev/davinci4 --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 \ + --device=/dev/davinci_manager \ + --device=/dev/devmm_svm \ + --device=/dev/hisi_hdc \ + -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ + -v /var/log/npu/:/var/log/npu \ + -v /usr/local/dcmi:/usr/local/dcmi \ + -v /etc/ascend_install.info:/etc/ascend_install.info \ + -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ + -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ + -v /lib/modules:/lib/modules:ro \ + -v /usr/src/kernels:/usr/src/kernels:ro \ + -v /home/ckpt/qwen3-32b:/home/ckpt/qwen3-32b \ # 挂载模型权重目录(按实际目录修改) + --name vllm-ms-container \ + --entrypoint /bin/bash \ + hub.oepkgs.net/oedeploy/openeuler/aarch64/intelligence_boom:0.1.0-aarch64-300I-Duo-openeuler24.03-lts-sp2 +``` +### 3.3容器启动 + +执行以下命令进入运行中的容器`vllm-ms-container`: + +```bash +docker exec -it -u root vllm-ms-container /bin/bash +``` + +## 4.LMCache安装 + +### 4.1 源码获取与准备 + +```bash +# 启动容器后进入工作目录 +cd /workspace + +# 克隆代码仓库 +git clone -b vllm-ms-dev https://gitee.com/src-openeuler/LMCache.git + +# 解压源码包 +cd LMCache +tar -xzf LMCache-0.3.1.post1.tar.gz + +# 清理冗余文件并进入源码目录 +# 不清除.git后面的patch无法应用 +rm -rf .git + +cd python-LMCache-0.3.1.post1 +# 在python-LMCache-0.3.1.post1目录下git init,后续也可以正常应用patch +git init +``` + +### 4.2 按序应用补丁 + +```bash +# 应用 mindspore 平台适配补丁(910B系列服务器直接按序应用下面两个补丁即可) +git apply /workspace/LMCache/fix-build-requirements-for-ascend.patch +git apply /workspace/LMCache/adapt-mindspore.patch + +#应用310P适配补丁(基于上面两个补丁应用此310P适配补丁) +git apply /workspace/LMCache/adapt-310P.patch +``` + +### 4.3 环境配置与安装 + +安装LMCache,生成动态库 + +```bash +export LMCACHE_TARGET_DEVICE="ASCEND" +export USE_TORCH=0 +pip install --no-build-isolation -v -e . +``` + +### 4.4 运行参数配置 + +创建并编辑 LMCache 配置文件: + +```bash +vim /workspace/LMCache/lmcache_config.yaml +``` + +配置内容如下(根据硬件调整): + +```bash +chunk_size: 256 +local_cpu: true +max_local_cpu_size: 60 # CPU 内存限制(单位:GB),根据实际需要调整 +``` + +### 4.5 环境变量和相关配置文件适配说明 + +#### 4.5.1 设置使能LMCache所需环境变量: + +```bash +export LMCACHE_TARGET_DEVICE="ASCEND" + +# 加载 Ascend 工具链环境 +source /usr/local/Ascend/ascend-toolkit/set_env.sh +#设置vllm日志级别 +export VLLM_LOGGING_LEVEL=INFO +#设置模型配置文件路径 +export MINDFORMERS_MODEL_CONFIG=/home/ckpt/Qwen3-32B/predict_qwen3.yaml + +#使能LMCache新增环境变量: +export LMCACHE_TARGET_DEVICE="ASCEND" +# 指定配置文件路径 +export LMCACHE_CONFIG_FILE="/workspace/LMCache/lmcache_config.yaml" +# 设置lmcache日志级别 +export LMCACHE_LOG_LEVEL=INFO +# 添加动态库路径 +export LD_LIBRARY_PATH=/workspace/LMCache/python-LMCache-0.3.1.post1/lmcache/:${LD_LIBRARY_PATH} + +# 计算框架配置 +export MS_ENABLE_LCCL=off +export HCCL_OP_EXPANSION_MODE=AIV +export MS_ALLOC_CONF=enable_vmm:True +export ASCEND_CUSTOM_PATH=$ASCEND_HOME_PATH/../ +export ASCEND_TOTAL_MEMORY_GB=42 #单卡显存上限 +#指定使用四张卡进行推理 根据实际调整 +export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 + +# 内核优化配置 +export EXPERIMENTAL_KERNEL_LAUNCH_GROUP="thread_num:4,kernel_group_num:16" export MS_INTERNAL_ENABLE_NZ_OPS="QuantBatchMatmul,MlaPreprocess,GroupedMatmulV4" export MS_DISABLE_INTERNAL_KERNELS_LIST="AddRmsNorm,Add,MatMul,Cast" +``` + +环境变量说明: +- `MS_ENABLE_LCCL`: 关闭LCCL,使能HCCL通信。 +- `HCCL_OP_EXPANSION_MODE`: 配置通信算法的编排展开位置为Device侧的AI Vector Core计算单元。 +- `MS_ALLOC_CONF`: 设置内存策略。可参考[MindSpore官网文档](https://gitee.com/link?target=https%3A%2F%2Fwww.mindspore.cn%2Fdocs%2Fzh-CN%2Fmaster%2Fapi_python%2Fenv_var_list.html)。 +- `ASCEND_RT_VISIBLE_DEVICES`: 配置每个节点可用device id。用户可使用`npu-smi info`命令进行查询。 +- `MINDFORMERS_MODEL_CONFIG`: 模型配置文件。用户可以在https://gitee.com/mindspore/mindformers/blob/r1.6.0/configs/qwen3/predict_qwen3.yaml# ,寻找并下载对应模型的yaml文件`predict_qwen3.yaml` 。 + +#### 4.5.2 配置文件修改说明 +下载的Qwen3-32B模型文件`/Qwen3-32B/config.json`需要针对310P进行修改。 +修改说明:由于310P不支持BF16数据类型,将数据类型更改为 float16,其余不用修改。 +完整配置如下: +```bash +{ + "architectures": [ + "Qwen3ForCausalLM" + ], + "attention_bias": false, + "attention_dropout": 0.0, + "bos_token_id": 151643, + "eos_token_id": 151645, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 5120, + "initializer_range": 0.02, + "intermediate_size": 25600, + "max_position_embeddings": 40960, + "max_window_layers": 64, + "model_type": "qwen3", + "num_attention_heads": 64, + "num_hidden_layers": 64, + "num_key_value_heads": 8, + "rms_norm_eps": 1e-06, + "rope_scaling": null, + "rope_theta": 1000000, + "sliding_window": null, + "tie_word_embeddings": false, + "torch_dtype": "float16", #修改为float16 + "transformers_version": "4.51.0", + "use_cache": true, + "use_sliding_window": false, + "vocab_size": 151936 +} +``` + +`predict_qwen3.yaml` 文件修改说明:由于310P不支持BF16数据类型,需要将对应的数据类型更改为 float16。其余修改均已做注释。 +完整配置如下: +```yaml +seed: 0 +output_dir: './output' # path to save checkpoint/strategy +load_checkpoint: '' +use_parallel: False +run_mode: 'predict' +use_legacy: False +load_ckpt_format: 'safetensors' + +trainer: + type: CausalLanguageModelingTrainer + model_name: 'qwen3' + +# default parallel of device num = 8 for Atlas 800T A2 +parallel_config: + data_parallel: 1 + model_parallel: 4 #4卡并行则修改为4 +# HuggingFace file directory +pretrained_model_dir: '/path/hf_dir' +model: + model_config: + compute_dtype: "float16" #修改为float16 + layernorm_compute_dtype: "float32" + softmax_compute_dtype: "float32" + rotary_dtype: "float16" #修改为float16 + params_dtype: "float16" #修改为float16 + +# mindspore context init config +context: + mode: 0 #0--Graph Mode; 1--Pynative Mode + enable_graph_kernel: False + ascend_config: + precision_mode: "must_keep_origin_dtype" + max_device_memory: "42GB" #修改为42G(根据实际情况调整) + save_graphs: False + save_graphs_path: "./graph" + +# parallel context config +parallel: + parallel_mode: "MANUAL_PARALLEL" + enable_alltoall: False +``` +## 5.在线推理服务启动 +### 5. 1 启动参数说明 + +vllm-mindspore可使用OpenAI的API协议部署在线推理。以下是在线推理的拉起流程: + +```bash +vllm-mindspore serve + --model=[模型Config/权重路径] + --port [启动服务端口] + --trust-remote-code # 使用本地下载的model文件 + --max-num-seqs [最大Batch数] + --max-model-len [输出输出最大长度] + --max-num-batched-tokens [单次迭代最大支持token数, 推荐4096] + --block-size [Block Size 大小, 推荐128] + --gpu-memory-utilization [显存利用率] + --tensor-parallel-size [TP 并行数] + --max-num-seqs 256 [最大并发数,根据需要设置] + --kv-transfer-config [KV 缓存传输的配置(使能lmcache)] +``` + +### 5. 2 启动示例 + +启动示例(根据实际需求调整): + +```bash +vllm-mindspore serve \ + --model="/home/ckpt/Qwen3-32B" \ + --port 8001 \ + --trust-remote-code \ + --max-model-len 1024 \ + --max-num-batched-tokens 1024 \ + --block-size 128 \ + --gpu-memory-utilization 0.70 \ + --tensor-parallel-size 4 \ + --kv-transfer-config '{"kv_connector":"LMCacheConnectorV1","kv_role":"kv_both"}' +``` + +## 6. 推理测试与性能验证 +### 6.1 推理请求测试 + +使用 curl 发送测试请求,验证是否部署成功: + +```bash +curl http://localhost:8001/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "/home/ckpt/Qwen3-32B", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "将文本分类为中性、负面或正面。\\n文本:我认为这次假期还可以。\\n情感:"} + ], + "max_tokens": 512, + "temperature": 0, + "top_p": 1.0, + "top_k": 1, + "repetition_penalty": 1.0 + }' | python3 -m json.tool +``` +### 6.2 性能基准测试 + +性能基准测试依赖 `openEuler/llm_solution` 项目提供的并行测试工具[benchmark](https://gitee.com/openeuler/llm_solution/blob/master/tool/benchmark/benchmark_parallel.py),核心组件为以下两个文件: + +- 主程序:`benchmark_parallel.py` +- 工具依赖:`benchmark_utils.py` + +获取方式: + +```bash +git clone https://gitee.com/openeuler/llm_solution.git +cd llm_solution/tool/benchmark +``` + +性能测试,注意: --tokenizer指定的模型路径,要和启动推理服务时的model_path一模一样 + +```bash +python benchmark_parallel.py --backend openai --host [主节点IP] --port [服务端口] --tokenizer [模型路径] --epochs 1 --parallel-num 192 --prompt-tokens 256 --output-tokens 256 +``` + +示例: + +```bash +python benchmark_parallel.py --backend openai --host 192.10.10.10 --port 8100 --tokenizer "/home/ckpt/Qwen3-32B" --epochs 1 --parallel-num 192 --prompt-tokens 256 --output-tokens 256 +``` + +- `--tokenizer "/home/ckpt/Qwen3-32B"`: 指定用于分词的 tokenizer 的路径。与实际加载的模型路径一致,因为分词器是模型的一部分。 +- `--parallel-num`:并发请求数量,用于测试系统吞吐量 +- `--prompt-tokens`:输入文本的 Token 长度 +- `--output-tokens`:目标输出文本的 Token 长度 +- `--epochs 1`: 指定基准测试运行的轮数。 +- `--parallel-num 192`: 这是并发请求的数量。脚本会同时发起 192 个请求来测试服务的吞吐量。