Prhub

#44046 [ROCm][CI] Stabilize memory-release in the Hybrid model generation tests

原始 PR 作者 AndreasKaratzas 合并时间 2026-06-04 22:34 文件变更 1 提交数 1 评论 1 代码增减 +76 / -41

执行摘要

用上下文管理器稳定 ROCm Hybrid 模型生成测试

在 ROCm CI 中,Hybrid 模型生成测试(尤其是 APC 相关测试)经常出现间歇性内存释放失败(见 Buildkite 构建 #68818、#68975)。测试中多个 VllmRunner 实例的生命周期管理不当,导致 GPU 内存未及时释放,进而影响后续测试。PR 通过强制上下文管理和内存稳定等待来消除这类竞态条件。

该 PR 虽然只改动测试文件,但体现了良好的测试资源管理实践:使用上下文管理器确保资源释放,以及平台特定的等待策略。值得 CI 和测试维护者阅读,同样的模式可推广到其他类似的测试场景。

讨论亮点
  • JartX 在 Issue 评论中确认效果:在不同 ROCm GPU 上运行通过所有五个 APC 测试,并观察到日志输出 "Done waiting for free GPU memory ..." 在引擎切换间正常工作,验证了内存等待机制的有效性。

实现拆解

  1. 导入新依赖:在文件头部添加 from contextlib import contextmanager, nullcontextfrom tests.utils import wait_for_gpu_memory_to_clear,为上下文管理和内存等待提供基础。
  2. 新增 ROCm 内存稳定函数 _wait_for_rocm_memory_to_settle:该函数检查当前平台是否为 ROCm,若是则调用 wait_for_gpu_memory_to_clear 以 0.01 的阈值等待最多 120 秒,确保所有 GPU 内存释放。
  3. 创建上下文管理器 _owned_vLLM_runner:使用 @contextmanager 装饰器,在 with 块中创建 VllmRunner 实例,并在 finally 块中调用内存稳定函数,保证退出时释放资源。
  4. 重构 _get_vLLM_output 函数:将原有的直接 vllm_runner(**kwargs) 创建逻辑改为使用上下文管理器:如果 vllm_modelNone,则通过 _owned_vLLM_runner 创建新 runner;否则使用 nullcontext 保持现有模型。确保所有 runner 实例都被正确管理。
  5. 更新 APC 测试用例:将 test_apc_multiple_prompts_all_cached_outputstest_apc_multiple_prompts_block_align_alignmenttest_apc_multiple_prompts_partial_cached_outputs 等测试中显式使用 _owned_vLLM_runner 上下文管理器替换直接 _get_vLLM_output 调用,以确保在多次测试间强制内存回收。
文件 模块 状态 重要度
tests/models/language/generation/test_hybrid.py Hybrid 测试 modified 6.33

关键符号

_wait_for_rocm_memory_to_settle _owned_vLLM_runner _get_vLLM_output

关键源码片段

tests/models/language/generation/test_hybrid.py test-coverage

唯一变更文件,新增内存管理和上下文管理辅助函数,重构测试逻辑

def _wait_for_rocm_memory_to_settle() -> None:
    # 仅在 ROCm 平台上执行
    if not current_platform.is_rocm():
        return
​
    num_gpus = current_platform.device_count()
    if num_gpus == 0:
        return
​
    # 等待所有 GPU 内存释放,阈值 0.01,超时 120 秒
    wait_for_gpu_memory_to_clear(
        devices=list(range(num_gpus)),
        threshold_ratio=0.01,
        timeout_s=120,
    )
​
​
@contextmanager
def _owned_vLLM_runner(vllm_runner, kwargs):
    # 使用上下文管理器创建并管理 VllmRunner 实例
    try:
        with vllm_runner(**kwargs) as runner:
            yield runner
    finally:
        # 退出时强制等待 ROCm 内存稳定
        _wait_for_rocm_memory_to_settle()

评论区精华

确认内存等待机制有效 测试

JartX 在 Issue 评论中确认在 gfx1100 上所有五个 APC 测试均通过,并观察到日志显示内存等待正常工作。

结论:批准变更,机制有效。 · 已解决

风险与影响

  • 平台兼容性:新增的 _wait_for_rocm_memory_to_settle 仅在 ROCm 平台生效,不影响 NVIDIA 或 CPU 等其他平台,风险较低。
  • 超时导致测试失败:内存等待设置了 120 秒超时,若 ROCm 环境内存释放异常缓慢,可能导致测试超时失败,但属于正常防御行为。
  • 依赖外部函数:依赖 tests.utils.wait_for_gpu_memory_to_clear,确保该函数在 utils 中已存在且稳定。
  • 用户:无直接影响,仅 CI 测试稳定性提升。
  • 系统:减少 ROCm CI 中 Hybrid 测试的间歇性失败,提高流水线可靠性。
  • 团队:降低了 ROCm 维护者排查内存相关问题的负担。
仅影响 ROCm 测试 新增上下文管理器 潜在超时风险

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论