华为昇腾910B4(A2)服务器环境搭建笔记
·
1、前提:
已正确安装的昇腾 NPU 驱动(Driver)。
与驱动、硬件匹配的固件(Firmware)。
可用的 Docker 环境。
满足该版本要求的 Linux 系统和内核。
npu-smi info

这里必须区分两个概念:
- Ascend Driver(驱动):需要安装在宿主机,负责操作系统与 NPU 硬件交互。
- CANN Toolkit(计算软件栈):你的部署方案可以直接使用镜像内部预装的版本,不必重复安装到宿主机。
因此,我建议你使用官方预构建镜像,避免在宿主机上混装不同版本的 CANN、TorchNPU 和 PyTorch。


进一步查看服务器配置信息指令:
# 1. 查看 Linux 系统版本
cat /etc/os-release
# 2. 查看 CPU 架构
uname -m
# 3. 查看驱动版本信息
cat /usr/local/Ascend/driver/version.info
# 4. 查看已安装的昇腾组件
cat /etc/ascend_install.info
# 5. 查看 NPU 硬件状态
npu-smi info
# 6. 查看 NPU 设备节点
ls -l /dev/davinci* /dev/davinci_manager /dev/devmm_svm /dev/hisi_hdc
# 7. 查看 Docker 版本
docker --version
# 8. 查看 Docker 服务状态
systemctl is-active docker


1、先以部署Qwen3-0.6B 为例
1.1 拉取 vLLM Ascend 官方镜像
先设置镜像变量:
export IMAGE=quay.io/ascend/vllm-ascend:v0.30.0-openeuler
拉取镜像:
docker pull "$IMAGE"
查看镜像:
docker images | grep vllm-ascend
检查镜像架构:
docker image inspect "$IMAGE" \
--format 'OS={{.Os}} ARCH={{.Architecture}}'
预期结果:
OS=linux ARCH=arm64
成功拉取 ARM64 版本的 vLLM Ascend 0.30.0 镜像。
1.2 从魔搭社区下载 Qwen3-0.6B
我建议把模型统一存放在宿主机的 /data/models 目录中。
这样即使删除 Docker 容器,模型文件也不会丢失。
创建模型目录
mkdir -p /data/models/Qwen3-0.6B
安装ModelScope 用于下载模型
pip install modelscope
1.3 下载模型
modelscope download \
--model Qwen/Qwen3-0.6B \
--local_dir /data/models/Qwen3-0.6B
检查模型文件:
du -sh /data/models/Qwen3-0.6B
ls -lh /data/models/Qwen3-0.6B
至少应当能够看到模型配置、Tokenizer 文件和模型权重文件,例如:
config.json
generation_config.json
tokenizer.json
tokenizer_config.json
model.safetensors
模型完整保存在宿主机 /data/models/Qwen3-0.6B。
1.4启动 Ascend vLLM 容器
这里先进行单卡测试,确保容器能正确调用 NPU。
1.1.1 创建测试容器
回到宿主机 root 终端,执行:
export IMAGE=quay.io/ascend/vllm-ascend:v0.30.0-openeuler
export MODEL_DIR=/data/models/Qwen3-0.6B
docker run --rm -it \
--name qwen3-06b-test \
--shm-size=1g \
--device /dev/davinci1 \
--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/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 "$MODEL_DIR:/models/Qwen3-0.6B:ro" \
-e VLLM_WORKER_MULTIPROC_METHOD=spawn \
"$IMAGE" bash
参数说明:


1.1.2 验证容器中的 NPU 环境
进入容器后执行:
python3 - <<'PY'
import torch
import torch_npu
import vllm
import vllm_ascend
print("PyTorch:", torch.__version__)
print("vLLM:", vllm.__version__)
assert torch.npu.is_available(), "没有检测到可用的 Ascend NPU"
print("NPU count:", torch.npu.device_count())
print("vLLM Ascend environment: OK")
PY

进一步验证显卡是否可用,执行如下指令:
python3 - <<'PY'
import torch
import torch_npu
print("PyTorch:", torch.__version__)
print("TorchNPU:", torch_npu.__version__)
print("NPU available:", torch.npu.is_available())
print("NPU count:", torch.npu.device_count())
torch.npu.set_device(0)
# 在昇腾 NPU 上创建两个矩阵
a = torch.randn(4096, 4096, device="npu:0")
b = torch.randn(4096, 4096, device="npu:0")
# 执行矩阵乘法
for i in range(20):
c = torch.matmul(a, b)
# 等待 NPU 完成计算
torch.npu.synchronize()
print("A device:", a.device)
print("B device:", b.device)
print("C device:", c.device)
print("计算结果:", c[0, 0].item())
assert str(c.device) == "npu:0"
print("\nSUCCESS: Ascend NPU computation completed!")
PY

