企业网站带数据库,网络科技有限公司注册资金最低,网站后台不能粘贴文章,最新猪价一、背景与意义
熟悉大模型推理的应该知道其在两个核心阶段存在显著差异#xff1a;
Prefill 阶段#xff1a;当用户输入完整序列#xff08;如 prompt#xff09;时#xff0c;模型需要一次性对整个序列进行处理#xff0c;计算所有 token 的注意力权重、进行矩阵乘法…一、背景与意义熟悉大模型推理的应该知道其在两个核心阶段存在显著差异Prefill 阶段当用户输入完整序列如 prompt时模型需要一次性对整个序列进行处理计算所有 token 的注意力权重、进行矩阵乘法如 QKV 计算、输出投影等。由于输入序列长度通常较长可能达千级 token此阶段涉及大量并行的矩阵运算计算量随序列长度呈平方增长注意力机制的复杂度因此是典型的计算密集型任务。同时该阶段还会生成初始的 KV Cache键值缓存用于后续解码阶段复用避免重复计算。Decode 阶段在生成输出文本时模型每次仅基于上一个生成的 token 和历史 KV Cache 计算下一个 token输入序列长度固定为 1当前 token。此时计算量大幅减少但需要频繁读取和更新 KV Cache随着生成序列增长KV Cache 的容量线性增加且每次生成都需等待前一次结果并行性极低。因此该阶段更依赖内存带宽和延迟是访存密集型任务。相较于 PD 混部PD 分离的模型部署方式通过将 prefill 和 decode 阶段解耦可有效提升资源利用率。而 vLLM的 PagedAttention 技术能高效管理两阶段的 KV 缓存结合 PD 分离可进一步减少内存浪费。本文主要记录了 DeepSeek-V3-w8a8 模型在 vLLM 环境下的 PD 分离部署过程。二、环境版本与依赖清单基础环境配置软硬件版本或款型硬件平台两台G860016卡*64GB操作系统ubuntu 22.04驱动版本25.2.0python3.11软件依赖版本组件版本备注CANN8.2.RC1torch2.5.1cpu对应torchvision 0.20.1torch_npu2.5.1.post1.dev20250619vLLM0.9.1需与vLLM-Ascend版本一致vLLM-ascend0.9.1-dev三、环境搭建准备1. 环境检查与验证在部署之前环境检查与验证是所必须的以下环境检查脚本可以确保物理连接正常、网络健康、NPU正常确保后续的部署流程可以正常进行。# 校验驱动状态查看NPU设备状态npu-smi info# 检查物理连接foriin{0..15};dohccn_tool -i$i-lldp -g|grepIfname;done# 检查以太网端口状态为upforiin{0..15};dohccn_tool -i$i-link -g;done# 检查网络健康情况为successforiin{0..15};dohccn_tool -i$i-net_health -g;done# 查看侦测ip的配置foriin{0..15};dohccn_tool -i$i-netdetect -g;done# 查看网管配置foriin{0..15};dohccn_tool -i$i-gateway -g;done# 检查NPU底层tls校验行为一致性foriin{0..15};dohccn_tool -i$i-tls -g;done|grepswitch# NPU底层tls校验行为置0foriin{0..15};dohccn_tool -i$i-tls -senable0;done# 获取NPU的IP地址foriin{0..15};dohccn_tool -i$i-ip -g;done# 检查能否跨节点ping通从本节点ping其它节点上的NPUforiin{0..15};dohccn_tool -i$i-ping -g addressNPU-IP;done2. 容器环境配置如果不是以root身份登录设备在登录后先切换到rootsudosu- root在home下面创建个人目录mkdir/home/name创建容器需删除注释dockerrun -it --privileged --nametest_vllm_ds_dp --nethost --shm-size500g --device/dev/davinci_manager --device/dev/hisi_hdc --device/dev/devmm_svm --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/davinci8 --device/dev/davinci9 --device/dev/davinci10 --device/dev/davinci11 --device/dev/davinci12 --device/dev/davinci13 --device/dev/davinci14 --device/dev/davinci15 -v /usr/local/Ascend/driver:/usr/local/Ascend/driver -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ -v /usr/local/sbin/:/usr/local/sbin/ -v /var/log/npu/slog/:/var/log/npu/slog -v /usr/local/dcmi:/usr/local/dcmi -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi -v /etc/ascend_install.info:/etc/ascend_install.info -v /var/log/npu/profiling/:/var/log/npu/profiling -v /var/log/npu/dump/:/var/log/npu/dump -v /var/log/npu/:/usr/slog -v /etc/hccn.conf:/etc/hccn.conf -v /home/:/home\-w /home/name\vllm-ascend:2.1.RC1-800I-A2-py311-ubuntu22.04-x86_64\/bin/bash如果找不到镜像vllm-ascend:2.1.RC1-800I-A2-py311-ubuntu22.04-x86_64可以将其下载到本地进入容器dockerexec-it test_vllm_ds_dpbash完成网络代理配置通过curl www.baidu.com校验网络是否正常可以正常返回百度首页的 html 信息则代表网络正常3. 软件安装流程1安装CANNCANN下载路径社区版资源下载-资源下载中心-昇腾社区 (hiascend.com)下载并检查toolkit、kernels、nnal安装包推荐使用 8.2.RC1 版本。赋予执行权限chmodax Ascend-cann-kernels-910b_8.2.RC1_linux-x86_64.runchmodax Ascend-cann-nnal_8.2.RC1_linux-x86_64.runchmodax Ascend-cann-toolkit_8.2.RC1_linux-x86_64.run分别对其先进行安装包完整性检查然后安装到指定目录./Ascend-cann-toolkit_8.2.RC1_linux-x86_64.run --check ./Ascend-cann-toolkit_8.2.RC1_linux-x86_64.run --install --install-path/home/name/cmc/cann_8.2.rc1 ./Ascend-cann-kernels-910b_8.2.RC1_linux-x86_64.run --check ./Ascend-cann-kernels-910b_8.2.RC1_linux-x86_64.run --install --install-path/home/name/cmc/cann_8.2.rc1 ./Ascend-cann-nnal_8.2.RC1_linux-x86_64.run --check ./Ascend-cann-nnal_8.2.RC1_linux-x86_64.run --install --install-path/home/name/cmc/cann_8.2.rc1添加环境变量。注意每次重新进入容器都需要配置环境变量source/home/name/cmc/cann_8.2.rc1/ascend-toolkit/set_env.shsource/home/name/cmc/cann_8.2.rc1/nnal/atb/set_env.sh无需将font stylecolor:rgba(0, 0, 0, 0.85);background-color:rgba(0, 0, 0, 0.04);kernels/font添加环境变量font stylecolor:rgba(0, 0, 0, 0.85);background-color:rgba(0, 0, 0, 0.04);toolkit/font的环境变量脚本就已经包含了对其算子库路径的引用。2安装torch和torch_npu可以直接用pip安装。pip configsetglobal.extra-index-urlhttps://download.pytorch.org/whl/cpu/ https://mirrors.huaweicloud.com/ascend/repos/pypipipinstallattrs cythonnumpy1.26.4 decoratorsympy1.13.1 cffi pyyaml pathlib2 psutilprotobuf6.31.1 scipy requests absl-py#pip install torch2.5.1pipinstalltorchvision0.20.1# 安装时会自动安装torch2.5.1cpupipinstalltorch-npu2.5.1.post1.dev202506193安装vLLMcd../gitclone https://github.com/vllm-project/vllm.gitcdvllmgitcheckout releases/v0.9.1VLLM_TARGET_DEVICEempty pipinstall-v -e.4安装vLLM-ascendcd../gitclone https://github.com/vllm-project/vllm-ascendcdvllm-ascendgitcheckout v0.9.1-dev pipinstall-v -e.说明如果在克隆git仓库时遇到SSL证书验证失败的问题则关闭证书校验。exportGIT_SSL_NO_VERIFY1gitconfig --global http.sslVerifyfalse到此为止环境搭建就完成了下面就要进行具体的模型部署了。四、模型部署流程1. 创建ranktable.json在所有用于PD分离的设备上执行以下脚本生成ranktable。cd/home/name/vllm-ascend/examples/disaggregate_prefill_v1/bashgen_ranktable.sh --ips141.61.41.163141.61.41.164 --npus-per-node16--network-card-name ens3f0 --prefill-device-cnt16--decode-device-cnt16参数说明ips用于PD分离的设备IP。P节点在前D节点在后npus-per-node每个节点的npu数量network-card-name网卡名称。获取方式ifconfig查找ip和设备ip相同的端口名称prefill-device-cnt用于prefill的卡数decode-device-cnt用于decode的卡数2. 配置并拉起 Prefill 节点设置环境变量exportHCCL_IF_IP141.61.41.163exportGLOO_SOCKET_IFNAMEens3f0exportTP_SOCKET_IFNAMEens3f0exportHCCL_SOCKET_IFNAMEens3f0exportDISAGGREGATED_PREFILL_RANK_TABLE_PATH/home/name/vllm-ascend/examples/disaggregate_prefill_v1/ranktable.jsonexportOMP_PROC_BINDfalseexportOMP_NUM_THREADS32exportVLLM_USE_V11exportVLLM_LLMDD_RPC_PORT5559拉起服务vllm serve /home/weight/deepseek/DeepSeek-V3.1-w8a8-rot-mtp --host0.0.0.0 --port20002--data-parallel-size1--data-parallel-size-local1--api-server-count1--data-parallel-address141.61.41.163 --data-parallel-rpc-port13356--tensor-parallel-size16--enable-expert-parallel --quantization ascend --seed1024--served-model-name deepseek --max-model-len32768--max-num-batched-tokens32768--max-num-seqs64--trust-remote-code --enforce-eager --gpu-memory-utilization0.9--kv-transfer-config{kv_connector: LLMDataDistCMgrConnector, kv_buffer_device: npu, kv_role: kv_producer, kv_parallel_size: 1, kv_port: 20001, engine_id: 0, kv_connector_module_path: vllm_ascend.distributed.llmdatadist_c_mgr_connector }3. 配置并拉起 Decode 节点设置环境变量exportHCCL_IF_IP141.61.41.164exportGLOO_SOCKET_IFNAMEens3f0exportTP_SOCKET_IFNAMEens3f0exportHCCL_SOCKET_IFNAMEens3f0exportDISAGGREGATED_PREFILL_RANK_TABLE_PATH/home/name/vllm-ascend/examples/disaggregate_prefill_v1/ranktable.jsonexportOMP_PROC_BINDfalseexportOMP_NUM_THREADS32exportVLLM_USE_V11exportVLLM_LLMDD_RPC_PORT5659拉起服务vllm serve /home/weight/deepseek/DeepSeek-V3.1-w8a8-rot-mtp --host0.0.0.0 --port20002--data-parallel-size1--data-parallel-size-local1--api-server-count1--data-parallel-address141.61.41.164 --data-parallel-rpc-port13356--tensor-parallel-size16--enable-expert-parallel --quantization ascend --seed1024--served-model-name deepseek --max-model-len8192--max-num-batched-tokens256--max-num-seqs64--trust-remote-code --gpu-memory-utilization0.9--kv-transfer-config{kv_connector: LLMDataDistCMgrConnector, kv_buffer_device: npu, kv_role: kv_consumer, kv_parallel_size: 1, kv_port: 20001, engine_id: 0, kv_connector_module_path: vllm_ascend.distributed.llmdatadist_c_mgr_connector }--additional-config{torchair_graph_config: {enabled:true}}回显Application startup complete.表示启动成功。4. 运行代理在prefill的机器上新建容器交互窗口运行load_balance_proxy_server_example.py。source/home//cmc/cann_8.2.rc1/ascend-toolkit/set_env.shsource/home//cmc/cann_8.2.rc1/nnal/atb/set_env.shcd/home//vllm-ascend/examples/disaggregate_prefill_v1/ python load_balance_proxy_server_example.py --host141.61.41.163 --port1025--prefiller-hosts141.61.41.163 --prefiller-ports20002--decoder-hosts141.61.41.164 --decoder-ports20002回显Application startup complete.表示启动成功。回显信息中包含成功初始化的prefill客户端、decode客户端数量和服务化地址。到这里就完成了模型的部署了。五、模型验证1. API接口测试在prefill的机器上新建容器交互窗口发送Completions API调用请求。curlhttp://141.61.41.163:1025/v1/completions -HContent-Type: application/json-d{ model: deepseek, prompt: how is it today, max_tokens: 50, temperature: 0 }添加参数-v可以查看更加详细的信息。回显中的choice/text为模型输出的文本。2. benchmark测试在prefill侧运行脚本source/home/name/cmc/cann_8.2.rc1/ascend-toolkit/set_env.shsource/home/name/cmc/cann_8.2.rc1/nnal/atb/set_env.shcd/home/name/vllm/benchmarks/ python benchmark_serving.py --backend vllm --dataset-name random --random-input-len10--random-output-len100--num-prompts10--ignore-eos --model deepseek --tokenizer /home/weight/deepseek/DeepSeek-V3.1-w8a8-rot-mtp --host141.61.41.163 --port1025--endpoint /v1/completions --max-concurrency4--request-rate4获取benchmark测试结果六、遇见的坑1无法找到满足要求的torch-npu版本问题现象使用pip 25.1.1版本安装时提示无法找到满足要求的torch-npu版本。产生原因使用的镜像地址不合适。解决方法指定使用的镜像地址重新安装。pip uninstall torch pip configsetglobal.trusted-hostdownload.pytorch.org mirrors.huaweicloud.com mirrors.aliyun.compip configsetglobal.extra-index-urlhttps://download.pytorch.org/whl/cpu/ https://mirrors.huaweicloud.com/ascend/repos/pypi# pip install torch2.5.1pipinstalltorchvision0.20.1# 安装时会自动安装torch2.5.1cpupipinstalltorch-npu2.5.1.post1.dev202506192安装包存在冲突依赖问题现象安装的torch和torch-npu版本正确但是安装vllm-ascend时报错Cannot install torch-npu2.5.1.post1 and torch2.5.1 because these package versions have conflicting dependencies.产生原因可能是安装torch、torch-npu时使用的源和期望不一致。解决方法重新指定使用的镜像地址重新安装。pip uninstalltorch2.5.1 torch-npu2.5.1.post1.dev20250619 -y# 卸载已安装的torch和torch-npupip cache purge# 清除缓存和构建环境pip configunsetglobal.extra-index-url# 重新设置global.extra-index-urlpip configsetglobal.extra-index-urlhttps://download.pytorch.org/whl/cpu/ https://mirrors.huaweicloud.com/ascend/repos/pypipipinstalltorch2.5.1# 重新下载torch和torch-npupipinstalltorch-npu2.5.1.post1.dev20250619# 查看安装的torch和torch-npu版本pip show torch torch-npu|grepVersion3拉起服务时报 NPU out of memory问题现象报错信息为RuntimeError: NPU out of memory. Tried to allocate 898.00 MiB (NPU 15; 60.96 GiB total capacity; 59.80 GiB already allocated; 59.80 GiB current active; 804.00 MiB free; 59.83 GiB reserved in total by PyTorch) If reserved memory is allocated memory try setting max_split_size_mb to avoid fragmentation.产生原因未按量化方式加载模型参数。解决方法用vllm serve拉起服务时添加–quantization ascend。4拉起服务时报 NPU function error: call aclnnQuantMatmulV4 failed问题现象报错信息为Tensor scale not implemented for DT_FLOAT16, should be in dtype support list [DT_UINT64,DT_BFLOAT16,DT_INT64,DT_FLOAT,].产生原因模型参数类型和aclnnQuantMatmulV4接口支持的参数类型不符。解决方法打开deepseek模型的config.json文件torch_dtype由float16改为bfloat16。5拉起服务时报 HCCL function error问题现象报错信息为RuntimeError: createHCCLComm:torch_npu/csrc/distributed/ProcessGroupHCCL.cpp:2166 HCCL function error: HcclGetRootInfo(hcclID), error code is 6ERR02200 DIST call hccl api failed.产生原因HCCL_IF_IP与本机IP不符。解决方法修改脚本中的HCCL_IF_IP环境变量。七、总结这就是完整的 DP 分离部署的流程了DP 分离部署后确实对大模型的效率进行了不小的提升利用 Prefill 和 Decode 两阶段的计算/通信特征的差异特点为了提升性能和资源利用效率通过PD分离部署方案将 Prefill 和 Decode 分别部署在不同规格和架构的集群中并且配合服务层的任务调度在提供更好用户体验的前提下可以充分提升算力利用率。如果你也感兴趣的话欢迎来尝试亲手部署一个 DP 分离的 LLM 大模型吧。注明昇腾PAE案例库对本文写作亦有帮助。