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服务器官方推荐OSOpenEuler,因此选择对应版本的镜像;不做硬性要求,也可以进入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}")

Logo

更多推荐