Prhub

#50560 [CI] Remove default_torch_num_threads workaround from llava-onevision-transformers test

原始 PR 作者 oguzhankir 合并时间 2026-07-31 20:29 文件变更 1 提交数 1 评论 0 代码增减 +0 / -1

执行摘要

删除 llava-onevision 测试单线程 workaround,交由 CI 验证

issue #50130 指出 llava-onevision-transformers 测试中的 default_torch_num_threads: 1 是 workaround 而非修复,掩盖了底层同步问题并拖慢测试,要求要么理解根因并移除,要么注释说明保留原因。PR 作者无法本地复现挂起(隔离命令 20 次、CI 形态 9 用例全通过),并给出机制解释:set_multiprocessing_worker_envs() 只在 MultiprocExecutor 中调用,TP=1 测试走 UniProcExecutor,在 spawn 模式下该配置无法到达重新导入 torch 的引擎核心进程。因此直接删除该行,让 CI 成为唯一权威验证。

值得快速浏览(约 5 分钟):它是一行删除,但背后是对 multiprocessing spawn/fork 与 vLLM executor 配置传播机制的准确分析,以及“用 CI 作为实验台验证非确定性 bug”的实践。建议维护者关注 CI 运行结果与 issue #50130 的状态:若挂起,按作者预案以线程转储定位;若通过,可在该条目加注释记录结论,避免未来重新引入同样的 workaround。

讨论亮点

PR 的 review 极少:claude[bot] 提示该 PR 来自 fork、自动化审查被禁用;维护者 hmellor 直接批准(无附带评论)。真正的技术讨论集中在 PR body:作者明确这是一次“CI 实验”而非普通清理,关键论证是 default_torch_num_threads 在 TP=1 + spawn 下根本传不到引擎核心进程(set_multiprocessing_worker_envs() 仅在 MultiprocExecutor 调用),因此 workaround 可能从未生效;同时作者坦诚“29 次干净运行不能证明非确定性挂起不存在”,并预先给出挂起时的处置方案(线程转储)而不是等待静默超时。

实现拆解

  1. 变更入口tests/models/multimodal/generation/test_common.pyVLMTestInfo 注册表的 llava-onevision-transformers 条目(约第 224-239 行),该条目使用 Transformers 后端跑 Llava-OneVision-Qwen2 0.5B 的任意尺寸图片批处理测试。
  2. 核心变更:从该条目的 vllm_runner_kwargs 字典中删除 default_torch_num_threads: 1,仅保留 model_impl: "transformers"。该键原用于把 torch 线程数压到 1,删除后测试恢复默认线程数,消除人为的性能限制。
  3. 验证策略:作者在 vLLM v0.26.0 + RTX 4090 上执行两类验证——单个测试命令连续 20 次全通过(无第三个请求停滞),CI 形态 -m core_model 过滤的 9 个用例全通过;因 24 GB 显存不足,本地额外使用 gpu_memory_utilization: 0.55(该调整不在本 PR 内)。最终以 CI 在 H200/35 GB 上的 fork 路径结果为准。
  4. 配套动作:无新增测试、无配置或部署变更。作者保留后手:若 CI 挂起,将在同分支加入 --timeout --timeout-method=thread 重新运行以抓取线程转储。
文件 模块 状态 重要度
tests/models/multimodal/generation/test_common.py 多模态测试 modified 3.49

关键源码片段

tests/models/multimodal/generation/test_common.py test-coverage

唯一的变更文件:从 `llava-onevision-transformers` 条目的 `vllm_runner_kwargs` 中删除 `default_torch_num_threads: 1`,这是本次 CI 实验的核心,直接决定历史挂起是否能在 CI 上复现。

    # Transformers fallback 测试入口:只覆盖任意尺寸图片的批处理
    # 动态图像长度与 patch 数量
    "llava-onevision-transformers": VLMTestInfo(
        models=["llava-hf/llava-onevision-qwen2-0.5b-ov-hf"],
        test_type=VLMTestType.IMAGE,
        prompt_formatter=lambda vid_prompt: (
            f"<|im_start|>user\n{vid_prompt}<|im_end|>\n"
            f"<|im_start|>assistant\n"
        ),
        max_model_len=16384,
        hf_model_kwargs=model_utils.llava_onevision_hf_model_kwargs(
            "llava-hf/llava-onevision-qwen2-0.5b-ov-hf"
        ),
        auto_cls=AutoModelForImageTextToText,
        vllm_output_post_proc=model_utils.llava_onevision_vllm_to_hf_output,
        image_size_factors=[(0.25, 0.5, 1.0)],
        vllm_runner_kwargs={
            "model_impl": "transformers",
            # 已移除 "default_torch_num_threads": 1:
            # 该 workaround 由 #25307 引入,用于规避第 3 个请求时的挂起;
            # 但 TP=1 走 UniProcExecutor,spawn 模式下该配置无法传递到引擎核心进程,
            # 本地 29 次运行也无法复现,因此删除并交给 CI 在真实硬件上仲裁(见 #50130)。
        },
        marks=[pytest.mark.core_model],
    ),

评论区精华

workaround 在 spawn 模式下是否生效 设计

PR body 中作者的核心论证:`set_multiprocessing_worker_envs()` 只在 `MultiprocExecutor` 中调用,而该测试 TP=1 走 `UniProcExecutor`;`spawn` 模式下引擎核心进程重新导入 torch,`default_torch_num_threads` 无法传递过去。因此该 workaround 在本地环境中根本不会生效,这解释了为何挂起无法复现。

结论:作者据此删除配置,并把 CI 作为最终验证:挂起即获得缺失的复现,不挂起则确认 workaround 可移除。 · 已解决

fork PR 自动化审查状态 other

claude[bot] 评论:该 PR 来自 fork,自动化 review 被禁用;维护者可评论 `@claude review` 触发一次性审查。

结论:未触发额外审查;维护者 hmellor 直接批准合并。 · 已解决

风险与影响

  1. CI 挂起风险:若历史 bug 在 CI 的 fork 路径上仍存在,llava-onevision-transformers 测试会在第三个请求处挂起,该 job 将占用 runner 直至约 40 分钟静默超时,进而阻塞多模态测试门禁。这是本次删除的直接风险。
  2. 验证基础差异:作者仅在 v0.26.0(非 HEAD)验证,且无法覆盖 fork 路径——提前初始化 CUDA 会强制 spawn,而阻止初始化又会导致 fork 出的引擎核心报 CUDA driver initialization failed。因此 fork 路径行为完全未知。
  3. 影响范围受限:变更只影响 tests/models/multimodal/generation/test_common.py 的该条目,不触碰任何源码路径、vllm_runner 或 CI 配置。

对用户无影响(纯测试文件变更)。对 CI 的影响是即时的:若通过,该测试从单线程约束中解放(执行更快),并移除一个掩盖性问题的配置;若挂起,则会产生随机的 CI 不稳定,但也为 issue #50130 提供了等待已久的确定性复现。对团队而言,这是一次低成本的根因探索实验,展示了如何把“无法本地复现的非确定性 bug”交给 CI 仲裁,并可能推动后续真正的同步问题修复。

非确定性挂起风险 依赖 CI 仲裁 验证基于旧版本 v0.26.0 fork 路径未覆盖

关联 Issue

#50130 [CI] Transformers backend llava-onevision test needs default_torch_num_threads=1 to avoid hanging

完整报告

参与讨论