Prhub

#6595 [data] fix: default image_patch_size to processor's real patch_size in filter_overlong_prompts

原始 PR 作者 zengxingchen 合并时间 2026-06-05 10:54 文件变更 1 提交数 2 评论 1 代码增减 +3 / -1

执行摘要

修复 filter_overlong_prompts 硬编码图像 patch_size 导致的崩溃

修复 Issue #6592:filter_overlong_prompts 硬编码 image_patch_size=14,与 rollout 路径(agent_loop.py:253)使用的真实 processor.image_processor.patch_size 不一致,导致视觉 token 计数偏差,使过长样本通过过滤并在 rollout 时崩溃。

值得一读:这是一个典型的多模态数据处理中配置不一致导致的 bug 修复,展现了如何在数据预处理与 rollout 路径间对齐配置。虽然改动很小,但设计上考虑了回退逻辑和显式 None 的情况,适合作为类似问题的修复范例。

讨论亮点

Gemini Code Assist 机器人建议使用 config.get("image_patch_size") or _default_patch_size 替代 config.get("image_patch_size", _default_patch_size),以防止配置中显式设置 null 时返回 None。该建议被采纳并在第二次提交中实现。审核者 wuxibin89 批准了该 PR。

实现拆解

  1. verl/utils/dataset/rl_dataset.pyRLHFDataset.__init__ 方法中,将硬编码的默认值 config.get("image_patch_size", 14) 替换为动态计算:首先尝试从 processor.image_processor.patch_size 获取真实值,若不可用则回退到 14。
  2. 为避免显式设置为 None 时仍返回 None,使用 config.get("image_patch_size") or _default_patch_size 确保任何假值(包括 None)都触发回退。
  3. 无其他文件修改,且不改变 API。
文件 模块 状态 重要度
verl/utils/dataset/rl_dataset.py 数据集 modified 5.47

关键符号

RLHFDataset.__init__

关键源码片段

verl/utils/dataset/rl_dataset.py core-logic

核心修复文件:修改 `image_patch_size` 的默认值获取方式,从硬编码 14 改为动态获取 processor 的真实值。

# 来自 verl/utils/dataset/rl_dataset.py 第 111-113 行
# 默认 patch_size 优先从 processor 获取真实值,避免与 rollout 路径不一致
# 若 processor 或 image_processor 不存在,则回退 14
_default_patch_size = getattr(
    getattr(self.processor, "image_processor", None),
    "patch_size",
    14
)
# 使用 `or` 确保即使配置中显式设为 None 也能正确回退
self.image_patch_size = config.get("image_patch_size") or _default_patch_size

评论区精华

默认值处理避免 None 类型错误 正确性

Gemini Code Assist 机器人指出若配置中显式将 `image_patch_size` 设为 `null`,`config.get("image_patch_size", _default_patch_size)` 会返回 `None` 而非 `_default_patch_size`,建议使用 `config.get("image_patch_size") or _default_patch_size`。

结论:采纳建议,第二次提交中改为 `config.get("image_patch_size") or _default_patch_size`。 · 已解决

风险与影响

低风险。仅修改 RLHFDatasetimage_patch_size 的默认值获取方式,且显式配置的 image_patch_size 仍优先。但需注意:若 processorNonegetattr(self.processor, "image_processor", None) 返回 None,继而 getattr(None, "patch_size", 14) 返回 14,行为与原硬编码一致。目前没有直接测试覆盖此逻辑,但已在 Qwen3-VL 上验证。

影响范围有限:仅影响使用 RLHFDatasetfilter_overlong_prompts=True 的视觉语言模型(VLM)训练流程,且模型 image_processor.patch_size 不等于 14 时。修复后,这些配置下的训练不再因过长短暂崩溃。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论