华为 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)服务器上,从零开始完成大模型推理服务部署的完整流程,包括:

  1. NPU 驱动和固件安装
  2. Docker 离线安装
  3. Docker Compose 离线安装
  4. 模型文件下载(Qwen3.6-35B-A3B)
  5. 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_agentascend_dms_mng 等关键模块无法加载。

SP3 ISO 下载:openeuler.org/zh/download/,选择 aarch64 服务器版:

openEuler-24.03-LTS-SP3-aarch64-dvd.iso

三、安装编译工具链

驱动安装需要编译环境。服务器无外网,通过 iBMA 挂载 ISO 作为本地 yum 源安装。

3.1 通过 iBMA 挂载 ISO

  1. 浏览器登录 iBMA 带外管理地址
  2. 进入 远程控制 → 虚拟介质 → CD/DVD
  3. 选择本地 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.jsondata-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

启动过程说明:

  1. Ascend 插件加载(约10秒)
  2. 模型权重加载:26个分片,每卡 8.4GB,共约50秒
  3. NPU 图编译(torch.compile + warmup):约85秒
  4. CUDA graph capture(14个batch size):约1分钟
  5. 服务就绪: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_mngts_agent)针对其他内核版本编译,vermagic 不匹配,导致 npu-smi info 报错:

dcmi module initialize failed. ret is -8005

根本解决:重装系统为 openEuler 24.03 LTS SP3。

Logo

CANN开发者社区旨在汇聚广大开发者,围绕CANN架构重构、算子开发、部署应用优化等核心方向,展开深度交流与思想碰撞,携手共同促进CANN开放生态突破!

更多推荐