VLLM 在异构 GPU 环境下使用 FP8 模型可能导致精度丢失和输出错误
摘要
本文揭示了在使用 VLLM 推理框架时,当部署于异构 GPU 环境并结合 FP8 量化模型(特别是 Unsloth 优化的模型)时,可能出现的精度丢失和输出错误问题。具体表现为文本生成中出现乱码、重复字符、缺失空格及格式错误等。初步分析指向 VLLM 在处理异构硬件时的数字溢出问题。该问题对模型输出的准确性和安全性构成潜在风险。文章建议用户在遇到此类问题时,考虑使用流水线并行或 FP16 数据类型,并提供了相关的 GitHub 和 Hugging Face 问题链接以供参考和追踪。
正文
近期发现,在使用 VLLM 的张量并行模式处理异构 GPU 时,可能会出现输出不一致或错误的问题,尤其是在使用 FP8 量化模型时。用户报告称,与 Qwen 的官方 FP8 量化模型相比,使用 Unsloth 团队优化的 FP8 模型(如 Qwen3-Coder-Next-FP8-Dynamic)在 VLLM 中运行时,文本输出会产生冗余字符、乱码、单词重复(如 "someonesomeone")、缺失的空格以及未闭合的标签(如 "context without closing")。
这些问题在特定问题(例如询问 /users/me 端点是否为不良实践)的测试中尤为明显,导致输出内容出现安全隐患(如 "Forgetting to require auth → anyone gets someonesomeone’s data")和格式错误。
用户尝试调整采样参数(如 temperature)并未能解决问题,甚至在 temp=0.0 时错误更加严重。初步判断,这可能是 VLLM 在处理异构 GPU 时,由于数字溢出导致的精度丢失问题。虽然在 FP16 下可能不明显,但用户在使用 FP8 模型时应警惕此问题,并考虑尝试流水线并行(pipeline parallel)作为替代方案。
以下是用户提供的 VLLM 启动命令示例,其中配置了多 GPU 和张量并行大小为 1,流水线并行大小为 4:
qwen3-coder-80b:
env:
- VLLM_SLEEP_WHEN_IDLE=1
- VLLM_LOG_STATS_INTERVAL=5
- CUDA_DEVICE_ORDER=PCI_BUS_ID
- CUDA_VISIBLE_DEVICES=0,1,2,3
- OMP_NUM_THREADS=12
- VLLM_MARLIN_USE_ATOMIC_ADD=1
- VIRTUAL_ENV=/home/gleb/llm/env_vllm
- VLLM_LOGGING_COLOR=0
cmd: |
/home/gleb/.local/bin/uv run
-m vllm.entrypoints.openai.api_server
--model /mnt/data/llm-data/models/Qwen/Qwen3-Coder-Next-FP8
--dtype bfloat16
--served-model-name "qwen3-coder-80b"
--port ${PORT}
--tensor-parallel-size 1
--pipeline-parallel-size 4
--enable-prefix-caching
--attention-backend flashinfer
--max-model-len 200000
--gpu-memory-utilization 0.92
--max-num-seqs 4
--enable-auto-tool-choice
--tool-call-parser qwen3_coder
此问题已在 GitHub 和 Hugging Face 上提交讨论,开发者正在寻求解决方案。