保姆级教程!华为昇腾NPU DeepSeek安装部署全流程!

本教程主要提供DeepSeek-V3.1-Terminus/DeepSeek-V3.2-Exp在华为昇腾910B 安装部署指南,从系统固件安装→ 模型量化→ 服务环境安装启动全流程配置。

温馨提示:过程中有任何问题可以去华为昇腾提交工单或者社区发帖讨论奥!

官网地址:www.hiascend.com/cann

一、物理机器环境

1.1 物理机配置

服务器(NPU) CPU NPU 内存 存储
910B2 192核 8* 64G 2048GB 2*3T
910B2 192核 8* 64G 2048GB 2*3T

1.2 查看操作系统和内核版本

bash 复制代码
# 查看内核版本
uname -r
# 查看 /etc/os-release 文件
cat /etc/os-release
组件 版本/说明
操作系统 银河麒麟 V10
内核版本 4.19.90-52.22.v2207.ky10.aarch64

Tips:DeepSeek-V3.1-Terminus-w8a8的量化版部署需要2台昇腾910B 物理机服务器,w4a8量化版需要1台昇腾910B 物理机服务器,DeepSeek-V3.2-Exp-w8a8的量化版同样需要2台昇腾910B物理机服务器。

二、环境准备

2.1 系统更新与依赖安装

bash 复制代码
# 更新系统包管理器
yum update -y && yum makecache -y

# 安装内核开发工具(需与当前内核版本匹配)
yum install -y make dkms gcc kernel-headers-$(uname -r) kerneldevel-$(uname -r)

2.2 检查现有驱动状态

bash 复制代码
# 检测所有NPU设备的版本信息
for i in {0..7}; do
  npu-smi info -t board -i $i | grep Version 2>/dev/null
done

输出说明

  • 若显示Software VersionFirmware Version,则已安装驱动,无需安装下面的NPU 驱动与固件安装
  • 若无输出或报错,需继续安装流程

三、NPU 驱动与固件安装

3.1 获取安装包

官方渠道 :访问昇腾社区 → 然后根据自己的服务器系统 CPU 架构、昇腾芯片型号官网下载:

bash 复制代码
https://support.huawei.com/enterprise/zh/ascend-computing/ascend-hdk-pid-252764743/software

需要下载的驱动固件如下

arduino 复制代码
Ascend-hdk-910b-npu-driver_25.2.2_linux-aarch64.run
Ascend-hdk-910b-npu-firmware_7.7.0.10.220.run

3.2 安装前准备

bash 复制代码
# 授予执行权限
chmod +x Ascend-hdk-910b-npu-driver_25.2.2_linux-aarch64.run
chmod +x Ascend-hdk-910b-npu-firmware_7.7.0.10.220.run

# 确认权限(应以root用户执行)
[[ $(id -u) -eq 0 ]] || echo "请切换到root用户执行安装"

3.3 安装驱动

css 复制代码
# 完整安装(包含工具链)
./Ascend-hdk-910b-npu-driver_25.2.2_linux-aarch64.run \
--full --install-for-all

成功标志 :终端显示 Driver package installed successfully!

3.4 安装固件

arduino 复制代码
./Ascend-hdk-910b-npu-firmware_7.7.0.10.220.run --full

成功标志 :显示 Firmware package installed successfully! 并提示重启生效

3.5 安装验证

bash 复制代码
# 重启系统使驱动生效
reboot

# 检查设备状态
npu-smi info

预期输出:应显示所有NPU设备的详细信息,包括:

  • 固件版本号
  • 内存与功耗状态

四、安装 CANN 核心组件

CANN 核心组件包括 Toolkit(开发套件)、Kernels(算子包)、NNAL(神经网络加速库)等,这里我们选择安装 Toolkit 套件,满足训练、推理及开发调试需求。

4.1 配置yum 源

bash 复制代码
sudo curl https://repo.oepkgs.net/ascend/cann/ascend.repo -o /etc/yum.repos.d/ascend.repo && yum makecache
# 查询软件包列表
yum list Ascend-cann-* --showduplicates

