快速结论:这个报错发生在 vLLM 0.24.0 专门为 SM8.6(Ampere)架构构建、并启用量化模型(AWQ/compressed-tensors)与投机解码时。优先排查 vllm/platforms/cuda.py 第 45 行附近的模块级导入是否使用了 logger.warning(每次导入都会触发),而不是 logger.warning_once(每个进程只提示一次)。
适用环境:vLLM 0.24.0,GPU 目标为 SM8.6(Ampere,例如双 RTX 3090),量化格式为 compressed-tensors/AWQ,启用了 MTP 投机解码、Tensor Parallelism = 2,并在 API server 进程与本地 worker 中观察到重复告警。
最快修复方案:暂无确认的一步修复方案。Issue 中提到的修复方式是修改 vllm/platforms/cuda.py 第 45 行,把 logger.warning 改为 logger.warning_once,使其与同文件其他可选内核导入(如 _C_stable_libtorch、_moe_C_stable_libtorch)以及 import_kernels() 内的 _qutlass_C 导入行为一致。这是可优先尝试的社区补丁方案。另有关联 PR #46521 可能已在 v0.24.0 前修复此问题,可升级版本验证。
注意事项:该修改只是将重复告警降噪为“每进程最多一次”,并不改变功能行为——_qutlass_C 导入失败后仍会回退到 Marlin 等替代内核。如果你修改的是本地安装的 vLLM 源码,之后升级或重装会覆盖此改动。PR #46521 的完全效果在 Issue 讨论中未确认,它可能只修复了缺失算子错误路径,不一定完全消除 SM8.6 构建下的告警噪声。
问题场景
用户在使用 vLLM 0.24.0 启动 OpenAI API server,模型为 Qwen3.6-27B-AWQ-BF16-INT4,启用了 --tensor-parallel-size 2、--kv-cache-dtype fp8_e5m2、--enable-chunked-prefill 和 MTP 投机解码配置。vLLM 包是专门针对 SM8.6(Ampere)构建的,没有编译 SM90 内核。服务能正常启动并回退到替代后端(如 Marlin 内核),但 vllm._qutlass_C 导入失败告警在 APIServer 进程与本地 worker 中反复刷屏,干扰生产诊断日志。
报错原文
(APIServer pid=96737) WARNING 06-28 08:40:46 [cuda.py:230] Failed to import from vllm._qutlass_C: ModuleNotFoundError("No module named 'vllm._qutlass_C'")
...
WARNING 06-28 08:41:03 [cuda.py:45] Failed to import from vllm._qutlass_C: ModuleNotFoundError("No module named 'vllm._qutlass_C'")
WARNING 06-28 08:41:06 [cuda.py:230] Failed to import from vllm._qutlass_C: ModuleNotFoundError("No module named 'vllm._qutlass_C'")
WARNING 06-28 08:41:06 [cuda.py:230] Failed to import from vllm._qutlass_C: ModuleNotFoundError("No module named 'vllm._qutlass_C'")
...
WARNING 06-28 08:41:10 [cuda.py:230] Failed to import from vllm._qutlass_C: ModuleNotFoundError("No module named 'vllm._qutlass_C'")
原因分析
根本原因定位在 vllm/platforms/cuda.py 中有两处尝试导入 vllm._qutlass_C 的代码:
- 第 42–45 行的模块级导入:使用
logger.warning(...),每次导入该模块都会触发告警。由于cuda.py在 API server 进程与 worker 进程中被多次导入,告警被反复打印。 - 第 230–233 行(位于
CudaPlatformBase.import_kernels()内):已经使用了logger.warning_once(...),从一开始就做了去重,所以此处不会刷屏。
因此刷屏的源头是模块级导入处的 logger.warning,而不是 import_kernels() 内的调用。_qutlass_C 是可选的内核扩展,在专为 SM8.6 构建的 vLLM 中不包含该二进制组件属预期情况,服务会回退到 Marlin 等替代内核,不影响整体功能。
环境排查
- 确认 vLLM 版本是否为 0.24.0(或验证升级到包含 PR #46521 的版本是否能消除告警)。
- 确认 GPU 目标架构:SM8.6(Ampere),例如双 RTX 3090;确认构建时未编译 SM90 内核。
- 确认量化格式:AWQ 或 compressed-tensors。
- 确认是否启用了 MTP 投机解码(
--speculative-config '{"method": "mtp", ...}'),以及 Tensor Parallelism 是否设置为 2。 - 检查
vllm/platforms/cuda.py第 45 行附近的代码,确认导入失败时使用的是logger.warning还是logger.warning_once。
解决步骤
- 定位本地安装的 vLLM 源码文件
vllm/platforms/cuda.py,找到第 45 行附近的模块级导入vllm._qutlass_C的异常处理代码。 - 将第 45 行的
logger.warning(...)改为logger.warning_once(...),与同文件其他可选内核导入(_C_stable_libtorch、_moe_C_stable_libtorch)以及import_kernels()内的_qutlass_C导入保持一致。注意warning_once内部使用@lru_cache,每个进程最多提示一次。 - 重启 API server,观察启动日志确认告警不再刷屏。
- 如果不想手动改源码,可优先尝试升级 vLLM 版本到包含 PR #46521(treat qutlass as optional)的构建,该 PR 在 Issue 讨论中被确认似乎能消除告警,且早于 v0.24.0。
- 若要彻底避免告警,也可以考虑使用包含 SM8.6 及 SM90 内核的通用构建,而不是专门为 SM8.6 构建的版本。
验证方法
重新启动 API server,并检查启动日志:如果 ModuleNotFoundError("No module named 'vllm._qutlass_C'") 告警在 APIServer 进程和每个 worker 进程中最多只出现一次(甚至不再出现),则说明修改生效。同时确认模型仍能正常加载并完成推理(应回退到 Marlin 等替代内核),量化输出与原有行为一致。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


