多机并行推理(DeepSeek R1)
本文档介绍DeepSeek R1 671B W8A8并行推理启动流程。DeepSeek R1 671B W8A8模型需使用多个节点资源运行推理模型。为确保各个节点的执行配置(包括模型配置文件路径、Python环境等)一致,推荐通过 docker 镜像创建容器的方式避免执行差异。用户可通过以下docker安装章节进行环境配置。
vLLM-MindSpore插件支持张量并行(TP)、数据并行(DP)、专家并行(EP)及其组合配置的混合并行推理。关于多机并行推理的更多信息,可以参考并行推理方法介绍。
该文档样例,需要2台Atlas 800 A2服务器节点。共16个可用的NPU,每个NPU为64GB的规格。
docker安装
在本章节中,我们推荐使用docker创建的方式,快速部署vLLM-MindSpore插件环境。以下是部署docker的步骤介绍:
构建镜像
用户可执行以下命令,拉取vLLM-MindSpore插件代码仓库,并构建镜像:
git clone https://atomgit.com/mindspore/vllm-mindspore.git
bash build_image.sh
构建成功后,用户可以得到以下信息:
Successfully built e40bcbeae9fc
Successfully tagged vllm_ms_20250726:latest
其中,e40bcbeae9fc为镜像ID,vllm_ms_20250726:latest为镜像名与tag。用户可执行以下命令,确认docker镜像创建成功:
docker images
新建容器
用户在完成构建镜像后,设置DOCKER_NAME与IMAGE_NAME为容器名与镜像名,并执行以下命令新建容器:
export DOCKER_NAME=vllm-mindspore-container # your container name
export IMAGE_NAME=vllm_ms_20250726:latest # your image name
docker run -itd --name=${DOCKER_NAME} --ipc=host --network=host --privileged=true \
--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 /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /var/log/npu/:/usr/slog \
-v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
-v /etc/hccn.conf:/etc/hccn.conf \
--shm-size="250g" \
${IMAGE_NAME} \
bash
关于docker运行参数,可以参考文档:MindSpore安装指南的“运行MindSpore镜像”部分。
新建容器成功后,将返回容器ID。用户可执行以下命令,确认容器是否创建成功:
docker ps
进入容器
用户在完成新建容器后,使用已定义的环境变量DOCKER_NAME,启动并进入容器:
docker exec -it $DOCKER_NAME bash
Ray多节点集群管理
在 Ascend 上,如果使用Ray,则需要额外安装 pyACL 包来适配 Ray。所有节点的 CANN 依赖版本需要保持一致。该样例需要依赖Ray进行多机启动。Ray的安装介绍请查看Ray安装流程介绍。
下载模型权重
用户可采用Python工具下载或git-lfs工具下载两种方式,进行模型下载。
Python工具下载
执行以下 Python 脚本,从魔乐社区下载 MindSpore版本的DeepSeek-R1 W8A8权重及文件:
from openmind_hub import snapshot_download
snapshot_download(repo_id="MindSpore-Lab/DeepSeek-R1-0528-A8W8FA3",
local_dir="/path/to/save/deepseek_r1_0528_a8w8fa3",
local_dir_use_symlinks=False)
其中local_dir为模型保存路径,由用户指定,请确保该路径下有足够的硬盘空间。
git-lfs工具下载
执行以下代码,以确认git-lfs工具是否可用:
git lfs install
如果可用,将获得如下返回结果:
Git LFS initialized.
若工具不可用,则需要先安装git-lfs,可参考FAQ章节中关于git-lfs安装的阐述。
工具确认可用后,执行以下命令,下载权重:
git clone https://modelers.cn/models/MindSpore-Lab/DeepSeek-R1-0528-gs-A8W8.git
启动模型服务
以下样例以DeepSeek R1 671B W8A8为例,启动模型服务。
设置环境变量
分别在主从节点配置如下环境变量:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export MS_ENABLE_LCCL=off
export HCCL_OP_EXPANSION_MODE=AIV
export MS_ALLOC_CONF=enable_vmm:true
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export VLLM_MS_MODEL_BACKEND=MindFormers
export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
export GLOO_SOCKET_IFNAME=enp189s0f0
export HCCL_SOCKET_IFNAME=enp189s0f0
export TP_SOCKET_IFNAME=enp189s0f0
环境变量说明:
MS_ENABLE_LCCL:关闭LCCL,使能HCCL通信。HCCL_OP_EXPANSION_MODE:配置通信算法的编排展开位置为Device侧的AI Vector Core计算单元。MS_ALLOC_CONF:设置内存策略。可参考MindSpore官网文档。ASCEND_RT_VISIBLE_DEVICES:配置每个节点可用的设备ID。用户可使用npu-smi info命令进行查询。VLLM_MS_MODEL_BACKEND:所运行的模型后端。目前vLLM-MindSpore插件所支持的模型与模型后端,可在模型支持列表中进行查询。PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION:当版本不兼容时使用。GLOO_SOCKET_IFNAME:GLOO后端端口,用于多机之间使用gloo通信时的网口名称。可通过ifconfig查找IP对应网卡的网卡名。HCCL_SOCKET_IFNAME:配置HCCL端口,用于多机之间使用HCCL通信时的网口名称。可通过ifconfig查找IP对应网卡的网卡名。TP_SOCKET_IFNAME:配置TP端口,用于多机之间使用TP通信时的网口名称。可通过ifconfig查找IP对应网卡的网卡名。
在线推理
启动服务
vLLM-MindSpore插件可使用OpenAI的API协议,部署在线推理。以下是在线推理的启动流程。
# 启动配置参数说明
vllm-mindspore serve
[模型标签:模型Config和权重文件路径]
--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 [显存利用率,推荐0.9]
--tensor-parallel-size [TP 并行数]
--headless # 启用headless模式,多节点数据并行时使用
--data-parallel-size [DP 并行数]
--data-parallel-size-local [当前服务节点中的DP数,所有节点求和等于data-parallel-size]
--data-parallel-start-rank [当前服务节点中负责的首个DP的偏移量,当使用multiprocess启动方式时使用]
--data-parallel-address [主节点的通讯IP,当使用multiprocess启动方式时使用]
--data-parallel-rpc-port [主节点的通讯端口,当使用multiprocess启动方式时使用]
--enable-expert-parallel # 使能专家并行
--data-parallel-backend [ray,mp] # 指定 dp 部署方式为 ray 或是 mp(即multiprocess)
--additional-config # 并行功能与额外配置
用户可以通过指定模型保存的本地路径为模型标签;
用户可以通过
--additional-config参数,配置并行与其他功能。
用户可以通过以下命令,使用Ray启动模型服务:
# 主节点:
nohup vllm-mindspore serve /path/to/save/deepseek_r1_0528_a8w8fa3 --trust-remote-code --max-num-seqs=256 --max-model-len=32768 --max-num-batched-tokens=4096 --block-size=128 --gpu-memory-utilization=0.9 --tensor-parallel-size 4 --data-parallel-size 4 --data-parallel-size-local 2 --enable-expert-parallel --additional-config '{"expert_parallel": 4}' --data-parallel-backend ray --quantization ascend &
用户可以通过指定模型保存的本地路径作为模型标签。若服务成功启动,则可以获得类似的执行结果:
INFO: Started server process [6363]
INFO: Waiting for application startup.
INFO: Application startup complete.
另外,日志中还会打印出服务的性能数据信息,如:
Engine 000: Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 0.0 tokens/s, Running: 0 reqs, Waiting: 0 reqs, GPU KV cache usage: 0.0%, Prefix cache hit rate: 0.0%
关于multiprocess启动命令,可以参考multiprocess启动方式。
发送请求
使用如下命令发送请求。其中prompt字段为模型输入:
curl http://localhost:8000/v1/completions -H "Content-Type: application/json" -d '{"model": "MindSpore-Lab/DeepSeek-R1-0528-A8W8", "prompt": "I am", "max_tokens": 120, "temperature": 0}'
用户需确认"model"字段与启动服务中的模型标签一致,请求才能成功匹配到模型。
附录
Ray安装流程
在 Ascend 上,如果使用Ray,则需要额外安装 pyACL 包来适配 Ray。所有节点的 CANN 依赖版本需要保持一致。
安装 pyACL
pyACL(Python Ascend Computing Language)通过 CPython 封装了 AscendCL 对应的 API 接口,使用该接口可以管理 Ascend AI 处理器和对应的计算资源。
在对应环境中,获取相应版本的 Ascend-cann-nnrt 安装包后,解压出 pyACL 依赖包并单独安装,并将安装路径添加到环境变量中:
./Ascend-cann-nnrt_*_linux-aarch64.run --noexec --extract=./
cd ./run_package
./Ascend-pyACL_*_linux-aarch64.run --full --install-path=<install_path>
export PYTHONPATH=<install_path>/CANN-<VERSION>/python/site-packages/:$PYTHONPATH
若安装过程有权限问题,可以使用以下命令加权限:
chmod -R 777 ./Ascend-pyACL_*_linux-aarch64.run
在 Ascend 的首页中可以下载 Ascend 运行包。例如,可以参考安装指南下载运行包。
多节点间集群
多节点集群管理前,需要检查各节点的 hostname 是否各异。如果存在相同的,需要通过 hostname <new-host-name> 设置不同的 hostname。
启动主节点
ray start --head --port=<port-to-ray>。启动成功后,会提示从节点的连接方式。配置方式如下,其中IP和address需要修改成实际运行的环境信息。
Local node IP: *.*.*.*
--------------------
Ray runtime started.
--------------------
Next steps
To add another node to this Ray cluster, run
ray start --address='*.*.*.*:*'
To connect to this Ray cluster:
import ray
ray.init()
To terminate the Ray runtime, run
ray stop
To view the status of the cluster, use
ray status
从节点连接主节点
ray start --address=<head_node_ip>:<port>。通过
ray status查询集群状态。显示的NPU总数为节点总和,则表示集群成功。
当有两个节点,每个节点有8个NPU时,其结果如下:
======== Autoscaler status: 2025-05-19 00:00:00.000000 ========
Node status
---------------------------------------------------------------
Active:
1 node_efa0981305b1204810c3080c09898097099090f09ee909d0ae12545
1 node_184f44c4790135907ab098897c878699d89098e879f2403bc990112
Pending:
(no pending nodes)
Recent failures:
(no failures)
Resources
---------------------------------------------------------------
Usage:
0.0/384.0 CPU
0.0/16.0 NPU
0B/2.58TiB memory
0B/372.56GiB object_store_memory
Demands:
(no resource demands)