4.2 安装CANN

4.2.1 安装依赖

安装前需确保已具备Python环境及pip3,当前CANN支持Python3.7.x至3.11.4版本,若不满足可执行以下命令安装。

复制代码
sudo yum install -y python3 python3-pip

安装业务运行时依赖的Python第三方库。

ini 复制代码
pip3 install attrs cython 'numpy>=1.19.2,<=1.24.0' decorator sympy cffi pyyaml pathlib2 psutil protobuf==3.20.0 scipy requests absl-py

4.2.2 安装Toolkit开发套件包

复制代码
sudo yum install -y Ascend-cann-toolkit-8.2.RC1

PS : 默认root用户安装路径如下:"/usr/local/Ascend",非root用户:"${HOME}/Ascend"${HOME}为当前用户目录。

配置Toolkit环境变量,当前以root用户默认路径为例,请用户根据set_env.sh的实际路径执行如下命令

bash 复制代码
source /usr/local/Ascend/ascend-toolkit/set_env.sh

上述环境变量配置只在当前窗口生效,用户可以按需将以上命令写入环境变量配置文件(如.bashrc文件)。

4.2.3 安装Kernels算子包

Kernels算子包安装之前,需已安装配套版本的Toolkit并配置环境变量。

复制代码
yum install -y Ascend-cann-kernels-910b-8.2.RC1

4.2.4 安装NNAL神经网络加速库

NNAL神经网络加速库中提供了ATB(Ascend Transformer Boost)加速库和SiP(AscendSiPBoost)信号处理加速库。

加速库安装之前,需已安装同一版本的Toolkit并配置环境变量。

复制代码
sudo yum install -y Ascend-cann-nnal-8.2.RC1

五、安装 Miniconda

bash 复制代码
# 1、下载安装文件:从Miniconda 官网下载 Linux aarch64 版本的安装包
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-aarch64.sh
# 2、安装Miniconda3
bash Miniconda3-latest-Linux-aarch64.sh
# 安装过程到最后会询问是否要加入对应的路径,安装程序会建议选no

# 如果选了no 则需要进行下列步骤手动激活环境
eval "$(/root/miniconda3/bin/conda shell.bash hook)"
echo 'eval "$(/root/miniconda3/bin/conda shell.bash hook)"' >>~/.bashrc
source ~/.bashrc
# 3、验证安装
conda --version

六、量化模型

这里已经量化好了,可以使用我直接量化好的模型,或者可以跟着我一步一步实践一下量化模型。

6.1 modelscope 下载模型

这里使用modelscope 下载模型,安装modelscope 依赖,Python 版本需要>=3.10

复制代码
pip install modelscope

下载DeepSeek-V3.2-Exp 模型或DeepSeek-V3.1-Terminus

bash 复制代码
# 下载 DeepSeek-V3.2-Exp 
nohup modelscope download --model deepseek-ai/DeepSeek-V3.2-Exp --local_dir ./model/DeepSeek-V3.2-Exp > ./dd.log 2>&1 &
# 下载 DeepSeek-V3.1-Terminus
nohup modelscope download --model deepseek-ai/DeepSeek-V3.1-Terminus --local_dir ./model/DeepSeek-V3.1-Terminus > ./dd.log 2>&1 &

由于昇腾不支持flash_attn库,运行时需要注释掉权重文件夹modeling_deepseek.py中的如下代码。

6.2 创建与安装量化环境

bash 复制代码
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:False
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7


# 创建虚拟环境
conda create -y -n msit_env python=3.10
conda activate msit_env

# 安装依赖包
pip3 install attrs cython 'numpy>=1.19.2,<=1.24.0' decorator sympy cffi pyyaml pathlib2 psutil protobuf==3.20.0 scipy requests absl-py
pip install torch==2.7.1 torch_npu==2.7.1rc1
pip install transformers==4.48.2
git clone https://gitcode.com/Ascend/msit.git
cd ./msit/msmodelslim
bash install.sh 

6.3 DeepSeek-V3.1 W8A8C8 混合量化 + MTP 量化

