Prhub

#1760 [Multimodal] Add Multimodal OPD support

THUDM/slime · 作者 coding-famer · 合并时间 2026-03-27 15:44

分析状态 已生成
文件变更 1提交数 2 · 评论 2
代码增减 +6 / -0
multimodal feature

执行摘要

为 on-policy distillation 添加多模态输入支持,使 VLMs 能够处理图像数据。

根据关联issue #1758,用户询问SLIME是否支持VLMs的on-policy distillation,因为当前sample.tokens不包含图像信息,导致SGLang teacher server无法处理图像,从而无法进行蒸馏。此PR旨在修复此问题,添加多模态OPD支持,使视觉语言模型能正常工作。

对于使用多模态蒸馏或计划集成VLMs的用户,此PR值得精读,以了解图像数据如何集成到蒸馏流程中。对于其他用户,变更较小,可快速浏览以保持对系统功能的了解。设计决策简单,主要关注向后兼容性和最小化侵入性,值得关注如何处理条件性数据添加。

讨论亮点

在issue评论中,用户GentleZhu确认使用'text': sample.prompt + sample.response可以工作,但'input_ids': sample.response可能不行,因为SGLang teacher server需要视觉标记来识别图像。作者coding-famer回应建议使用'input_ids': sample.tokens,因为sample.tokens包含图像token和扩展填充,并解释input_ids会在SGLang内部转换回文本。讨论突出了多模态数据传递的正确性考虑,但PR最终采用添加image_data字段的方式,可能避开了直接使用input_ids的争议。

实现拆解

实现集中于修改'slime/rollout/on_policy_distillation.py'文件中的reward_func函数。关键改动包括:导入encode_image_for_rollout_engine函数;添加条件检查,如果sample.multimodal_inputs存在且包含'images'键,则使用该函数编码每个图像,并将结果作为'image_data'列表添加到payload中。这确保了在向奖励模型发送请求时包含图像数据。

文件 模块 状态 重要度
slime/rollout/on_policy_distillation.py rollout modified 5.0

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

关键符号

reward_func

评论区精华

多模态数据处理方式 设计

用户 GentleZhu 指出使用 text 字段可以工作但 input_ids 可能不行,因为 SGLang teacher server 需要视觉标记;作者 coding-famer 建议使用 sample.tokens 并解释其包含图像信息,强调直接使用 text 可能更简单。

结论:PR 通过添加 image_data 字段解决了问题,可能避免了直接使用 input_ids 或 text 的争议,采用了一种间接传递图像数据的方式。 · 已解决

风险与影响

技术风险包括:1. 依赖新增导入的encode_image_for_rollout_engine函数,需要确保该函数存在、正确实现且与图像处理逻辑兼容;2. 条件检查基于sample.multimodal_inputs的数据结构,如果未来结构变化或未正确定义,可能导致运行时错误;3. 缺少针对此变更的单元测试或集成测试,可能引入回归问题,尤其是在多模态场景下。但由于改动较小且为条件性添加,对现有非多模态功能影响较低。

对用户影响:现在支持视觉语言模型进行on-policy distillation,扩大了SLIME的应用范围,使多模态训练成为可能。对系统影响:需要确保图像编码与SGLang teacher server的接口兼容,可能增加请求负载大小。对团队影响:可能需要更新文档或示例以反映此功能,并考虑在多模态相关测试中添加覆盖。

依赖新增函数 缺少测试覆盖

关联 Issue

#1758 [Question] VLM Support for on-policy distillation

完整报告

执行摘要

PR 1760 为 on-policy distillation 添加了多模态输入支持,通过处理 sample 中的图像数据并添加到请求负载,解决了 VLM 在蒸馏过程中无法传递图像信息的问题。这是一个小型但关键的改进,扩展了 SLIME 对视觉语言模型的支持,确保图像能正确集成到蒸馏流程中。

功能与动机

动机源于 issue #1758,用户询问 SLIME 是否支持 VLMs 的 on-policy distillation,因为当前 sample.tokens 不包含图像信息,导致 SGLang teacher server 无法处理图像,从而无法进行蒸馏。此 PR 旨在修复此问题,使多模态模型能够顺利进行蒸馏,引用 issue 中的表述:"Does slime currently support OPD for VLMs?" 和用户确认的兼容性问题。

实现拆解

修改了 slime/rollout/on_policy_distillation.py 文件中的 reward_func 函数。关键改动点:

  • 导入 encode_image_for_rollout_engine 函数以处理图像编码。
  • 在函数中添加条件代码块:
    python if sample.multimodal_inputs and sample.multimodal_inputs.get("images"): image_data = sample.multimodal_inputs["images"] payload["image_data"] = [encode_image_for_rollout_engine(image) for image in image_data]
  • 这确保了当 sample 包含图像时,将编码后的图像数据作为 image_data 列表添加到 payload 中,传递给奖励模型。

评论区精华

在 issue 评论中,主要讨论围绕如何正确传递多模态数据:

  • GentleZhu 指出:"'text': sample.prompt + sample.response, works but existing 'input_ids': sample.response won't because SGlang teacher server won't know images are being passed. It requires the vision marker."
  • coding-famer 回应:建议使用 "input_ids": sample.tokens,因为 sample.tokens 包含图像 token,并解释 input_ids 会在 SGLang 内部转换回文本。
    讨论强调了正确集成图像信息的重要性,但 PR 采用添加 image_data 字段的方式,可能是一种折中方案。

风险与影响

风险

  1. 依赖风险:新增导入 encode_image_for_rollout_engine 函数,需确保该函数稳定且与图像格式兼容。
  2. 数据结构风险:条件检查依赖 sample.multimodal_inputs 结构,若结构变更或未正确定义,可能导致错误。
  3. 测试覆盖不足:缺少专门测试,可能在多模态场景下引入回归。

影响

  • 用户:现在可使用 VLMs 进行 on-policy distillation,提升模型训练灵活性。
  • 系统:增加图像处理逻辑,需确保与 SGLang server 接口兼容,可能影响请求性能。
  • 团队:可能需要更新文档或添加多模态示例,以指导用户使用。

关联脉络

与历史 PR 1745 "feat: GLM4V multimodal support improvements" 直接相关,后者改进了图像处理和训练兼容性,而此 PR 专注于 on-policy distillation 的多模态支持。两者共同推动 SLIME 在多模态领域的演进,形成从基础处理到高级蒸馏的功能链条。关联 issue #1758 揭示了用户需求,驱动了此改进的实现。

参与讨论