[Bug]: Non-streaming derender appends U+FFFD where the ordinary route emits nothing 🌈🌈

这个报错通常出现在 vLLM 使用非流式(non-streaming)接口调用 derender 路径时,输出中会额外夹带 Unicode 替换字符 U+FFFD(“�”),而普通 route 在同样位置本该什么都不输出。优先排查是否命中了 detokenize 侧的 delta 处理差异,并确认是

快速结论:这个报错通常出现在 vLLM 使用非流式(non-streaming)接口调用 derender 路径时,输出中会额外夹带 Unicode 替换字符 U+FFFD(“�”),而普通 route 在同样位置本该什么都不输出。优先排查是否命中了 detokenize 侧的 delta 处理差异,并确认是否已经包含 #59046 的修复。

适用环境:Issue 中已确认的环境为 Red Hat Enterprise Linux 8.10(x86_64)、Python 3.12.12(Anaconda)、PyTorch 2.10.0+cu128、CUDA 12.8、NVIDIA H100 80GB HBM3、NVIDIA 驱动 590.44.01、flashinfer-python 0.5.2。其余依赖版本 Issue 未完整给出。

最快修复方案:升级到包含 #59046 的 vLLM 版本或提交。Issue 中维护者明确回复该问题 “Fixed already in #59046 because the batch paths now go through _detokenize_delta (same as streaming)”,即批量/非流式路径改为与流式一致地走 _detokenize_delta。

注意事项:Issue 未给出具体版本号、PR 合并 commit 或升级命令,因此不要照搬未经验证的版本号。若当前分支已经包含该 PR 仍能复现,需要重新确认调用栈是否确实走到 derender 的非流式分支。

问题场景

用户在 vLLM 中调用非流式(non-streaming)derender 路径时,返回内容里出现 U+FFFD(“�”)替换字符;相同的输入/场景走普通 route 时不会输出这个字符。Issue 环境为单卡 H100 80GB,运行在 RHEL 8.10,使用 PyTorch 2.10.0+cu128 与 CUDA 12.8。

报错原文

[Bug]: Non-streaming derender appends U+FFFD where the ordinary route emits nothing 🌈🌈

原因分析

最可能的原因是:非流式(batch)路径与流式路径在 detokenize 阶段处理不一致。Issue 中维护者说明该问题已由 #59046 修复,原因是 batch paths 现在改为经过 _detokenize_delta,与 streaming 保持一致。也就是说,旧行为下非流式 derender 在增量解码边界处可能产生一个无法正确解码的残余字节,最终被替换为 U+FFFD;而普通 route 在相同位置不输出内容,因此看不到该字符。

环境排查

  • 确认 vLLM 版本是否已包含 #59046 的修复(Issue 未给出具体 release/tag,需按仓库提交记录核对)。
  • 确认 Python 版本:Issue 为 3.12.12。
  • 确认 PyTorch 版本与 CUDA:Issue 为 PyTorch 2.10.0+cu128、CUDA 12.8。
  • 确认 GPU 与驱动:Issue 为 NVIDIA H100 80GB HBM3、驱动 590.44.01。
  • 确认是否使用 flashinfer:Issue 为 flashinfer-python 0.5.2。
  • 确认复现时走的是非流式 derender 路径,而非 streaming 或普通 route。

解决步骤

  1. 先记录当前 vLLM 版本与所在 commit,确认是否在 #59046 之前。
  2. 将 vLLM 更新到包含 #59046 的版本或提交。该 PR 的修复点是让 batch paths 经过 _detokenize_delta,与 streaming 对齐。
  3. 更新后重启服务/进程,重新用相同的非流式 derender 调用复现。
  4. 若仍复现,检查是否有自定义 detokenize 逻辑或本地 patch 覆盖了 _detokenize_delta 路径。
  5. 如果确认已经包含修复仍异常,收集最小复现输入、调用参数与输出对比,回到 Issue 补充信息。

验证方法

用同一个触发过 U+FFFD 的输入重新走非流式 derender 路径,确认输出中不再出现 “�”;同时与普通 route 的输出对比,确认两者在该位置的行为一致(都不输出该字符)。如条件允许,对比修复前后的 batch 与 streaming 输出是否一致。

参考来源

vllm-project/vllm #59089

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 26829

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注