bash 复制代码
git clone https://gitcode.com/Ascend/msit.git
cd ./msit/msmodelslim/example/DeepSeek
# DeepSeek-V3.1 W8A8C8 混合量化 + MTP 量化
nohup python3 quant_deepseek_w8a8.py \
--model_path ./model/DeepSeek-V3.1-Terminus \
--save_path ./model/DeepSeek-V3.1-Terminus-w8a8c8 \
--batch_size 8 \
--anti_dataset ./anti_prompt_50_v3_1.json \
--calib_dataset ./calib_prompt_50_v3_1.json \
--anti_method m4 \
--quant_mtp mix \
--rot \
--fa_quant > ./quant_w8a8c8.log 2>&1 &

tail -f quant_w8a8.log

6.4 DeepSeek-V3.1 W8A8 混合量化 + MTP 量化

lua 复制代码
nohup python3 quant_deepseek_w8a8.py \
--model_path ./model/DeepSeek-V3.1-Terminus \
--save_path ./model/DeepSeek-V3.1-Terminus-w8a8 \
--batch_size 8 \
--anti_dataset ./anti_prompt_50_v3_1.json \
--calib_dataset ./calib_prompt_50_v3_1.json \
--anti_method m4 \
--quant_mtp mix \
--rot > quant_w8a8.log 2>&1 &

tail -f quant_w8a8.log

6.5 DeepSeek-V3.1 W4A8 混合量化 + MTP 量化

bash 复制代码
# 生成DeepSeek-V3.1 W4A8 混合量化 + MTP 量化
nohup python3 quant_deepseek_w4a8.py \
--model_path ./model/DeepSeek-V3.1-Terminus \
--save_path ./model/DeepSeek-V3.1-Terminus-w4a8 \
--anti_dataset ./anti_prompt_50_v3_1.json \
--calib_dataset ./calib_prompt_50_v3_1.json \
--quant_mtp mix \
--batch_size 8 > ./quant_w4a8.log 2>&1 &

tail -f quant_w4a8.log

6.6 DeepSeek-V3.2-Exp(含MTP层) W8A8 混合量化

lua 复制代码
nohup msmodelslim quant \
 --model_path ./model/DeepSeek-V3.2-Exp \
 --save_path ./model/DeepSeek-V3.2-Exp-w8a8 \
 --model_type DeepSeek-V3.2-Exp \
 --quant_type w8a8 \
 --device npu \
 --trust_remote_code True > quant_v3.2_exp_w8a8.log 2>&1 &

tail -f quant_v3.2_exp_w8a8.log

七、 检查多节点通讯环境

7.1 显卡网络通信检查

链路检查 :在每台机器上分别执行下列命令,确保返回状态均为 success 且端口为 UP

bash 复制代码
# 检查远端交换机端口
for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done
# 查看网口链路状态(UP/DOWN)
for i in {0..7}; do hccn_tool -i $i -link -g; done
# 网络健康检查
for i in {0..7}; do hccn_tool -i $i -net_health -g; done
# 查看检测到的IP配置
for i in {0..7}; do hccn_tool -i $i -netdetect -g; done
# 查看网关配置
for i in {0..7}; do hccn_tool -i $i -gateway -g; done
# 查看 NPU 网络配置文件
cat /etc/hccn.conf

7.2 获取 NPU IP

获取 NPU IP :用 hccn_tool -ip -g 获取各 NPU IP 地址:

bash 复制代码
for i in {0..7}; do hccn_tool -i $i -ip -g | grep ipaddr; done

7.3 跨节点NPU 网络测试

跨节点网络测试 :在任一节点上用 hccn_tool -ping 测试与另一节点的连通性:

css 复制代码
hccn_tool -i 0 -ping -g address <对方NPU_IP>

八、部署DeepSeek-V3.1-Terminus 模型

8.1 W4A8 量化版部署

为了降低部署门槛,我们先使用 GPUStack快速上手部署,通过少量 UI 配置快速高效。

1、在节点1启动 Server 与内置 Worker:

bash 复制代码
docker run -d --name gpustack \
    --restart=unless-stopped \
    --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/dcmi:/usr/local/dcmi \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \
    -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware:ro \
    -v /etc/hccn.conf:/etc/hccn.conf:ro \
    -v /etc/ascend_install.info:/etc/ascend_install.info:ro \
    -v /mnt/data/app_data/gpustack/:/var/lib/gpustack \
    -v /mnt/data/model:/data/models \
    -v /etc/localtime:/etc/localtime:ro \
    --shm-size=500g \
    --network=host \
    --ipc=host \
    --env TZ="Asia/Shanghai" \
    crpi-thyzhdzt86bexebt.cn-hangzhou.personal.cr.aliyuncs.com/gpustack_ai/gpustack:v0.7.1-npu-vllm-v0.9.1 \
    --cache-dir /data/models \
    --port 8888

启动命令假设提前下载好的模型的存储路径,包括后续通过 GPUStack 联网搜索 Hugging Face/ModelScope 下载的模型存储路径均为 /data/models,可按实际修改,多节点需要统一路径

查看容器日志确认 GPUStack 是否已正常运行:

复制代码
docker logs -f gpustack

若容器日志显示服务启动正常,使用以下命令获取 GPUStack 控制台的初始登录密码和用于其它节点加入 GPUStack 的认证 Token:

bash 复制代码
docker exec -it gpustack cat /var/lib/gpustack/initial_admin_password
docker exec gpustack cat /var/lib/gpustack/token

2、在其它节点启动 Worker 并注册到节点1的 GPUStack,按实际修改 --server-url--token

bash 复制代码
docker run -d --name gpustack \
    --restart=unless-stopped \
    --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/dcmi:/usr/local/dcmi \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \
    -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware:ro \
    -v /etc/hccn.conf:/etc/hccn.conf:ro \
    -v /etc/ascend_install.info:/etc/ascend_install.info:ro \
    -v /mnt/data/app_data/gpustack/:/var/lib/gpustack \
    -v /mnt/data/model:/data/models \
    -v /etc/localtime:/etc/localtime:ro \
    --shm-size=500g \
    --network=host \
    --ipc=host \
    --env TZ="Asia/Shanghai" \
    crpi-thyzhdzt86bexebt.cn-hangzhou.personal.cr.aliyuncs.com/gpustack_ai/gpustack:v0.7.1-npu-vllm-v0.9.1 \
    --cache-dir /data/models \
    --server-url http://<节点1的 GPUStack URL 内网地址> \
    --token <从节点1获得的认证 Token>

(1) 启动命令假设提前下载好的模型的存储路径,包括后续通过 GPUStack 联网搜索 Hugging Face/ModelScope 下载的模型存储路径均为 /data/models,可按实际修改,多节点需要统一路径

(2) http://<节点1的 GPUStack URL 地址> 表示 GPUStack 的访问地址,默认为节点1的 IP 地址 + 80 端口

(3) <从节点1获得的认证 Token> 为在节点1通过 docker exec gpustack cat /var/lib/gpustack/token 命令获得的认证 Token

