华为 A800I A2 昇腾 910B NPU 大模型推理部署
华为 A800I A2 昇腾 910B NPU 大模型推理部署
华为 A800I A2 昇腾 910B NPU 大模型推理部署手册
- 服务器型号:华为 A800I A2
- 芯片:昇腾 910B4(8卡,每卡 32GB HBM,共 256GB)
- 操作系统:openEuler 24.03 LTS SP3(aarch64)
- 驱动版本:25.5.2
- 固件版本:7.8.0.7.220
- 推理框架:vLLM-Ascend v0.18.0
- 部署模型:Qwen/Qwen3.6-35B-A3B
- 记录日期:2026-07-04
文档说明
本文档记录在华为 A800I A2(昇腾 910B NPU)服务器上,从零开始完成大模型推理服务部署的完整流程,包括:
- NPU 驱动和固件安装
- Docker 离线安装
- Docker Compose 离线安装
- 模型文件下载(Qwen3.6-35B-A3B)
- vLLM-Ascend 推理框架部署
名词说明
本文档涉及华为昇腾生态相关名词,统一说明如下:
| 名词 | 说明 |
|---|---|
| Ascend / 昇腾 | 同一个东西,Ascend 是昇腾的英文品牌名,华为 AI 芯片产品线 |
| 910B / 910B4 | 昇腾 910 系列第四代 NPU 芯片,A800I A2 服务器搭载 |
| NPU | Neural Processing Unit,神经网络处理器,类比 NVIDIA 的 GPU |
| HBM | High Bandwidth Memory,NPU 上的高速显存,910B4 每卡 32GB |
| vLLM-Ascend | vLLM 推理框架的昇腾适配版,quay.io/ascend/vllm-ascend |
| torch_npu | 华为昇腾的 PyTorch 插件,让 PyTorch 能在 NPU 上运行 |
| HCCL | HuaWei Collective Communication Library,华为多卡通信库,类比 NVIDIA 的 NCCL |
| DCMI | Device Communication Management Interface,NPU 设备管理接口 |
| HwHiAiUser | 设备节点所属用户组(HiSilicon AI User),华为海思 AI 用户组 |
| iBMA | 华为服务器带外管理界面,可远程挂载 ISO、控制电源 |
| HCCN | HuaWei Collective Communication Network,NPU 网络配置 |
| CANN | Compute Architecture for Neural Networks,华为昇腾异构计算架构,包含驱动、固件、算子库、通信库等整套软件栈,torch_npu / HCCL 都属于 CANN 的组成部分 |
环境变量来源说明:
部署配置中的环境变量不在模型页面(modelscope/huggingface 只放调用示例),查找方式如下:
| 前缀 | 所属库 | 查找位置 |
|---|---|---|
VLLM_* |
vLLM / vLLM-Ascend | vllm-ascend.readthedocs.io 或启动报错信息 |
PYTORCH_NPU_* |
torch_npu(华为 PyTorch 昇腾插件) | CANN 社区版文档 → 参考 → 环境变量参考 |
HCCL_* |
HCCL 多卡通信库 | CANN 社区版文档 → 参考 → 环境变量参考 |
CANN 社区版环境变量参考文档直达链接(9.0 版本):https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/900/maintenref/envvar/envref_07_0001.html
注意:URL 中
900对应 CANN 9.0,可在页面右上角切换版本,选与驱动版本匹配的(本机驱动 25.5.2)。
三个前缀来自三个不同的库,不在同一个文档里:VLLM_* 在 vllm-ascend,其余两个在 CANN 文档。
零、安装包与资源清单
部署前需准备以下文件,服务器无外网时需在有网环境提前下载后上传:
| 类别 | 文件 | 获取方式 |
|---|---|---|
| NPU 驱动 | Ascend-hdk-910b-npu-driver-25.5.2-1.aarch64.rpm |
hiascend.com/hardware/firmware-drivers/community |
| NPU 固件 | Ascend-hdk-910b-npu-firmware-7.8.0.7.220-1.noarch.rpm |
hiascend.com/hardware/firmware-drivers/community |
| 系统 ISO | openEuler-24.03-LTS-SP3-aarch64-dvd.iso |
openeuler.org/zh/download/ |
| Docker | docker-27.5.1.tgz(aarch64) |
download.docker.com/linux/static/stable/aarch64/ |
| Docker Compose | docker-compose-linux-aarch64 |
github.com/docker/compose/releases |
| 推理框架镜像 | vllm-ascend-v0.18.0-aarch64.tar |
quay.io/ascend/vllm-ascend:v0.18.0 |
| 模型文件 | Qwen3.6-35B-A3B(约 67GB) |
modelscope.cn/models/Qwen/Qwen3.6-35B-A3B |
一、安装包准备
| 文件 | 说明 |
|---|---|
Ascend-hdk-910b-npu-driver-25.5.2-1.aarch64.rpm |
NPU 驱动,版本 25.5.2 |
Ascend-hdk-910b-npu-firmware-7.8.0.7.220-1.noarch.rpm |
NPU 固件,版本 7.8.0.7.220 |
注意:安装顺序必须是先驱动后固件,否则报错
Please Setup Driver RPM First。
二、系统版本说明
驱动 25.5.2 适配 openEuler 24.03 LTS SP3(内核 6.6.0-132.x.oe2403sp3)。
不要使用 openEuler 24.03 LTS SP4(内核 6.6.0-159.x),SP4 内核与驱动预置的闭源二进制模块不兼容,会导致 ts_agent、ascend_dms_mng 等关键模块无法加载。
SP3 ISO 下载:openeuler.org/zh/download/,选择 aarch64 服务器版:
openEuler-24.03-LTS-SP3-aarch64-dvd.iso
三、安装编译工具链
驱动安装需要编译环境。服务器无外网,通过 iBMA 挂载 ISO 作为本地 yum 源安装。
3.1 通过 iBMA 挂载 ISO
- 浏览器登录 iBMA 带外管理地址
- 进入 远程控制 → 虚拟介质 → CD/DVD
- 选择本地 openEuler-24.03-LTS-SP3 ISO 文件挂载
3.2 配置本地 yum 源
mount /dev/sr0 /mnt
# 备份原有 repo,避免联网失败报错
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
cat > /etc/yum.repos.d/local.repo << 'EOF'
[local]
name=openEuler Local ISO
baseurl=file:///mnt
enabled=1
gpgcheck=0
EOF
3.3 安装编译工具
yum install -y gcc gcc-c++ kernel-devel kernel-headers make
四、安装 NPU 驱动
注意:安装顺序必须是先驱动后固件,反过来会报错
Please Setup Driver RPM First。
rpm -ivh Ascend-hdk-910b-npu-driver-25.5.2-1.aarch64.rpm
安装成功后输出示例:
[Driver] [INFO]driver install type: Rebuild
[Driver] [INFO]Driver install successfully!
卸载驱动后必须重启:
rpm -e Ascend910B-driver后需执行reboot,否则卸载不生效。
五、安装 NPU 固件
驱动安装完成后再装固件:
rpm -ivh Ascend-hdk-910b-npu-firmware-7.8.0.7.220-1.noarch.rpm
六、验证
# 检查设备节点
ls /dev/davinci*
# 查看 NPU 状态
npu-smi info
正常输出示例(8卡 910B4):
+------------------------------------------------------------------------------------------------+
| npu-smi 25.5.2 Version: 25.5.2 |
+---------------------------+---------------+----------------------------------------------------+
| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page)|
| Chip | Bus-Id | AICore(%) Memory-Usage(MB) HBM-Usage(MB) |
+===========================+===============+====================================================+
| 0 910B4 | OK | 83.4 32 0 / 0 |
| 0 | 0000:C1:00.0 | 0 0 / 0 2659 / 32768 |
+===========================+===============+====================================================+
...(共8卡)
- Health 全部为 OK 表示正常
- 每卡 HBM 32768MB(32GB),8卡共 256GB
- 空载温度 32-37°C,功耗 78-87W 为正常范围
七、安装 Docker
7.1 解压安装
cd /root
tar -zxvf docker-27.5.1.tgz
cp docker/* /usr/local/bin/
7.2 配置 systemd 服务
cat > /etc/systemd/system/docker.service << 'EOF'
[Unit]
Description=Docker Application Container Engine
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=2
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable docker
systemctl start docker
7.3 验证
docker version
安装成功版本信息:
- Docker 版本:27.5.1
- OS/Arch:linux/arm64
- containerd:v1.7.25
八、安装 Docker Compose
8.1 两种命令的区别
| 命令 | 说明 |
|---|---|
docker-compose |
独立二进制,老版本(v1),放到 PATH 下即可用,如 /usr/local/bin/docker-compose |
docker compose |
Docker CLI 插件方式(v2),是 docker 命令的子命令,需放到 Docker 的 CLI plugins 目录 |
本文使用 docker compose(插件方式,v2),与新版 Docker 集成更好,语法一致,推荐使用。
8.2 确定 CLI plugins 目录
docker compose 插件目录的位置取决于 Docker 二进制装在哪,规则是:
Docker 二进制路径:/usr/local/bin/docker
↓
对应 plugins 目录:/usr/local/lib/docker/cli-plugins/
即将 bin 换成 lib,再加上 docker/cli-plugins/。通过 which docker 确认:
which docker
# 输出示例:/usr/local/bin/docker
# 则 plugins 目录为:/usr/local/lib/docker/cli-plugins/
也可以直接查 Docker 支持的 plugins 搜索路径:
docker info | grep -A5 "Plugins"
# 输出示例:
# Plugins:
# compose: Docker Compose (Docker Inc.)
# Version: v2.32.4
# Path: /usr/local/lib/docker/cli-plugins/docker-compose
#
# Server:
# --
# Plugins:
# Volume: local
# Network: bridge host ipvlan macvlan null overlay
# Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
# Swarm: inactive
# Runtimes: io.containerd.runc.v2 runc
Path 字段直接告诉你 docker-compose 当前放在哪,安装时放到这个路径即可。
8.3 安装 docker-compose 插件
确认好目录后,将 docker-compose 二进制放进去并赋可执行权限:
mkdir -p /usr/local/lib/docker/cli-plugins
cp docker-compose-linux-aarch64 /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
# 验证
docker compose version
放对目录后,docker compose 就可以用了,无需改 PATH。
注意:如果 Docker 被其他软件替换过,
which docker结果可能变化,要重新确认 plugins 目录再放。
2. Docker Root Dir(镜像、容器、overlay 数据存储位置)
docker info | grep "Docker Root Dir"
# 默认输出:
# Docker Root Dir: /var/lib/docker
Root Dir 可能被修改(如通过 daemon.json 的 data-root 字段),排查磁盘占用时先确认实际路径。
Root Dir 下的目录结构:
{Docker Root Dir}/
├── overlay2/ # 镜像和容器的实际文件数据,占用空间最大,vLLM 镜像 ~20GB 在这里
│ ├── <layer-hash>/
│ │ └── diff/ # 每个镜像层的实际文件内容
│ └── l/ # 短链接,指向各层 diff/
├── image/ # 镜像元数据(层信息、配置 JSON),体积小
│ └── overlay2/
│ ├── imagedb/
│ └── layerdb/
├── containers/ # 容器元数据和日志(每个容器按 ID 命名的子目录)
│ └── <id>/
│ └── *-json.log # 容器日志,默认不限大小,长期运行会涨
├── volumes/ # docker volume 数据卷,容器删了数据还在
├── network/ # 网络配置
├── plugins/ # docker 插件数据
└── tmp/
Root Dir 被改为新路径后,新目录是空的,旧镜像数据还留在原路径的
overlay2/里,
镜像会看起来"消失"。恢复方法:停止 Docker,将旧目录内容 mv 到新路径,再启动 Docker。
九、下载模型文件(Qwen3.6-35B-A3B)
模型地址:https://www.modelscope.cn/models/Qwen/Qwen3.6-35B-A3B
模型大小约 67GB,包含 26 个 safetensors 分片文件。
下载前:修改缓存目录
modelscope 默认将模型缓存到 /root/.cache,该目录通常在根分区。根分区空间有限,下载前必须将缓存路径改到大分区,否则 67GB 模型会把根分区占满。
# 永久修改 modelscope 缓存路径(写入 /etc/profile 全局生效)
echo 'export MODELSCOPE_CACHE=/home/.cache/modelscope' >> /etc/profile
source /etc/profile
# 验证
echo $MODELSCOPE_CACHE
# 输出:/home/.cache/modelscope
同理,如果使用 huggingface 下载:
echo 'export HF_HOME=/home/.cache/huggingface' >> /etc/profile
source /etc/profile
改完环境变量后,后续所有 modelscope/huggingface 操作都自动走大分区,无需每次手动指定路径。
也可以在下载时用--local_dir临时指定,但不如改环境变量一劳永逸。
方式一:有外网环境,服务器直接下载(推荐)
使用 modelscope CLI 下载,支持断点续传:
# 安装 modelscope
pip3 install modelscope
# 下载模型到 /home/.cache 目录(vLLM 默认读取路径)
modelscope download --model Qwen/Qwen3.6-35B-A3B \
--local_dir /home/.cache/modelscope/models/Qwen--Qwen3.6-35B-A3B/snapshots/master
也可以用 git clone(需要 git-lfs):
# 安装 git-lfs
yum install -y git-lfs
git lfs install
# 克隆模型
GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/Qwen/Qwen3.6-35B-A3B.git \
/home/.cache/modelscope/models/Qwen--Qwen3.6-35B-A3B/snapshots/master
cd /home/.cache/modelscope/models/Qwen--Qwen3.6-35B-A3B/snapshots/master
git lfs pull
方式二:有外网的 PC 下载后上传服务器(本次实际方式)
在有外网的机器上下载完整模型目录,然后 scp 上传:
# 在有网环境下载
pip3 install modelscope
modelscope download --model Qwen/Qwen3.6-35B-A3B --local_dir ./Qwen3.6-35B-A3B
# 上传到服务器(约 67GB,视网速决定时间)
scp -r ./Qwen3.6-35B-A3B root@172.16.3.9:/home/.cache/modelscope/models/Qwen--Qwen3.6-35B-A3B/snapshots/master
验证模型文件完整性
# 查看模型目录结构
ls /home/.cache/modelscope/models/Qwen--Qwen3.6-35B-A3B/snapshots/master/
# 应包含 26 个 safetensors 分片
ls /home/.cache/modelscope/models/Qwen--Qwen3.6-35B-A3B/snapshots/master/*.safetensors | wc -l
# 输出:26
# 查看总大小
du -sh /home/.cache/modelscope/models/Qwen--Qwen3.6-35B-A3B/
# 约 67GB
十、部署 vLLM-Ascend 推理服务
10.1 加载镜像
docker load -i vllm-ascend-v0.18.0-aarch64.tar
docker images
# 镜像名:quay.io/ascend/vllm-ascend:v0.18.0
10.2 docker-compose.yml 配置说明
在运行推理服务之前,需要理解配置文件各项的含义,出问题时才知道从哪里排查。
确认设备节点(填写 devices 前先执行):
ls /dev/davinci*
ls -l /dev/devmm_svm /dev/hisi_hdc
正常输出(8卡 910B):
/dev/davinci0 ~ /dev/davinci7 # 8张 NPU 计算卡,主设备号 237
/dev/davinci_manager # NPU 管理接口,主设备号 238
/dev/devmm_svm # 统一内存管理,主设备号 236
/dev/hisi_hdc # CPU↔NPU 数据通道,主设备号 235
注意:devices 里填的是设备文件名(如
/dev/devmm_svm),不是主设备号。
主设备号由内核动态分配,不同系统可能不同,不用关心。
所有 910B 系列装完驱动设备名都一样,可以直接照抄。
如果换其他昇腾型号(如 310P),先ls /dev/davinci* /dev/devmm* /dev/hisi*确认。
创建工作目录:
mkdir -p /home/maokaiyin/vllm
完整配置文件 /home/maokaiyin/vllm/docker-compose.yml:
version: '3'
services:
vllm-qwen:
image: quay.io/ascend/vllm-ascend:v0.18.0
container_name: vllm-qwen
network_mode: host # 直接使用宿主机网络,NPU HCCL 多卡通信需要 host 模式
shm_size: '128g' # 共享内存,8卡并行进程间通信需要大共享内存,默认 64MB 不够
restart: always # 容器异常退出后自动重启
# 将宿主机 NPU 设备节点映射进容器
# devices 填设备文件名,有几张卡写几个 davinci,后三个固定写
devices:
- /dev/davinci0 # NPU 卡0
- /dev/davinci1 # NPU 卡1
- /dev/davinci2 # NPU 卡2
- /dev/davinci3 # NPU 卡3
- /dev/davinci4 # NPU 卡4
- /dev/davinci5 # NPU 卡5
- /dev/davinci6 # NPU 卡6
- /dev/davinci7 # NPU 卡7
- /dev/davinci_manager # NPU 管理接口(npu-smi 依赖)
- /dev/devmm_svm # CPU/NPU 统一虚拟内存,张量分配走这里
- /dev/hisi_hdc # Host-Device Communication,数据传输通道
# 将宿主机 NPU 驱动运行时文件挂载进容器
# 容器内没有安装驱动,需要从宿主机挂载进来才能调用 NPU
volumes:
- /usr/local/dcmi:/usr/local/dcmi # DCMI 管理库
- /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool # 网络配置工具
- /usr/local/bin/npu-smi:/usr/local/bin/npu-smi # npu-smi 工具
- /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ # 驱动动态库(核心)
- /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info # 驱动版本
- /etc/ascend_install.info:/etc/ascend_install.info # 驱动安装信息
- /etc/hccn.conf:/etc/hccn.conf # NPU 网络配置
- /home/.cache:/root/.cache # 模型文件目录
environment:
- VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 # 允许设置超长 max_model_len(否则 262144 会被拒绝)
- PYTORCH_NPU_ALLOC_CONF=max_split_size_mb:256 # 限制 NPU 内存分配块大小,减少碎片
- HCCL_OP_EXPANSION_MODE=HOST # HCCL 多卡通信走 HOST 模式,稳定性更好
# 推理服务启动命令
command: >
vllm serve /root/.cache/modelscope/models/Qwen--Qwen3.6-35B-A3B/snapshots/master
--tensor-parallel-size 8 # 8卡张量并行,与实际卡数一致
--port 8000
--max-model-len 262144 # 最大 256K token 上下文
--served-model-name Qwen/Qwen3.6-35B-A3B
--reasoning-parser qwen3 # 启用思维链解析(Qwen3 特有)
--enable-auto-tool-choice
--tool-call-parser qwen3_coder
10.3 启动服务
cd /home/maokaiyin/vllm
docker compose up -d
docker compose logs -f
启动过程说明:
- Ascend 插件加载(约10秒)
- 模型权重加载:26个分片,每卡 8.4GB,共约50秒
- NPU 图编译(torch.compile + warmup):约85秒
- CUDA graph capture(14个batch size):约1分钟
- 服务就绪:
Application startup complete.
总启动时间约 5-6 分钟。
10.4 验证
注意:chat/completions 接口必须用 POST 请求,用 GET 会返回 405 Method Not Allowed。
# 检查模型列表
curl http://localhost:8000/v1/models
# 发送测试请求(开启思维链,响应较慢)
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3.6-35B-A3B",
"messages": [{"role": "user", "content": "你好"}]
}'
# 关闭思维链(速度更快,推荐日常使用)
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3.6-35B-A3B",
"messages": [{"role": "user", "content": "你好"}],
"chat_template_kwargs": {"enable_thinking": false}
}'
思维链说明: Qwen3 默认开启 reasoning 模式,每次推理先输出思考过程再给答案。
开启时首次请求约 18 秒(NPU aclgraph 预热),后续约 5-10 秒。
关闭思维链后响应速度明显更快。
10.5 服务管理
# 停止
docker compose down
# 重启
docker compose restart
# 查看日志
docker compose logs -f
# 查看 NPU 使用情况(推理中 AICore 使用率应 >0)
npu-smi info
附:故障排查记录(SP4 兼容性问题,仅供参考)
以下为在 SP4 上安装时遇到的问题,SP3 系统不会遇到,仅作记录。
问题1:gcc 未安装
[Driver] [ERROR]gcc: command not found
原因:系统未安装编译工具链。
解决:按第三章步骤安装 gcc 等工具。
问题2:驱动编译失败 MIN redefined
/usr/local/Ascend/driver/kernel/vascend_drv/kvmdt.c:62: error: "MIN" redefined [-Werror]
原因:SP4 内核头文件与驱动源码中 MIN 宏定义冲突,-Werror 将其升级为编译错误。
临时解决(SP3 无需此操作):
sed -i 's/#define MIN(x, y) ((x) < (y) ? (x) : (y))/#ifndef MIN\n#define MIN(x, y) ((x) < (y) ? (x) : (y))\n#endif/' \
/usr/local/Ascend/driver/kernel/vascend_drv/kvmdt.c
bash /usr/local/Ascend/driver/script/run_driver_ko_rebuild.sh
问题3:闭源模块无法加载(SP4 根本问题)
SP4 内核版本为 6.6.0-159.oe2403sp4,驱动包内预置二进制 .ko(如 ascend_dms_mng、ts_agent)针对其他内核版本编译,vermagic 不匹配,导致 npu-smi info 报错:
dcmi module initialize failed. ret is -8005
根本解决:重装系统为 openEuler 24.03 LTS SP3。
更多推荐



所有评论(0)