1.1.3 离线运行 Qwen3-0.6B
继续在刚才的容器内部执行。
创建测试程序
cat > /workspace/test_qwen3.py <<'PY'
from multiprocessing import freeze_support
from vllm import LLM, SamplingParams
def main():
model_path = "/models/Qwen3-0.6B"
prompts = [
"你好,请用中文介绍一下你自己。",
"人工智能未来的发展方向是什么?"
]
sampling_params = SamplingParams(
temperature=0.6,
top_k=20,
max_tokens=128
)
print("=" * 60)
print("开始加载 Qwen3-0.6B...")
print("=" * 60)
llm = LLM(
model=model_path,
tensor_parallel_size=1,
max_model_len=4096
)
print("模型加载成功,开始推理...")
outputs = llm.generate(
prompts,
sampling_params
)
for output in outputs:
print("=" * 60)
print("Prompt:", output.prompt)
print("Generated text:", output.outputs[0].text)
print("=" * 60)
print("Qwen3-0.6B 推理测试完成!")
if __name__ == "__main__":
freeze_support()
main()
PY
执行:
python3 /workspace/test_qwen3.py

模型推理成功!
1.1.4 使用vllm加载模型启动服务
vllm serve /models/Qwen3-0.6B \
--host 0.0.0.0 \
--port 8000 \
--served-model-name Qwen3-0.6B \
--tensor-parallel-size 1 \
--max-model-len 8192


模型拉起后,另起一个终端,执行访问指令
curl -X POST http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3-0.6B",
"messages": [
{
"role": "user",
"content": "你好,请用中文介绍一下你自己,并说明你能做什么。"
}
],
"temperature": 0.7,
"max_tokens": 256
}'

