常见问题#

特定版本常见问题#

通用常见问题#

1.目前支持哪些设备?#

目前,支持 Atlas A2 系列 (Ascend-cann-kernels-910b)、Atlas A3 系列 (Atlas-A3-cann-kernels) 以及 Atlas 300I (Ascend-cann-kernels-310p) 系列:

  • Atlas A2 训练系列(Atlas 800T A2、Atlas 900 A2 PoD、Atlas 200T A2 Box16、Atlas 300T A2)

  • Atlas 800I A2 推理系列(Atlas 800I A2)

  • Atlas A3 训练系列(Atlas 800T A3、Atlas 900 A3 SuperPoD、Atlas 9000 A3 SuperPoD)

  • Atlas 800I A3 推理系列(Atlas 800I A3)

  • [实验性] Atlas 300I 推理系列(Atlas 300I Duo)。

  • [实验性] 目前对于 310I Duo,稳定版本为 vllm-ascend v0.10.0rc1。

以下系列目前尚不支持:

  • Atlas 200I A2 (Ascend-cann-kernels-310b) 暂无计划

  • Ascend 910、Ascend 910 Pro B (Ascend-cann-kernels-910) 暂无计划

从技术角度看,如果设备支持 torch-npu,则 vllm-ascend 也支持该设备。否则,我们需要通过自定义算子来实现。我们也欢迎您加入我们,共同改进。

2.如何获取我们的 Docker 容器?#

您可以在 Quay.io 获取我们的容器,例如:vllm-ascendcann

如果您在中国境内,可以使用 daocloud 或其他镜像站点来加速下载:

# Replace with tag you want to pull
TAG=v0.9.1
docker pull m.daocloud.io/quay.io/ascend/vllm-ascend:$TAG
# or
docker pull quay.nju.edu.cn/ascend/vllm-ascend:$TAG

为离线环境加载 Docker 镜像#

如果您想在离线环境(无互联网连接)中使用容器镜像,需要先在有网络访问权限的环境中下载镜像:

导出 Docker 镜像:

# Pull the image on a machine with internet access
TAG=v0.20.2rc1
docker pull quay.io/ascend/vllm-ascend:$TAG

# Export the image to a tar file and compress to tar.gz
docker save quay.io/ascend/vllm-ascend:$TAG | gzip > vllm-ascend-$TAG.tar.gz

在无网络环境下导入 Docker 镜像:

# Transfer the tar/tar.gz file to the offline environment and load it
TAG=v0.20.2rc1
docker load -i vllm-ascend-$TAG.tar.gz

# Verify the image is loaded
docker images | grep vllm-ascend

3.vllm-ascend 支持哪些模型?#

请在此处查看更多详细信息。

4.如何与我们的社区取得联系?#

您可以通过多种渠道与我们的社区开发者及用户进行交流:

  • 提交 GitHub issue

  • 参加我们的周会并分享您的想法。

  • 加入我们的微信群并进行提问。

  • 加入 vLLM 论坛 中的 Ascend 频道并发布话题。

5.vllm-ascend V1 支持哪些功能?#

请在此处查看更多详细信息。

6.如何解决“无法推断设备类型”或“libatb.so:无法打开共享对象文件”的问题?#

根本原因是 NPU 环境配置不正确。您可以:

  1. 尝试运行 source /usr/local/Ascend/nnal/atb/set_env.sh 以启用 NNAL 包。

  2. 尝试运行 source /usr/local/Ascend/ascend-toolkit/set_env.sh 以启用 CANN 包。

  3. 尝试运行 npu-smi info 检查 NPU 是否正常工作。

如果以上步骤均无效,可以尝试在 Python 中运行以下代码来检查是否有任何错误:

import torch
import torch_npu
import vllm

如果上述步骤仍无法解决问题,请随时提交 GitHub issue。

7.vllm-ascend 如何与 vLLM 协同工作?#

vllm-ascend 是 vLLM 的硬件插件。稳定版本通常与相同的 vLLM 版本对齐,而 RC 版本可能使用对应的 vLLM 最终发布版本。例如,vllm-ascend v0.18.0rc1 对应 vLLM v0.18.0。对于主分支,我们确保 vllm-ascendvllm 在每次提交时都是兼容的。

8.vllm-ascend 支持预填充解耦 (Prefill Disaggregation) 功能吗?#

是的,vllm-ascend 通过 Mooncake 后端支持预填充解耦功能。详情请参考官方教程

9.vllm-ascend 支持量化方法吗?#

目前,vllm-ascend 已支持 w8a8、w4a8 和 w4a4 量化方法。

10.vllm-ascend 是如何进行测试的?#

vllm-ascend 从功能、性能和精度三个方面进行测试。

  • 功能测试:我们添加了 CI,包括部分 vLLM 原生单元测试和 vllm-ascend 自有的单元测试。在 vllm-ascend 的测试中,我们通过端到端 (E2E) 测试来验证基本功能、主流模型可用性以及支持的功能

  • 性能测试:我们提供了基准测试工具用于端到端性能基准测试,可以方便地在本地重现。我们将发布一个性能展示网站,显示每个 PR 的性能测试结果。

  • 精度测试:我们正在努力将精度测试也添加到 CI 中。

  • 每日构建测试 (Nightly):我们每晚会运行全量测试以确保代码正常工作。

