如何在NPU上部署大模型(Qwen3-30B-A3B)?
本文介绍了在NPU服务器上部署Qwen3-30B-A3B大模型的完整流程。主要内容包括:1)准备工作,如硬件要求、驱动安装、docker环境和镜像资源;2)详细部署步骤,包含镜像拉取、宿主机配置(设备挂载、模型路径映射)、容器内服务启动参数设置;3)验证方法,通过API接口测试和Python示例代码检查模型推理功能。特别强调了NPU设备挂载、tensor并行参数配置等关键环节,适用于OpenEul
0. 资源汇总
0.0 硬件要求:搭载NPU的服务器设备
0.1 下载固件与驱动:商用版-固件与驱动-昇腾社区
在终端中输入npu-smi info,若输出完整信息,则驱动安装成功。
0.2 安装docker:openEuler(华为欧拉)安装docker - 木人草 - 博客园
0.3 镜像资源[RED HAT]:quay.io/ascend/vllm-ascend:main
0.4 参考教程[wiki]:安装指南 vllm-project/vllm-ascend - KoalaWik
0.5 Qwen3-30B-A3B模型下载:MindSDK/Qwen3-30B-A3B | 魔乐社区
1. 具体部署流程
1.1 拉取镜像
由于NPU服务器官方推荐OS是OpenEuler,因此选择对应版本的镜像;不做硬性要求,也可以进入0.3中介绍的官网查看其他镜像,拉取别的镜像,修改下面网址末尾冒号后面的名字即可。
# 拉取指定路径的镜像
docker pull quay.io/ascend/vllm-ascend:main-openeuler
1.2 宿主机操作
1.2.1 将模型挂载到容器内
# 设置待使用的镜像
export IMAGE=quay.io/ascend/vllm-ascend:main-openeuler
# 设置模型在宿主机上的路径和希望在容器内挂载的路径
export HOST_MODEL_DIR=/root/models/MindSDK/Qwen3-30B-A3B # 根据模型的实际存放路径修改
export CONTAINER_MODEL_DIR=/root/models/Qwen3-30B-A3B # 容器内的目标路径,可自定义
下载模型可以参考资源汇总的0.5。
1.2.2 创建容器
docker run --rm -it \
--name vllm-ascend-container \ # 设置容器名字
--device /dev/davinci0 \ # 挂载NPU设备,根据实际NPU ID修改
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci_manager \ # 挂载davinci管理设备
--device /dev/devmm_svm \ # 挂载内存管理设备
--device /dev/hisi_hdc \ # 挂载hisi_hdc设备
-v /usr/local/dcmi:/usr/local/dcmi \ # 挂载DCMI工具目录
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ # 挂载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 \ # 挂载Ascend安装信息文件
-v /root/.cache:/root/.cache \ # 挂载缓存目录,便于容器内使用宿主的缓存(如下载的模型)
-v ${HOST_MODEL_DIR}:${CONTAINER_MODEL_DIR} \ # **核心:挂载宿主机模型目录到容器内**
-p 8000:8000 \ # **核心:将容器的8000端口映射到宿主机的8000端口,便于访问vLLM API**
$IMAGE /bin/bash
有的终端换行时候容易出错误,如果出错误,可以用LLM把命令改写为1行。
改写后的1行命令:
docker run --rm -it --name vllm-ascend-container --device /dev/davinci0 --device /dev/davinci1 --device /dev/davinci2 --device /dev/davinci3 --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 /root/.cache:/root/.cache -v ${HOST_MODEL_DIR}:${CONTAINER_MODEL_DIR} -p 8000:8000 $IMAGE /bin/bash
1.3 容器内操作
# 在容器内执行
python -m vllm.entrypoints.openai.api_server \
--model /root/models/Qwen3-30B-A3B \ # 使用挂载到容器内的模型路径
--trust-remote-code \ # 通常Qwen系列模型需要此参数
--host 0.0.0.0 \ # 监听所有网络接口
--port 8000 \ # 服务端口,与映射的端口一致
--tensor-parallel-size 4 \ # **重要:根据你实际挂载的NPU设备数量调整**
--gpu-memory-utilization 0.9 \ # GPU/NPU内存利用率
--served-model-name Qwen3-30B-A3B # API中使用的模型名称
有的终端换行时候容易出错误,如果出错误,可以用LLM把命令改写为1行。
改写后的1行命令:
python -m vllm.entrypoints.openai.api_server --model /root/models/Qwen3-30B-A3B --trust-remote-code --host 0.0.0.0 --port 8000 --tensor-parallel-size 4 --gpu-memory-utilization 0.9 --served-model-name Qwen3-30B-A3B
注意,tensor-parallel-size通常设置为2的次方数。例如对于此模型,attention head是32,因此tensor并行应该选择能被32整除的内容。
2. 检查是否部署成功
2.1 curl检查
curl http://localhost:8000/v1 #端口号根据实际情况更改,按照上述步骤端口号就是8000
如果返回JSON格式的响应,则代表模型部署成功。
2.2 smoke程序检查模型是否可以正常推理
from openai import OpenAI
client = OpenAI(
api_key="EMPTY",
base_url="http://localhost:8000/v1"
)
messages = [
{"role": "system", "content": "你是一个乐于助人的助手。"},
{"role": "user", "content": "请赏析《只因你太美》这首歌曲。"}
]
try:
# 发送请求到容器内的vLLM服务
response = client.chat.completions.create(
model="Qwen3-30B-A3B", # 与你启动服务时指定的名称一致
messages=messages,
temperature=0.7,
max_tokens=500
)
# 打印模型回复
print("模型回复:")
print(response.choices[0].message.content)
print("\\n使用情况:")
print(f"总令牌数: {response.usage.total_tokens}")
print(f"提示令牌: {response.usage.prompt_tokens}")
print(f"完成令牌: {response.usage.completion_tokens}")
except Exception as e:
print(f"请求出错: {e}")
更多推荐
所有评论(0)