2、部署Qwen3.5-27B 为例
官方参考文档:
https://docs.vllm.ai/projects/ascend/zh-cn/v0.30.0/tutorials/models/Qwen3.5-27B-Qwen3.6-27B.html#42
2.1 模型下载
mkdir -p /data/models/Qwen3.5-27B
安装modelscope
pip install modelscope
下载模型:
modelscope download \
--model Qwen/Qwen3.5-27B \
--local_dir /data/models/Qwen3.5-27B
下载完成后检查:
du -sh /data/models/Qwen3.5-27B
ls -lh /data/models/Qwen3.5-27B
2.2 准备 Docker 镜像
仍然使用:
export IMAGE=quay.io/ascend/vllm-ascend:v0.30.0-openeuler
检查镜像:
docker image inspect "$IMAGE" \
--format 'Architecture={{.Architecture}}'
如果镜像不存在,再执行:
docker pull "$IMAGE"
2.3 启动四卡 BF16 模型
设置基础运行参数
先创建配置目录:
mkdir -p /data/vllm/qwen35
在命令行执行如下指令
mkdir -p /data/vllm/qwen35
cat > /data/vllm/qwen35/start.sh <<'SH'
#!/bin/bash
set -Eeuo pipefail
# ==================== 基础配置 ====================
IMAGE="quay.io/ascend/vllm-ascend:v0.30.0-openeuler"
CONTAINER="qwen35-27b-api"
MODEL="/data/models/Qwen3.5-27B"
IFACE="enp125s0f1"
# ==================== 环境检查 ====================
[[ $EUID -eq 0 ]] || { echo "请使用 root 用户"; exit 1; }
docker info >/dev/null 2>&1 || { echo "Docker 未启动"; exit 1; }
[[ -f "$MODEL/config.json" ]] || { echo "模型文件不存在"; exit 1; }
for DEV in /dev/davinci{1,2,3,4} /dev/davinci_manager /dev/devmm_svm /dev/hisi_hdc; do
[[ -e "$DEV" ]] || { echo "设备不存在:$DEV"; exit 1; }
done
for PATH_ITEM in /usr/local/dcmi /usr/local/bin/npu-smi /usr/local/Ascend/driver/lib64 /usr/local/Ascend/driver/version.info /etc/ascend_install.info; do
[[ -e "$PATH_ITEM" ]] || { echo "驱动文件不存在:$PATH_ITEM"; exit 1; }
done
ip -o link show "$IFACE" | grep -qE '<[^>]*UP([,>])' || { echo "网卡未启动"; exit 1; }
ip -o -4 addr show "$IFACE" | grep -q '10.10.1.246/' || { echo "网卡 IP 不匹配"; exit 1; }
ss -lntH | awk '$4 ~ /:8001$/ {found=1} END {exit !found}' && { echo "8001 端口已占用"; exit 1; }
docker image inspect "$IMAGE" >/dev/null 2>&1 || { echo "Docker 镜像不存在"; exit 1; }
docker container inspect "$CONTAINER" >/dev/null 2>&1 && { echo "旧容器已存在,请先检查并删除"; exit 1; }
echo "[INFO] 环境检查通过,准备启动模型"
# ==================== 可选 HCCL 工具 ====================
HCCN_MOUNT=()
if [[ -e /usr/local/Ascend/driver/tools/hccn_tool ]]; then
HCCN_MOUNT=(-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool)
fi
# ==================== 启动模型 ====================
docker run -d \
--name "$CONTAINER" \
--restart unless-stopped \
--network host \
--shm-size=8g \
\
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci4 \
--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/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 \
"${HCCN_MOUNT[@]}" \
-v /root/.cache:/root/.cache \
-v "$MODEL:/models/Qwen3.5-27B:ro" \
\
-e VLLM_WORKER_MULTIPROC_METHOD=spawn \
-e VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=3000 \
-e PYTORCH_NPU_ALLOC_CONF=expandable_segments:True \
-e HCCL_BUFFSIZE=512 \
-e HCCL_SOCKET_FAMILY=AF_INET \
-e "HCCL_SOCKET_IFNAME==${IFACE}" \
-e "GLOO_SOCKET_IFNAME=${IFACE}" \
-e "TP_SOCKET_IFNAME=${IFACE}" \
-e HCCL_HOST_IP=10.10.1.246 \
\
"$IMAGE" bash -lc '
set -Eeuo pipefail
unset HCCL_IF_IP || true
python3 -c "
import torch
import torch_npu
print(\"NPU available:\", torch.npu.is_available())
print(\"NPU count:\", torch.npu.device_count())
assert torch.npu.is_available()
assert torch.npu.device_count() == 4
"
exec vllm serve /models/Qwen3.5-27B \
--host 0.0.0.0 \
--port 8001 \
--served-model-name Qwen3.5-27B \
--tensor-parallel-size 4 \
--data-parallel-size 1 \
--dtype bfloat16 \
--max-model-len 16384 \
--max-num-seqs 128 \
--max-num-batched-tokens 2048 \
--gpu-memory-utilization 0.85 \
--trust-remote-code \
--reasoning-parser qwen3 \
--mm-processor-cache-gb 0
'
echo
echo "[INFO] Qwen3.5-27B 容器启动命令已提交"
echo "容器:$CONTAINER"
echo "API:http://服务器IP:8001"
echo "日志:docker logs -f $CONTAINER"
SH
chmod +x /data/vllm/qwen35/start.sh
给脚本添加执行权限:
chmod +x /data/vllm/qwen35/start.sh
执行:
bash /data/vllm/qwen35/start.sh
2.4 查看启动日志
docker logs -f qwen35-27b-api

2.5 测试中文对话
Qwen3.5 默认支持思考模式。首次测试建议关闭思考模式,更容易判断模型是否成功回答。
curl -sS http://127.0.0.1:8001/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3.5-27B",
"messages": [
{
"role": "user",
"content": "你好,请用中文介绍一下昇腾NPU,以及它在大模型推理中的作用。"
}
],
"temperature": 0.7,
"max_tokens": 512,
"chat_template_kwargs": {
"enable_thinking": false
}
}'
思考模式:
curl -sS http://127.0.0.1:8001/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3.5-27B",
"messages": [
{
"role": "user",
"content": "你好,请用中文介绍一下昇腾NPU,以及它在大模型推理中的作用。"
}
],
"temperature": 0.7,
"max_tokens": 15642,
"chat_template_kwargs": {
"enable_thinking": true
}
}'
3、部署 Qwen3-Embedding 与 Qwen3-Reranker 模型
# 嵌入
https://docs.vllm.ai/projects/ascend/zh-cn/v0.23.0/tutorials/models/Qwen3-Embedding.html
# 重排
https://docs.vllm.ai/projects/ascend/zh-cn/v0.23.0/tutorials/models/Qwen3-Reranker.html
更多推荐


所有评论(0)