在浏览器中通过节点1的 IP 访问 GPUStack 控制台(http://HOST_IP),使用默认用户名 admin 和前面获取的初始密码登录。登录 GPUStack 后,在资源菜单可查看识别到的昇腾节点和 NPU 资源:

在菜单栏中点击部署 ,选择部署模型 - 本地路径,接下来:

  • 名称中输入自定义的模型名称,例如:DeepSeek-V3.1-Terminus
  • 模型路径 指定为提前下载并已挂载到容器中的 DeepSeek-V3.1-Terminus-w4a8 模型的绝对路径
  • 后端 中选择 Ascend MindIE

调度方式选择手动,在GPU 选择器中选择8张NPU 即可:

接着展开高级设置,配置以下后端参数:

ini 复制代码
--data-parallel-size=1
--tensor-parallel-size=8
--moe-tensor-parallel-size=1
--moe-expert-parallel-size=8
--npu-memory-fraction=0.95

确认兼容性检查通过后,保存部署:

GPUStack 会自动处理 MindIE 的分布式推理部署,包括设置环境变量、自动生成 config.jsonranktable 配置文件、启动多机 MindIE Service Daemon 服务等等,可以将鼠标移动到 Distributed Across Workers 查看多节点资源分配情况,在右侧的操作中可以查看 MindIE 主节点的启动日志,正常启动模型需要几分钟到十几分钟:

如果启动异常但未在 MindIE 主节点 的启动日志中发现报错,可以进一步排查从节点日志 。方法是进入其他服务器节点的 GPUStack 容器,打开以下路径,检查对应的 MindIE 从节点日志是否存在异常:

bash 复制代码
cd /var/lib/gpustack/log/serve/

如果部署顺利,MindIE 分布式推理服务 会正常启动,模型能够成功运行。在 Workers 列表 中,可以看到资源使用情况,其中 NPU 显存占用率约为 95%,表明多台昇腾节点的 NPU 资源已被充分利用:

模型部署成功并运行后 ,即可在 GPUStack 试验场中对其进行测试。

进入试验场 - 对话页面:

  • 若仅部署了一个模型,系统会默认选中该模型
  • 若部署了多个模型,则可在右侧模型选项,下拉手动选择 DeepSeek-V3.1-Terminus

随后,输入提示词,即可与模型进行交互,测试模型的生成效果与推理性能:

8.2 W8A8 量化版部署

分别在每台节点上运行以下脚本:

bash 复制代码
export IMAGE="m.daocloud.io/quay.io/ascend/vllm-ascend:v0.11.0rc0"
export NAME="vllm-ascend"

# 先删旧容器(忽略不存在的错误)
docker rm -f "$NAME" 2>/dev/null || true

docker run \
  --name "$NAME" \
  --net=host \
  --shm-size=64g \
  --ulimit memlock=-1:-1 \
  --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/dcmi:/usr/local/dcmi \
  -v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
  -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
  -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
  -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
  -v /etc/ascend_install.info:/etc/ascend_install.info \
  -v /mnt/data/model:/root/.cache \
  --restart unless-stopped \
  -d "$IMAGE" tail -f /dev/null

假设量化好的模型存储的模型路径存储在/mnt/data/model下,多节点需要统一路径,后续进入容器通过/root/.cache 目录访问量化好的模型即可

实时看日志:

bash 复制代码
# 实时看日志
docker logs -f vllm-ascend

节点0

通过如下命令进入docker 容器:

bash 复制代码
# 进入容器
docker exec -it vllm-ascend bash

# 查看模型文件是否存在
ls /root/.cache/DeepSeek-V3.1-Terminus-w8a8

进入容器执行如下命令,记得替换ip和网卡名称等信息:

ini 复制代码
#!/usr/bin/env bash
set -euo pipefail

# NIC/IP
# ip和网卡名称通过ifconfig命令获取
nic_name="xxxx"
local_ip="xxxx"

# 模型路径(容器内)
MODEL_DIR="/root/.cache/DeepSeek-V3.1-Terminus-w8a8"

export VLLM_USE_MODELSCOPE=True
export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=100
export HCCL_BUFFSIZE=1024

vllm serve  "${MODEL_DIR}" \
--host 0.0.0.0 \
--port 8005 \
--data-parallel-size 4 \
--data-parallel-size-local 2 \
--data-parallel-address $local_ip \
--data-parallel-rpc-port 12388 \
--tensor-parallel-size 4 \
--seed 1024 \
--served-model-name deepseek_v3.1 \
--enable-expert-parallel \
--max-num-seqs 16 \
--max-model-len 8192 \
--quantization ascend \
--max-num-batched-tokens 4096 \
--trust-remote-code \
--no-enable-prefix-caching \
--gpu-memory-utilization 0.95 \
--additional-config '{"ascend_scheduler_config":{"enabled":false},"torchair_graph_config":{"enabled":true}}'

节点1

通过如下命令进入docker 容器:

bash 复制代码
# 进入容器
docker exec -it vllm-ascend bash

# 查看模型文件是否存在
ls /root/.cache/DeepSeek-V3.1-Terminus-w8a8

进入容器执行如下命令,记得替换ip和网卡名称以及节点0 的内网IP等信息:

ini 复制代码
#!/usr/bin/env bash
set -euo pipefail

# ip和网卡名称通过ifconfig命令获取
nic_name="xxxx"
local_ip="xxxx"

# 模型路径(容器内)
MODEL_DIR="/root/.cache/DeepSeek-V3.1-Terminus-w8a8"

export VLLM_USE_MODELSCOPE=True
export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=100
export VLLM_USE_V1=1
export HCCL_BUFFSIZE=1024

  
vllm serve "${MODEL_DIR}" \
--host 0.0.0.0 \
--port 8005 \
--headless \
--data-parallel-size 4 \
--data-parallel-size-local 2 \
--data-parallel-start-rank 2 \
--data-parallel-address { node0 ip } \
--data-parallel-rpc-port 12388 \
--tensor-parallel-size 4 \
--seed 1024 \
--quantization ascend \
--served-model-name DeepSeek-V3.1-Terminus \
--max-num-seqs 16 \
--max-model-len 8192 \
--max-num-batched-tokens 4096 \
--enable-expert-parallel \
--trust-remote-code \
--no-enable-prefix-caching \
--gpu-memory-utilization 0.95 \
--additional-config '{"ascend_scheduler_config":{"enabled":false},"torchair_graph_config":{"enabled":true}}'

流式测试:

arduino 复制代码
curl -N http://127.0.0.1:8005/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
        "model": "DeepSeek-V3.1-Terminus",
        "messages":[{"role":"user","content":"写一首四句七言绝句,题目:秋夜"}],
        "stream": true,
        "temperature": 0.6,
        "top_p": 0.95,
        "max_tokens": 128
      }'

