常见问题#
特定版本常见问题#
通用常见问题#
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-ascend 和 cann。
如果您在中国境内,可以使用 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.如何与我们的社区取得联系?#
您可以通过多种渠道与我们的社区开发者及用户进行交流:
5.vllm-ascend V1 支持哪些功能?#
请在此处查看更多详细信息。
7.vllm-ascend 如何与 vLLM 协同工作?#
vllm-ascend 是 vLLM 的硬件插件。稳定版本通常与相同的 vLLM 版本对齐,而 RC 版本可能使用对应的 vLLM 最终发布版本。例如,vllm-ascend v0.18.0rc1 对应 vLLM v0.18.0。对于主分支,我们确保 vllm-ascend 和 vllm 在每次提交时都是兼容的。
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 时如何生成确定性结果?#
有几个因素会影响输出的确定性:
采样方法:在
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}")
设置以下环境变量参数:
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.
建议的缓解策略:
手动配置
compilation_config参数以减少尺寸集:'{"cudagraph_capture_sizes":[size1, size2, size3, ...]}'。If your workload is mostly uniform decode, employ ACLGraph's
FULLorFULL_DECODE_ONLYmode as an alternative to the piecewise approach.If you use
PIECEWISEorFULL_AND_PIECEWISE, it is recommended to setcudagraph_capture_sizesmanually 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
这通常是由于系统兼容性问题导致的。您可以通过另一台机器使用离线加载的方法来解决。
在另一台宿主机(如标准的 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}"
传输镜像归档文件
将 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 tokens和Maximum concurrency for 16,384 tokens per request: 4.05的日志。这些是针对单个 DP 组的估计 KV 缓存容量。你可以据此调整总体请求流量。
抢占无法完全避免,因为 KV 缓存的使用总是有限制的。但有方法可以减少抢占的发生几率。正如 抢占 中所建议的,核心策略是增加可用的 KV 缓存。例如,可以增加 --gpu-memory-utilization 或减少 --max-num-seqs 和 --max-num-batched-tokens。