Prhub

#21294 [VLM] fix bench_serving sglang backend to support image dataset

sgl-project/sglang · 作者 yhyang201 · 合并时间 2026-03-29 10:02

分析状态 已生成
文件变更 1提交数 2 · 评论 8
代码增减 +12 / -9
bugfix test ci

执行摘要

修复 sglang 后端在图像数据集基准测试中的兼容性,确保图像占位符触发 ViT 编码。

根据 PR body,当前 sglang 后端使用 use_raw_prompt = True 返回纯文本提示,导致图像占位符缺失,服务器无法触发 ViT 编码,基准测试实际运行的是纯文本场景。修复后,对 sglang 和 sglang-native 后端使用 prompt_str(带图像占位符),确保 ViT 被触发。

该 PR 值得精读,特别是对于理解 sglang 中多模态提示处理的设计决策,如不同后端对 chat template 的应用差异。关注 create_mm_data_row 函数中的逻辑拆分,以及如何通过占位符触发 ViT。

讨论亮点

Review 中 gemini-code-assist[bot] 赞扬了变更的清晰性和鲁棒性,mickqian 直接批准。Issue 评论中讨论了 CI 测试影响:yhyang201 指出修复可能影响四个 CI 测试的性能阈值(如 test_vlm_perf_5090.py),需要重新校准;mickqian 询问有效性,yhyang201 确认并通过了夜间测试,最终所有 CI 检查通过,可以合并。

实现拆解

修改集中在文件 python/sglang/benchmark/datasets/image.pycreate_mm_data_row 函数:

  1. 引入 supported_backends 列表(仅包含 'sglang', 'sglang-native', 'sglang-oai-chat'),对不支持的后端抛出 ValueError
  2. use_raw_prompt 的逻辑改为仅对 'sglang-oai-chat' 后端使用 raw prompt,而对 'sglang' 和 'sglang-native' 使用 prompt_str(包含图像占位符)。
  3. 返回的 DatasetRow 根据 use_raw_prompt 选择 text_promptprompt_str
文件 模块 状态 重要度
python/sglang/benchmark/datasets/image.py benchmark/datasets modified 7.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

create_mm_data_row

评论区精华

CI 测试性能校准 测试

yhyang201 和 mickqian 在 issue 评论中讨论修复对 CI 测试阈值的影响,涉及 test_vlm_perf_5090.py 等四个文件,需要重新校准。

结论:夜间测试通过,确认修复有效且不影响现有测试文件,可以合并。 · 已解决

风险与影响

技术风险包括:1. 回归风险:变更仅针对特定后端,但可能影响其他基准测试场景(如文本数据集),不过 supported_backends 限制降低了此风险。2. CI 测试稳定性:修复后图像处理逻辑变化,可能导致性能测试结果波动,需要重新校准阈值(如 issue 评论中提到的四个测试文件)。3. 兼容性风险:抛出错误可能中断使用非支持后端的现有工作流,但这是设计上的明确限制。

影响范围:

  • 用户:运行图像数据集基准测试的开发者将看到正确的多模态行为,性能测量更准确。
  • 系统:sglang 后端现在能正确处理图像输入,提升基准测试的真实性。
  • 团队:CI 测试需要调整性能阈值,影响测试维护,但夜间测试已验证通过。影响程度:中等,仅限于图像数据集和特定后端。
CI 测试校准需求 后端兼容性限制

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

执行摘要

该 PR 修复了 sglang 后端在图像数据集基准测试中的兼容性缺陷,通过调整提示处理逻辑和限制支持后端,确保图像占位符能正确触发视觉编码器(ViT)。变更影响 VLM 相关 CI 测试的性能校准,但夜间测试已通过验证,值得关注其多模态设计决策。

功能与动机

为什么做:原始代码中,sglang 后端使用 raw prompt(纯文本)处理图像数据集,导致图像占位符缺失,服务器无法触发 ViT,基准测试实际上运行的是纯文本场景。如 PR body 所述:"Old code: input_ids does not contain any image placeholder tokens... the server cannot find any image placeholder token, and the ViT is never triggered." 修复后,对 sglang 后端使用包含占位符的 prompt_str,确保多模态输入被正确处理。

实现拆解

做了什么:修改集中在 python/sglang/benchmark/datasets/image.py 文件的 create_mm_data_row 函数。关键变更点如下:

  • 后端限制:引入 supported_backends 列表,仅允许 ["sglang", "sglang-native", "sglang-oai-chat"],对不支持的后端抛出 ValueError
  • 提示逻辑调整:将 use_raw_prompt 从基于多个后端改为仅对 "sglang-oai-chat" 使用 raw prompt,而对 "sglang""sglang-native" 使用 prompt_str(带图像占位符)。
  • 返回数据:根据 use_raw_prompt 返回 text_promptprompt_str,影响后续 tokenization 和服务器处理。

代码片段示例:

supported_backends = ["sglang", "sglang-native", "sglang-oai-chat"]
if backend not in supported_backends:
    raise ValueError(...)
use_raw_prompt = backend == "sglang-oai-chat"

评论区精华

讨论了什么:Review 中 gemini-code-assist[bot] 评论:"The pull request effectively addresses the compatibility issue... enhances robustness and clarity." Issue 评论中,yhyang201 和 mickqian 就 CI 测试影响展开讨论:

  • yhyang201 指出:"This fix may affect the performance thresholds of the following four impacted CI tests... which will likely need to be recalibrated."(涉及 test_vlm_perf_5090.py 等文件)
  • 经过夜间测试,结论是:"All CI checks have passed, so it can be merged. The test files are unaffected."

风险与影响

技术风险

  1. 回归风险:变更可能意外影响文本数据集基准测试,但 supported_backends 限制和逻辑隔离降低了此风险。
  2. CI 测试稳定性:性能阈值需要重新校准,否则可能导致测试失败或误导结果;然而,夜间测试已通过,表明风险可控。
  3. 兼容性中断:对非支持后端抛出错误可能中断现有工作流,但这是明确的设计选择以提高鲁棒性。

影响范围

  • 用户端:开发者运行图像数据集基准测试时,将获得准确的多模态性能数据。
  • 系统端:sglang 后端现在能正确集成视觉处理,提升基准测试的真实性。
  • 团队端:CI 维护需关注阈值调整,但无重大架构变更。

关联脉络

更大演进方向:从近期 PR 看,该 PR 与 #21236(修改 bench_serving.py 文件)和 #19915(多模态兼容性修复)相关联,表明仓库在持续优化基准测试套件和多模态支持。结合历史 PR,sglang 项目正加强对 VLM 和图像处理的技术投入,如 PR #19749 和 #21418 也涉及多模态性能优化。本 PR 是该演进中的一环,旨在确保基准测试工具链的准确性和可靠性。

参与讨论