
RuntimeError: Worker failed with error ‘Unknown TurboQuant cache dtype: ‘auto’. Valid presets: turboquant_k8v4, turboquant_4bit_nc, turboquant_k3v4_nc, turboquant_3bit_nc’, please check the stac
快速结论:该报错通常发生在 A100 (SM80) 显卡上使用 vLLM 服务 BF16 模型并启用 turboquant_k8v4 KV cache 时。优先排查是否未设置或错误设置了 --kv-cache-dtype 参数,且确认 vLLM 版本是否已包含 PR #39988 的修复。
问题场景
在 A100 (SM80) 显卡上使用 vLLM 的 API 服务(vllm serve 或 vllm.entrypoints.openai.api_server)时,设置了 --kv-cache-dtype turboquant_k8v4 并加载 BF16 模型(如 Qwen/Qwen2.5-3B-Instruct),在服务初始化阶段或首次请求时崩溃,抛出 RuntimeError: Worker failed with error 'Unknown TurboQuant cache dtype: 'auto'。实际底层错误是 Triton 编译期间的 AssertionError。
报错原文
RuntimeError: Worker failed with error 'Unknown TurboQuant cache dtype: 'auto'. Valid presets: turboquant_k8v4, turboquant_4bit_nc, turboquant_k3v4_nc, turboquant_3bit_nc', please check the stack trace above for the root cause
Traceback (most recent call last):
File "/usr/local/lib/python3.12/dist-packages/vllm/v1/executor/multiproc_executor.py", line 391, in get_response
raise RuntimeError(...)
File "triton/language/extra/cuda/utils.py", line 94, in convert_custom_float8
assert arg.type.scalar.is_fp16() or arg.type.scalar.is_fp32()
AssertionError
triton.compiler.errors.CompilationError: at 45:12:
k_fp8 = k_vals.to(tl.float8e4b15) if FP8_E4B15 else k_vals.to(tl.float8e4nv)
^
原因分析
- 根本原因:Triton 的
convert_custom_float8_sm80软件 FP8 转换路径(用于 SM80/A100)要求输入必须是 FP16 或 FP32 类型。当模型使用 BF16 时,k_vals被加载为 BF16 类型,导致assert arg.type.scalar.is_fp16() or arg.type.scalar.is_fp32()断言失败。 - 架构特异性:此问题仅在 SM80(A100)上出现。SM89+(如 H100)有原生 FP8 硬件支持,使用不同的 Triton 代码路径,不会触发该断言。
- 错误连显示:当底层 Triton 编译失败时,vLLM 引擎可能无法正确识别
--kv-cache-dtype参数,从而向上层抛出“Unknown TurboQuant cache dtype: ‘auto’”错误信息。
环境排查
- GPU 型号:确认是否在 A100 (SM80) 上运行(
nvidia-smi或python -c "import torch; print(torch.cuda.get_device_capability())"应返回(8, 0))。 - 模型精度:确认模型是否为 BF16(使用
--dtype bfloat16或模型自身默认精度)。 - vLLM 版本:检查是否包含 PR #39988 的修复(该 PR 已在
vllm/v1/attention/ops/triton_turboquant_store.py:188中添加.to(tl.float32)转换)。 - Triton 版本:确认 Triton 版本(配置中的 3.x 可能因环境而异,但问题主要在于输入类型而非版本)。
解决步骤
- (可优先尝试)明确设置
--kv-cache-dtype而非依赖默认值:Issue 评论中用户使用--kv-cache-dtype turboquant_k8v4后仍然遇到类似错误,但明确设置可避免“auto”猜测逻辑。在命令行中添加:
--kv-cache-dtype turboquant_k8v4 - 升级 vLLM 至包含修复的版本:确保 vLLM 已合并 PR #39988。该 PR 在
triton_turboquant_store.py:188中将k_vals先转换为tl.float32再执行 FP8 转换:# 修改前(BF16 失败): k_vals = tl.load(Key_ptr + base + d_offs, mask=d_mask, other=0.0) # 修改后(所有类型均可用): k_vals = tl.load(Key_ptr + base + d_offs, mask=d_mask, other=0.0).to(tl.float32) - 临时使用其他 KV cache dtype:如果无法升级,可考虑使用非 turboquant 的 FP8 方案(如
--kv-cache-dtype fp8,但 Issue 评论指出 A100 暂不支持),或回退到标准 FP16/BF16(--kv-cache-dtype auto或移除该参数)。 - 检查启动参数:确认
--enforce-eager(如 Issue 复现示例中所示)不是问题诱因。该参数应兼容,但可作为调试选项保留或移除。
验证方法
修复后重启 vLLM 服务(使用原参数),观察是否仍抛出 RuntimeError: Worker failed with error 'Unknown TurboQuant cache dtype: 'auto' 或底层 AssertionError。可通过一个简单请求(如 curl http://localhost:8000/v1/completions -d '{"model": "MODEL_NAME", "prompt": "hi", "max_tokens": 10}')确认服务正常运行。若不报错并正常返回结果,表示问题已解决。



