保姆级教程!华为昇腾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
  }'

小结

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

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

相关推荐
Postkarte不想说话4 小时前
Xfce4 鼠标滚轮滚动禁止获取焦点
后端
风雨同舟的代码笔记4 小时前
Linux环境下MySQL安装教程
后端
风雨同舟的代码笔记4 小时前
Gradle 项目使用 MyBatis-Generator 自动生成代码:高效开发的利器
后端
风雨同舟的代码笔记4 小时前
DockerVS虚拟机:从架构师视角深度对比
后端
开始学java4 小时前
常用类
后端
放风筝的鸭脚木4 小时前
接口的幂等性
后端
干翻秋招4 小时前
Java知识点复习
后端·面试
Postkarte不想说话4 小时前
Cisco配置BGP
后端
小帅说java4 小时前
【Java开发】Java热门框架深入开发第11篇:学习目标,一、SpringBoot简介【附代码文档】
javascript·后端