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 \  
--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

有的终端换行时候容易出错误,如果出错误,可以用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 \                  
--host 0.0.0.0 \                      
--port 8000 \                           
--tensor-parallel-size 4 \             
--gpu-memory-utilization 0.9 \         
--served-model-name Qwen3-30B-A3B       

有的终端换行时候容易出错误,如果出错误,可以用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检查

# 1.检查服务是否存活
curl http://localhost:8000/health

# 预期响应: 容器外部空响应 + 容器内部显示200 OK

# 2.查看已加载的模型
curl http://localhost:8000/v1/models

# 预期响应: JSON格式的模型信息
{
  "object": "list",
  "data": [
    {
      "id": "Qwen3-30B-A3B",
      "object": "model",
      "created": 1760692486,
      "owned_by": "vllm",
      "max_model_len": 40960,
      // ... 其他模型信息
    }
  ]
}

# 3.基础聊天测试
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3-30B-A3B",
    "messages": [
      {"role": "user", "content": "你好,请简单介绍蔡徐坤"}
    ],
    "max_tokens": 100
  }'

如果返回对应的响应,则代表模型部署成功。

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

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