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
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