多机并行推理(DeepSeek R1)
vLLM-MindSpore插件支持张量并行(TP)、数据并行(DP)、专家并行(EP)及其组合配置的混合并行推理。不同并行策略的适用场景可参考vLLM官方文档。
本文档将以DeepSeek R1 671B W8A8为例,介绍张量并行及混合并行推理流程。DeepSeek R1 671B W8A8模型需使用多个节点资源运行推理。为确保各个节点的执行配置(包括模型配置文件路径、Python环境等)一致,推荐通过 docker 镜像创建容器的方式避免执行差异。
用户可通过以下docker安装章节进行环境配置。
docker安装
在本章节中,我们推荐使用docker创建的方式,快速部署vLLM-MindSpore插件环境。以下是部署docker的步骤介绍:
构建镜像
用户可执行以下命令,拉取vLLM-MindSpore插件代码仓库,并构建镜像:
git clone -b r0.3.0 https://gitee.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/sbin/:/usr/local/sbin/ \
-v /var/log/npu/slog/:/var/log/npu/slog \
-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 /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /etc/vnpu.cfg:/etc/vnpu.cfg \
--shm-size="250g" \
${IMAGE_NAME} \
bash
新建容器成功后,将返回容器ID。用户可执行以下命令,确认容器是否创建成功:
docker ps
进入容器
用户在完成新建容器后,使用已定义的环境变量DOCKER_NAME,启动并进入容器:
docker exec -it $DOCKER_NAME bash
下载模型权重
用户可采用Python工具下载或git-lfs工具下载两种方式,进行模型下载。
Python工具下载
执行以下 Python 脚本,从魔乐社区下载 MindSpore版本的DeepSeek-R1 W8A8权重及文件:
from openmind_hub import snapshot_download
snapshot_download(repo_id="MindSpore-Lab/DeepSeek-R1-0528-A8W8",
local_dir="/path/to/save/deepseek_r1_0528_a8w8",
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-A8W8.git
TP16 张量并行推理
vLLM 通过 Ray 对多个节点资源进行管理和运行。该样例对应张量并行(TP)为16的场景。
设置环境变量
环境变量必须设置在 Ray 创建集群前。当环境有变更时,需要通过 ray stop 将主从节点集群停止,并重新创建集群,否则环境变量将不生效。
分别在主从节点配置如下环境变量:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export GLOO_SOCKET_IFNAME=enp189s0f0
export HCCL_SOCKET_IFNAME=enp189s0f0
export TP_SOCKET_IFNAME=enp189s0f0
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_MODEL_BACKEND=MindFormers
export MINDFORMERS_MODEL_CONFIG=/path/to/research/deepseek3/deepseek_r1_671b/predict_deepseek_r1_671b_w8a8.yaml
环境变量说明:
GLOO_SOCKET_IFNAME: GLOO后端端口。可通过ifconfig查找IP对应网卡的网卡名。HCCL_SOCKET_IFNAME: 配置HCCL端口。可通过ifconfig查找IP对应网卡的网卡名。TP_SOCKET_IFNAME: 配置TP端口。可通过ifconfig查找IP对应网卡的网卡名。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_MODEL_BACKEND:所运行的模型后端。目前vLLM-MindSpore插件所支持的模型与模型后端,可在模型支持列表中进行查询。MINDFORMERS_MODEL_CONFIG:模型配置文件。用户可以在MindSpore Transformers工程中,找到对应模型的yaml文件predict_deepseek_r1_671b_w8a8.yaml 。
模型并行策略通过配置文件中的parallel_config指定,例如TP16 张量并行配置如下所示:
# default parallel of device num = 16 for Atlas 800T A2
parallel_config:
data_parallel: 1
model_parallel: 16
pipeline_stage: 1
expert_parallel: 1
另外,用户需要确保MindSpore Transformers已安装。用户可通过以下命令引入MindSpore Transformers:
export PYTHONPATH=/path/to/mindformers:$PYTHONPATH
启动 Ray 进行多节点集群管理
在 Ascend 上,需要额外安装 pyACL 包来适配 Ray。所有节点的 CANN 依赖版本需要保持一致。
安装 pyACL
pyACL(Python Ascend Computing Language)通过 CPython 封装了 AscendCL 对应的 API 接口,使用该接口可以管理 Ascend AI 处理器和对应的计算资源。
在对应环境中,获取相应版本的 Ascend-cann-nnrt 安装包后,解压出 pyACL 依赖包并单独安装,并将安装路径添加到环境变量中:
./Ascend-cann-nnrt_8.0.RC1_linux-aarch64.run --noexec --extract=./
cd ./run_package
./Ascend-pyACL_8.0.RC1_linux-aarch64.run --full --install-path=<install_path>
export PYTHONPATH=<install_path>/CANN-<VERSION>/python/site-packages/:$PYTHONPATH
若安装过程有权限问题,可以使用以下命令加权限:
chmod -R 777 ./Ascend-pyACL_8.0.RC1_linux-aarch64.run
在 Ascend 的首页中可以下载 Ascend 运行包。例如,可以下载 8.0.RC1.beta1 对应版本的运行包。
多节点间集群
多节点集群管理前,需要检查各节点的 hostname 是否各异。如果存在相同的,需要通过 hostname <new-host-name> 设置不同的 hostname。
启动主节点
ray start --head --port=<port-to-ray>。启动成功后,会提示从节点的连接方式。例如,在 IP 为192.5.5.5的环境中,通过ray start --head --port=6379,提示如下:Local node IP: 192.5.5.5 -------------------- Ray runtime started. -------------------- Next steps To add another node to this Ray cluster, run ray start --address='192.5.5.5:6379' 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)
在线推理
启动服务
vLLM-MindSpore插件可使用OpenAI的API协议,部署在线推理。以下是在线推理的启动流程。
# 启动配置参数说明
vllm-mindspore serve
--model=[模型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 并行数]
执行示例
# 主节点:
vllm-mindspore serve --model="MindSpore-Lab/DeepSeek-R1-0528-A8W8" --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 16 --distributed-executor-backend=ray
张量并行场景下,--tensor-parallel-size参数会覆盖模型YAML文件中parallel_config的model_parallel配置。用户可以通过--model参数,指定模型保存的本地路径。
发起请求
使用如下命令发送请求。其中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": 20, "temperature": 0, "top_p": 1.0, "top_k": 1, "repetition_penalty": 1.0}'
用户需确认"model"字段与启动服务中的--model一致,请求才能成功匹配到模型。
混合并行推理
vLLM 通过 Ray 对多个节点资源进行管理和运行。该样例对应以下并行策略场景:
数据并行(DP)为4;
张量并行(TP)为4;
专家并行(EP)为4。
设置环境变量
分别在主从节点配置如下环境变量:
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_MODEL_BACKEND=MindFormers
export MINDFORMERS_MODEL_CONFIG=/path/to/research/deepseek3/deepseek_r1_671b/predict_deepseek_r1_671b_w8a8_ep4tp4.yaml
环境变量说明:
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_MODEL_BACKEND:所运行的模型后端。目前vLLM-MindSpore插件所支持的模型与模型后端,可在模型支持列表中进行查询。MINDFORMERS_MODEL_CONFIG:模型配置文件。用户可以在MindSpore Transformers工程中,找到对应模型的yaml文件predict_deepseek_r1_671b_w8a8.yaml。
模型并行策略通过配置文件中的parallel_config指定,例如混合并行配置如下所示:
# default parallel of device num = 16 for Atlas 800T A2
parallel_config:
data_parallel: 4
model_parallel: 4
pipeline_stage: 1
expert_parallel: 4
data_parallel及model_parallel指定attn及ffn-dense部分的并行策略,expert_parallel指定moe部分路由专家并行策略,且需满足data_parallel * model_parallel可被expert_parallel整除
在线推理
启动服务
vllm-mindspore可使用OpenAI的API协议部署在线推理。以下是在线推理的启动流程:
# 启动配置参数说明
vllm-mindspore serve
--model=[模型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 # 仅从节点需要配置,表示不需要服务侧相关内容
--data-parallel-size [DP 并行数]
--data-parallel-size-local [当前服务节点中的DP数,所有节点求和等于data-parallel-size]
--data-parallel-start-rank [当前服务节点中负责的首个DP的偏移量]
--data-parallel-address [主节点的通讯IP]
--data-parallel-rpc-port [主节点的通讯端口]
--enable-expert-parallel # 使能专家并行
用户可以通过--model参数,指定模型保存的本地路径。以下为执行示例:
# 主节点:
vllm-mindspore serve --model="MindSpore-Lab/DeepSeek-R1-0528-A8W8" --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 --data-parallel-start-rank 0 --data-parallel-address 192.10.10.10 --data-parallel-rpc-port 12370 --enable-expert-parallel
# 从节点:
vllm-mindspore serve --headless --model="MindSpore-Lab/DeepSeek-R1-0528-A8W8" --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 --data-parallel-start-rank 2 --data-parallel-address 192.10.10.10 --data-parallel-rpc-port 12370 --enable-expert-parallel
发送请求
使用如下命令发送请求。其中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"字段与启动服务中的--model一致,请求才能成功匹配到模型。