对于每个正式版本,我们未来都会发布性能测试和精度测试报告。

11.使用 vllm-ascend 时出现 "InvalidVersion" 错误如何解决?#

该问题通常是由于安装了开发版或可编辑版本的 vLLM 包导致的。为此,我们提供了环境变量 VLLM_VERSION 供用户指定要使用的 vLLM 包版本。请将 VLLM_VERSION 设置为您已安装的 vLLM 包版本,格式应为 X.Y.Z

12.如何处理内存溢出 (OOM) 问题?#

OOM 错误通常在模型超出单个 NPU 的内存容量时发生。一般性指导请参考 vLLM OOM 故障排除文档

在 NPU 的高带宽内存(片上内存)容量有限的场景下,推理期间的动态内存分配/释放可能会加剧内存碎片,从而导致 OOM。解决方法如下:

  • 限制 --max-model-len:这可以节省 KV 缓存初始化阶段的片上内存占用。

  • 调整 --gpu-memory-utilization:若未指定,默认值为 0.9。您可以降低此值以预留更多内存,从而降低碎片风险。详见:vLLM - 推理与服务 - 引擎参数

  • 配置 PYTORCH_NPU_ALLOC_CONF:设置此环境变量以优化 NPU 内存管理。例如,您可以使用 export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 启用虚拟内存功能,以缓解运行时频繁动态调整内存大小导致的内存碎片。详见:PYTORCH_NPU_ALLOC_CONF 文档

13.运行 DeepSeek 时无法启用 NPU 图模式#

为 DeepSeek 启用 NPU 图模式可能会报错。这是因为当同时启用 MLA(多头潜在注意力)和 NPU 图模式时,每个 KV 头的查询数必须为 32、64 或 128。然而,DeepSeek-V2-Lite 仅有 16 个注意力头,导致每个 KV 仅有 16 个查询,超出了支持范围。对 DeepSeek-V2-Lite 的 NPU 图模式支持将在未来更新中添加。

如果您使用的是 DeepSeek-V3 或 DeepSeek-R1,请确保在张量并行切分后,num_heads/num_kv_heads 的值为 {32, 64, 128} 其中之一。

[rank0]: RuntimeError: EZ9999: Inner Error!
[rank0]: EZ9999: [PID: 62938] 2025-05-27-06:52:12.455.807 numHeads / numKvHeads = 8, MLA only support {32, 64, 128}.[FUNC:CheckMlaAttrs][FILE:incre_flash_attention_tiling_check.cc][LINE:1218]

14.卸载 vllm-ascend 后无法从源码重新安装 vllm-ascend#

当使用 pip 从源码重新安装 vllm-ascend 时,可能会遇到 C/C++ 编译失败的问题。如果安装失败,建议使用 python setup.py install 进行安装,或者使用 python setup.py clean 清除缓存。

15.使用 vllm-ascend 时如何生成确定性结果?#

有几个因素会影响输出的确定性:

  1. 采样方法:在 SamplingParams 中设置 temperature=0 来使用贪婪采样,例如:

    from vllm import LLM, SamplingParams
    
    prompts = [
       "Hello, my name is",
       "The president of the United States is",
       "The capital of France is",
       "The future of AI is",
    ]
    
    # Create a sampling params object.
    sampling_params = SamplingParams(temperature=0)
    # Create an LLM.
    llm = LLM(model="Qwen/Qwen3-0.6B")
    
    # Generate texts from the prompts.
    outputs = llm.generate(prompts, sampling_params)
    for output in outputs:
       prompt = output.prompt
       generated_text = output.outputs[0].text
       print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
    
  2. 设置以下环境变量参数:

    export LCCL_DETERMINISTIC=1
    export HCCL_DETERMINISTIC=true
    export ATB_MATMUL_SHUFFLE_K_ENABLE=0
    export ATB_LLM_LCOC_ENABLE=0
    

16.多模态模型报错 "ImportError: Please install vllm[audio] for audio support" 如何解决?#

某些多模态模型需要安装 librosa 包。您需要安装 qwen-omni-utils 包以确保满足所有依赖,对于 Qwen-omni,请运行 pip install qwen-omni-utils。该包会安装 librosa 及其相关依赖,解决 ImportError: No module named 'librosa' 问题,并确保音频处理功能正常工作。

17.如何排查并解决因流资源耗尽导致的尺寸捕获失败,其根本原因是什么?#

error example in detail: 
ERROR 09-26 10:48:07 [model_runner_v1.py:3029] ACLgraph sizes capture fail: RuntimeError:
ERROR 09-26 10:48:07 [model_runner_v1.py:3029] ACLgraph has insufficient available streams to capture the configured number of sizes.Please verify both the availability of adequate streams and the appropriateness of the configured size count.