九、部署 DeepSeek-V3.2-Exp

9.1 W8A8 量化版部署

分别在每台节点上运行以下脚本:

bash 复制代码
# 镜像 & 容器名
export IMAGE="quay.nju.edu.cn/ascend/vllm-ascend:v0.11.0rc0-deepseek-v3.2-exp"
export NAME="vllm-ascend"

# 如存在旧容器,先停掉并删除(可选)
docker rm -f "$NAME" 2>/dev/null || true

docker run \
  --name "$NAME" \
  --net=host \
  --shm-size=64g \
  --ulimit memlock=-1:-1 \
  --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/dcmi:/usr/local/dcmi \
  -v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
  -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
  -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
  -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
  -v /etc/ascend_install.info:/etc/ascend_install.info \
  -v /mnt/data/model:/root/.cache \
  --restart unless-stopped \
  -d "$IMAGE" tail -f /dev/null

假设量化好的模型存储的模型路径存储在/mnt/data/model下,多节点需要统一路径,后续进入容器通过/root/.cache 目录访问量化好的模型即可

实时看日志:

bash 复制代码
# 实时看日志
docker logs -f vllm-ascend

节点0

通过如下命令进入docker 容器:

bash 复制代码
# 进入容器
docker exec -it vllm-ascend bash

# 查看模型文件是否存在
ls /root/.cache/DeepSeek-V3.1-Terminus-w8a8

进入容器执行如下命令,记得替换ip和网卡名称等信息:

ini 复制代码
#!/bin/sh
# ip和网卡名称通过ifconfig命令获取
nic_name="xxxx"
local_ip="[节点0内网IP]"

# 模型路径(容器内)
MODEL_DIR="/root/.cache/DeepSeek-V3.2-Exp-w8a8"

# 环境
export VLLM_USE_MODELSCOPE=true
export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=100
export HCCL_BUFFSIZE=1024
export HCCL_OP_EXPANSION_MODE="AIV"
export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"

