Prhub

#34769 [AMD][CI] Fix stage-b: AttributeError on multimodal embedding requests

原始 PR 作者 michaelzhang-ai 合并时间 2026-08-15 12:35 文件变更 1 提交数 2 评论 6 代码增减 +4 / -1

执行摘要

修复多模态嵌入请求缺失字段崩溃

PR #34398 添加了 _normalize_mm_content_hashes,但该函数注解为 obj: GenerateReqInput,其调用点 _tokenize_one_request 位于 if contains_mm_input: 分支下,该分支同时被 GenerateReqInput 与 EmbeddingReqInput 两类请求触达。由于 mm_content_hashes 仅在 GenerateReqInput 上声明,多模态 embedding 请求必然触发 AttributeError: 'EmbeddingReqInput' object has no attribute 'mm_content_hashes'。该问题被 AMD ROCm 7.2 stage-b CI 的 test_embedding 测试捕获(修复前 2/12 通过)。

该 PR 改动极小但修复了所有多模态 embedding 请求的完全故障,建议尽快合入。值得关注的点在于:公共调用点对请求类型的假设如何导致回归,以及测试注册平台差异对回归拦截时效的影响。建议后续考虑将覆盖用例加入 NVIDIA PR CI,或在类型设计上为 EmbeddingReqInput 提供一致接口。

讨论亮点

mickqian 直接批准(APPROVED),无 review 评论。主要讨论集中在 PR 描述与 CI 评论中:作者说明不新增测试的原因——现有 test_embedding 已覆盖;同时指出该测试在 AMD 上是 PR 阻塞项,在 NVIDIA 上仅 nightly,导致 #34398 的回归未被及时察觉。amd-bot 确认修复后目标测试通过,其余 CI 失败均与本次改动无关。

实现拆解

  1. 问题定位:在 python/sglang/srt/managers/tokenizer_manager.py_tokenize_one_request 方法中,当 contains_mm_input 为真时,会先调用 _validate_mm_limits(obj) 再调用 _normalize_mm_content_hashes(obj)。后者仅接受 GenerateReqInput,而 EmbeddingReqInput 没有 mm_content_hashes 字段,因此每次多模态 embedding 请求都会崩溃。
  2. 修复方案:将 _normalize_mm_content_hashes(obj) 调用包在 isinstance(obj, GenerateReqInput) 检查中,确保只有生成请求走内容寻址预处理,嵌入请求恢复为 #34398 之前的行为。
  3. 验证与配套:未新增测试,因为 test/registered/cuda_graph/piecewise/test_piecewise_cuda_graph_support_1_gpu.py 中的 TestPiecewiseCudaGraphQwen25VLEmbedding::test_embedding 已精确覆盖该场景;在 AMD stage-b shard 上修复后 12/12 通过。无文档与基准变更。
文件 模块 状态 重要度
python/sglang/srt/managers/tokenizer_manager.py 请求分词 modified 5.13

关键符号

_tokenize_one_request

关键源码片段

python/sglang/srt/managers/tokenizer_manager.py core-logic

唯一改动文件,修复多模态 embedding 请求在 _tokenize_one_request 中因缺少 mm_content_hashes 字段而崩溃的问题。

# 多模态输入存在时的预处理分支
if contains_mm_input:
    # 校验多模态输入是否超出限制,对生成与嵌入两类请求都适用
    self._validate_mm_limits(obj)
​
    # mm_content_hashes 是 GenerateReqInput 的字段,EmbeddingReqInput 没有该属性。
    # 仅在生成请求上执行内容寻址哈希归一化,避免多模态嵌入请求
    # 因 AttributeError 崩溃(回归自 #34398)。
    if isinstance(obj, GenerateReqInput):
        self._normalize_mm_content_hashes(obj)

评论区精华

测试覆盖策略 测试

作者在 PR 描述中说明不新增测试,因为现有 TestPiecewiseCudaGraphQwen25VLEmbedding::test_embedding 已覆盖该场景;并指出该测试在 AMD CI 上是 PR 阻塞项,而在 NVIDIA 上仅 nightly,导致回归未被及时捕获。

结论:接受不新增测试;作者提出是否应在 NVIDIA PR CI 上也门禁该用例的问题。 · 已解决

CI 验证结论 ci

amd-bot 确认目标测试在 AMD stage-b shard 上通过(12/12),其他失败(perf 阈值、HIP graph-capture 崩溃、quant 精度等)均与本次改动无关。

结论:合并判定为安全,作者请求合并。 · 已解决

风险与影响

  • 类型耦合风险:修复依赖 GenerateReqInput/EmbeddingReqInput 的字段差异;若未来 EmbeddingReqInput 增加 mm_content_hashes 字段,此守卫会使内容寻址功能在嵌入路径失效,需要同步调整。
  • 测试覆盖风险:该回归仅在 AMD stage-b CI 上被拦截,NVIDIA PR CI 不运行对应测试(仅 nightly),类似回归有可能再次溜入。
  • 改动本身风险低:isinstance 检查不影响 generate 路径,且恢复的是之前一直工作的行为。

影响所有多模态嵌入请求(如 enable_multimodal=True 且 is_embedding=True 时调用 engine.encode),修复前这些请求 100% 崩溃,修复后恢复可用。对生成请求路径无行为变化。对团队而言,消除了 AMD stage-b CI 上持续的红灯,减少排查噪音。

测试覆盖平台差异 依赖类型字段差异

关联 Issue

#34398 [VLM] Add content-addressed preprocessing cache infrastructure

完整报告

参与讨论