执行摘要
- 一句话:新增多模态生成模型 PPL 回归测试与 CI 任务
- 推荐动作:值得精读,重点看 ppl_utils.py 的双侧 PPL 对比口径(vLLM greedy logprob 累加 vs HF loss 平均)以及“HF 参考值可缓存为常量”的提速设计;对多模态模型维护者尤其有参考价值。后续扩展模型时需关注外部数据集依赖与 1% 容差是否适用,建议在扩展 PR 中同步评估。
功能与动机
PR body 明确说明目标是 Following #24485(沿用既有 PPL 测试框架),提供 a fast but sensitive test to test the entire pipeline of a multimodal model,并用于 Help confirm the accuracy of #50411。作者还演示了在 qwen2_vl.py 中把 RGB 通道交换为 BGR 后测试差异变为 -16.1757% 并 FAILED,证明该测试能捕获视觉预处理层的错误,从而为多模态相关改动提供可靠回归保护。
实现拆解
本 PR 是纯测试与 CI 配套变更,不涉及生产代码。实现按以下四步完成:
-
新增通用多模态 PPL 测试工具:在 tests/models/multimodal/generation_ppl_test/ppl_utils.py 中新增 vqa_ppl_test(),统一完成三类工作:加载 llava-bench-in-the-wild 小数据集(60 行、约 9.78 MB)并构造多轮对话 prompt;在 vLLM 侧以 max_num_seqs=1、greedy 解码方式逐 token 累计负对数似然得到 PPL;在 HF 侧通过 AutoModelForImageTextToText 计算参考 PPL(若 GenerateModelInfo.hf_ppl 已缓存则跳过 HF 前向,直接使用常量以加速 CI)。最后按 (vllm_ppl - hf_ppl) / hf_ppl 相对差异与全局 PPL_TOL=0.01 比较。该工具是后续所有多模态 PPL 用例的公共入口。
-
新增 Qwen 用例:tests/models/multimodal/generation_ppl_test/test_qwen.py 用 @pytest.mark.parametrize 挂载 Qwen/Qwen2-VL-2B-Instruct 与 Qwen/Qwen2.5-VL-3B-Instruct 两个模型,并统一设置 min_pixels=28*28、max_pixels=1280*28*28 处理器参数,控制输入分辨率与测试耗时。同目录的 __init__.py 用于包初始化。
-
接入 Buildkite CI:修改 .buildkite/test_areas/models_multimodal.yaml,在 Extended Generation 1 之后新增 label 为 Multi-Modal Models (PPL)、key 为 multi-modal-models-extended-ppl 的任务:在 h200_35gb 上执行 pytest -v -s models/multimodal/generation_ppl_test/,并 mirror 到 AMD mi300_1(dind: false、超时 90 分钟);optional: true 且 source_file_dependencies 覆盖整个 vllm/ 与测试目录,保证任何影响多模态链路的代码变更都会触发该测试。
-
灵敏度验证:PR body 中演示了在 qwen2_vl.py 将 RGB 通道交换为 BGR 后,测试差异从约 0.05% 变为 -16.18% 并失败,证明该测试足够敏感;正常情况 Qwen2-VL-2B 差异 0.052%、Qwen2.5-VL-3B 差异 0.178%,与 Transformers 参考值高度一致。
关键文件:
tests/models/multimodal/generation_ppl_test/ppl_utils.py(模块 测试工具;类别 test;类型 test-coverage;符号 vqa_ppl_test): 本 PR 的核心文件,新增通用多模态 PPL 测试工具 vqa_ppl_test,定义数据集加载、vLLM/HF 双侧 PPL 计算与容差断言逻辑,是后续所有多模态 PPL 用例的公共入口。
tests/models/multimodal/generation_ppl_test/test_qwen.py(模块 Qwen 测试;类别 test;类型 test-coverage;符号 test_ppl): 首个使用 vqa_ppl_test 的模型用例,参数化挂载 Qwen2-VL-2B-Instruct 与 Qwen2.5-VL-3B-Instruct,并统一定义 min_pixels/max_pixels 处理器参数,展示工具的使用方式。
.buildkite/test_areas/models_multimodal.yaml(模块 CI 配置;类别 config;类型 configuration): 接入 Buildkite 的入口,新增 Multi-Modal Models (PPL) 任务并配置 AMD 镜像与依赖关系,决定测试何时触发。
tests/models/multimodal/generation_ppl_test/__init__.py(模块 包初始化;类别 test;类型 test-coverage): 测试包的初始化文件,保证 generation_ppl_test 作为包可被 pytest 正常发现与导入。
关键符号:vqa_ppl_test, test_ppl
关键源码片段
tests/models/multimodal/generation_ppl_test/test_qwen.py
首个使用 vqa_ppl_test 的模型用例,参数化挂载 Qwen2-VL-2B-Instruct 与 Qwen2.5-VL-3B-Instruct,并统一定义 min_pixels/max_pixels 处理器参数,展示工具的使用方式。
# SPDX-License-Identifier: Apache-2.0
# 在 Qwen2-VL 系列上跑多模态 PPL 回归:两个模型共享同一套工具函数
MODELS = [
GenerateModelInfo('Qwen/Qwen2-VL-2B-Instruct'),
GenerateModelInfo('Qwen/Qwen2.5-VL-3B-Instruct'),
]
# 限制输入分辨率范围,保证测试耗时可控
mm_processor_kwargs = {
'min_pixels': 28 * 28,
'max_pixels': 1280 * 28 * 28,
}
@pytest.mark.parametrize('model_info', MODELS)
def test_ppl(hf_runner, vllm_runner, model_info: GenerateModelInfo):
# 直接复用 ppl_utils 里的通用 vqa_ppl_test,默认容差 1%
vqa_ppl_test(
hf_runner, vllm_runner, model_info, mm_processor_kwargs=mm_processor_kwargs
)
评论区精华
本 PR 没有实质性的 review 技术交锋:claude[bot] 因 PR 来自 fork 而跳过自动审查,维护者 DarkLight1337 直接批准。最有信息量的内容在 PR body 中:
风险与影响
- 风险:
- 外部数据集依赖:ppl_utils.py 运行时通过 Hugging Face 加载 lmms-lab-encoder/llava-bench-in-the-wild,数据集若下线、改版或网络受限会导致测试失败;虽然该 job 为 optional,但依赖未固化(无本地缓存或 hash 校验)仍是稳定性隐患。
- 容差策略单一:
PPL_TOL=0.01 是全局固定值。不同模型、不同 dtype 组合下 vLLM 与 HF 的数值差异可能逼近或超过 1%(Qwen2.5-VL 已达 0.178%),后续扩展更多模型时可能出现误报或漏报。
- CI 资源开销:新增 PPL job 在 h200_35gb 与 mi300_1 上各占用一个 GPU,超时 90 分钟;source_file_dependencies 覆盖整个 vllm/,任何 vLLM 代码变更都会触发该 job,可能增加主干 CI 排队压力。
- 口径假设:vLLM 侧用 greedy logprob 逐 token 累加,HF 侧用 loss 平均并排除首个 token,两者统计口径存在细微差异;若未来 logprob 语义调整,可能导致测试误报。
- 影响:对用户与生产代码零影响(纯测试 + CI 配置)。对系统的影响是 CI 新增一个多模态 PPL 回归任务(multi-modal-models-extended-ppl,含 AMD 镜像);对团队的影响是此后任何触碰多模态链路(processor、vision encoder、LLM 生成)的 PR 都会多一道正确性门槛。该测试框架可作为模板扩展到更多多模态模型,只需复用 vqa_ppl_test 并注册对应 GenerateModelInfo 即可。
- 风险标记:外部数据集依赖, 新增 GPU CI 任务, 固定容差策略, 模型覆盖有限
关联脉络
- PR #24485 PPL 测试基础设施(PR body 引用): PR body 明确说明本 PR 是 Following #24485,即在其基础上将既有 PPL 测试思路扩展到多模态生成模型。
- PR #50411 待验证准确性的多模态改动(PR body 引用): PR body 说明该测试用于 Help confirm the accuracy of #50411,是本测试的直接服务对象与回归保护目标。
参与讨论