# 启动 vLLM(DP=2,TP=8,W8A8 必要环境与图模式配置)
vllm serve "${MODEL_DIR}" \
  --host 0.0.0.0 \
  --port 8000 \
  --data-parallel-size 2 \
  --data-parallel-size-local 1 \
  --data-parallel-address $local_ip \
  --data-parallel-rpc-port 13389 \
  --tensor-parallel-size 8 \
  --seed 1024 \
  --served-model-name DeepSeek-V3.2-Exp \
  --enable-expert-parallel \
  --max-num-seqs 16 \
  --max-model-len 17450 \
  --max-num-batched-tokens 17450 \
  --trust-remote-code \
  --quantization ascend \
  --no-enable-prefix-caching \
  --gpu-memory-utilization 0.9 \
  --additional-config '{"ascend_scheduler_config":{"enabled":true},"torchair_graph_config":{"enabled":true,"graph_batch_sizes":[16]}}'

节点1

通过如下命令进入docker 容器:

bash 复制代码
# 进入容器
docker exec -it vllm-ascend bash

# 查看模型文件是否存在
ls /root/.cache/DeepSeek-V3.1-Terminus-w8a8

进入容器执行如下命令,记得替换ip和网卡名称以及节点0 的内网IP等信息:

ini 复制代码
#!/bin/sh

# ip和网卡名称通过ifconfig命令获取
nic_name="xxxx"
local_ip="[节点1内网IP]"

# 模型路径(容器内)
MODEL_DIR="/root/.cache/DeepSeek-V3.2-Exp-w8a8"

# 环境
export VLLM_USE_MODELSCOPE=true
export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=100
export HCCL_BUFFSIZE=1024
export HCCL_OP_EXPANSION_MODE="AIV"
export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"

# 启动 vLLM(从节点 headless,rank=1,指向 node0)
vllm serve "${MODEL_DIR}" \
  --host 0.0.0.0 \
  --port 8000 \
  --headless \
  --data-parallel-size 2 \
  --data-parallel-size-local 1 \
  --data-parallel-start-rank 1 \
  --data-parallel-address [节点0内网IP] \
  --data-parallel-rpc-port 13389 \
  --tensor-parallel-size 8 \
  --seed 1024 \
  --served-model-name DeepSeek-V3.2-Exp \
  --max-num-seqs 16 \
  --max-model-len 17450 \
  --max-num-batched-tokens 17450 \
  --enable-expert-parallel \
  --trust-remote-code \
  --quantization ascend \
  --no-enable-prefix-caching \
  --gpu-memory-utilization 0.92 \
  --additional-config '{"ascend_scheduler_config":{"enabled":true},"torchair_graph_config":{"enabled":true,"graph_batch_sizes":[16]}}'

测试如下:

arduino 复制代码
curl http://[节点0内网IP]:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer EMPTY" \
  -d '{
    "model": "DeepSeek-V3.2-Exp",
    "messages": [{"role":"user","content":"你好,现在的并行拓扑是怎样的?"}],
    "max_tokens": 64,
    "temperature": 0.6,
    "top_p": 0.95
  }'

小结

如果有问题,欢迎在评论区留言,我会及时回复,也可以去昇腾官方提交工单咨询官方人员。

今天的教程就到这里,希望对你有所帮助,有用记得点个赞奥!

相关推荐
苏三的开发日记7 分钟前
windows系统搭建kafka环境
后端
爬山算法17 分钟前
Netty(19)Netty的性能优化手段有哪些?
java·后端
Tony Bai18 分钟前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
想用offer打牌31 分钟前
虚拟内存与寻址方式解析(面试版)
java·后端·面试·系统架构
無量35 分钟前
AQS抽象队列同步器原理与应用
后端
9号达人1 小时前
支付成功订单却没了?MyBatis连接池的坑我踩了
java·后端·面试
用户497357337981 小时前
【轻松掌握通信协议】C#的通信过程与协议实操 | 2024全新
后端
草莓熊Lotso1 小时前
C++11 核心精髓:类新功能、lambda与包装器实战
开发语言·c++·人工智能·经验分享·后端·nginx·asp.net
追逐时光者2 小时前
精选 8 个 .NET 开发实用的类库,效率提升利器!
后端·.net
a程序小傲2 小时前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·后端·postgresql·面试·职场和发展