建议的缓解策略:

  1. 手动配置 compilation_config 参数以减少尺寸集:'{"cudagraph_capture_sizes":[size1, size2, size3, ...]}'。

  2. If your workload is mostly uniform decode, employ ACLGraph's FULL or FULL_DECODE_ONLY mode as an alternative to the piecewise approach.

  3. If you use PIECEWISE or FULL_AND_PIECEWISE, it is recommended to set cudagraph_capture_sizes manually according to your workload.

根本原因分析:当前的尺寸捕获流需求计算仅考虑了可测量因素,包括:数据并行大小、张量并行大小、专家并行配置、分段图数量、多流重叠共享专家设置以及 HCCL 通信模式(AIV/AICPU)。然而,许多不可量化的因素(如算子特性和特定硬件功能)在该计算框架之外消耗了额外的流,导致在尺寸捕获操作期间流资源耗尽。

18.如何安装自定义版本的 torch_npu?#

安装 vllm-ascend 时会覆盖 torch-npu。如果您需要安装特定版本的 torch-npu,请在安装完 vllm-ascend 之后再手动安装指定版本的 torch-npu。

19.在某些系统(如麒麟 OS)上,执行 docker pull 可能会报错 invalid tar header#

在某些操作系统(如麒麟 OS)上,您可能会在 docker pull 过程中遇到 invalid tar header 错误:

failed to register layer: ApplyLayer exit status 1 stdout: stderr: archive/tar: invalid tar header

这通常是由于系统兼容性问题导致的。您可以通过另一台机器使用离线加载的方法来解决。

  1. 在另一台宿主机(如标准的 Ubuntu 服务器)上,拉取目标 ARM64 架构的镜像并打包为 .tar 文件。

    export IMAGE_TAG=v0.10.0rc1-310p
    export IMAGE_NAME="quay.io/ascend/vllm-ascend:${IMAGE_TAG}"
    # If in China region, uncomment to use a mirror:
    # export IMAGE_NAME="m.daocloud.io/quay.io/ascend/vllm-ascend:${IMAGE_TAG}"
    
    # Pull the image for the ARM64 platform and save it
    docker pull --platform linux/arm64 "${IMAGE_NAME}"
    docker save -o "vllm_ascend_${IMAGE_TAG}.tar" "${IMAGE_NAME}"
    
  2. 传输镜像归档文件

vllm_ascend_<tag>.tar 文件(其中 <tag> 是您使用的镜像标签)拷贝到目标机器。

20.为什么执行启动 Docker 容器的脚本时会报错 "operation not permitted"?#

当使用 --shm-size 时,您可能需要在 docker run 命令中添加 --privileged=true 标志以授予容器必要权限。请注意,使用 --privileged=true 会授予容器在宿主机系统上的极高权限,这可能存在安全风险。请仅在您了解后果并信任镜像来源的情况下使用此选项。

21.在仅有 CPU 的机器上从源码构建时,如何设置 SOC_VERSION#

从源码构建时(例如执行 pip install -e .),构建过程可能会尝试通过 npu-smi 推断目标芯片。如果 npu-smi 不可用(这在仅有 CPU 的构建环境中很常见),则必须在安装前手动设置 SOC_VERSION

你可以参考 Dockerfile* 中的默认值。例如:

# Atlas A2
export SOC_VERSION="ascend910b1"

# Atlas A3
export SOC_VERSION="ascend910_9391"

# Atlas 300I
export SOC_VERSION="ascend310p1"

# Atlas A5 (Ascend 950 series)
export SOC_VERSION="<value starting with ascend950>"

22.为什么 TPOT 会随着并发数增加而急剧上升?#

在测试 vLLM 服务器时,你可能会发现 TPOT 随着并发数增加而增加(例如,并发数增加 4 时,TPOT 增加 0.5 ~ 1 毫秒)。在大多数情况下,这种现象是正常的。然而,有时 TPOT 可能会随着并发数增长而急剧上升(例如增加 10 到 100 毫秒)。这可能是由 vLLM 中的 抢占 引起的。通常,当你的服务器达到 KV 缓存限制时,vLLM 会尝试释放某些请求的 KV 缓存,以确保为其他请求提供足够的空间,这在 vLLM 中称为抢占。当一个请求被抢占时,默认行为是在未来重新计算该请求的 KV 缓存,这就是性能可能显著下降的原因。有几种方法可以验证这一点:

  • vLLM 通常会在服务器上记录统计信息。你可能会看到类似 GPU KV cache usage: 99.0%, 的指标。当达到 100% 时,会触发抢占。

  • 启动 vLLM 服务器时,你会看到类似 GPU KV cache size: 66340 tokensMaximum concurrency for 16,384 tokens per request: 4.05 的日志。这些是针对单个 DP 组的估计 KV 缓存容量。你可以据此调整总体请求流量。

抢占无法完全避免,因为 KV 缓存的使用总是有限制的。但有方法可以减少抢占的发生几率。正如 抢占 中所建议的,核心策略是增加可用的 KV 缓存。例如,可以增加 --gpu-memory-utilization 或减少 --max-num-seqs--max-num-batched-tokens