多机并行推理(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_NAMEIMAGE_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。

  1. 启动主节点 ray start --head --port=<port-to-ray>。启动成功后,会提示从节点的连接方式。配置方式如下,其中IPaddress需要修改成实际运行的环境信息。

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
  1. 从节点连接主节点 ray start --address=<head_node_ip>:<port>

  2. 通过 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)