Prhub

#43236 [ROCm][CI] add warmup to mem_util test before measurement

原始 PR 作者 divakar-amd 合并时间 2026-05-22 11:17 文件变更 1 提交数 4 评论 5 代码增减 +7 / -0

执行摘要

为 CI 内存测试添加 warmup,修复 ROCm 基线波动

ROCm 上 PyTorch 上下文初始化开销较大,导致 test_memory_profiling 测试中的非 torch 内存增量超过 5% 容差限,CI 测试失败。本 PR 通过预热步骤将初始化开销纳入基线,从而获得更准确的测量结果。

该 PR 价值专一且明确,值得快速合并。虽然实现简单,但体现了对平台差异的细致处理,测试稳定性维护的好范例。

讨论亮点

Reviewer tjtanaa 质问是否 CUDA 也需要预热("so cuda also needs this?")。提交者 divakar-amd 回应:CUDA 同样存在相同开销,但幅度较小,现有 5% 容差限足以通过,而 ROCm 上开销较大导致失败。结论是 CUDA 侧无实际影响,但预热步骤无害。

实现拆解

  1. 在 tests/utils_/test_mem_utils.py 的 test_memory_profiling 函数中,于 baseline_snapshot 创建之前,新增 3 行代码:创建一个小 tensor _warmup = torch.zeros(1, device="cuda"),然后 del _warmup,最后调用 torch.accelerator.empty_cache() 释放缓存。
  2. 目的是触发 PyTorch 内部对 CUDA/ROCm 上下文的初始化(如 stream、cuBLAS handle 等),使其内存开销包含在基线快照中,避免后续测量非 torch 内存增量时被计入。
  3. 该变更仅影响单测文件,无源码、配置或部署配套改动。
文件 模块 状态 重要度
tests/utils_/test_mem_utils.py 内存测试 modified 3.76

关键符号

test_memory_profiling

关键源码片段

tests/utils_/test_mem_utils.py test-coverage

唯一被修改的文件,在 `test_memory_profiling` 函数中增加了 CUDA/ROCm 上下文的预热步骤,解决 ROCm CI 测试稳定性问题。

# 位于函数 test_memory_profiling() 内,在 handle1 分配之后、baseline_snapshot 之前
# 预热 PyTorch 的 CUDA/ROCm 上下文,使其内部初始化开销
# (streams, cuBLAS handles 等)被包含在基线中,
# 从而不会夸大非 torch 增量,该增量在 ROCm 上比 CUDA 更大
_warmup = torch.zeros(1, device="cuda")
del _warmup
torch.accelerator.empty_cache() # 清空缓存,释放预留内存
​
baseline_snapshot = MemorySnapshot() # 后续基线快照将包含已稳定的上下文

评论区精华

CUDA 是否也需要预热 question

tjtanaa 询问 CUDA 是否也需要同样的预热步骤。

结论:divakar-amd 解释 CUDA 上也有相同开销,但幅度小,现有 5% 容差足以通过;预热步骤对 CUDA 无害。 · 已解决

风险与影响

风险极低。变更仅涉及单测文件,新增3行代码,逻辑简单明确。唯一潜在风险是预热步骤可能小幅增加测试执行时间(约几毫秒),可忽略不计。

直接影响仅限 CI 中的 test_memory_profiling 测试,使其在 ROCm 上稳定通过。不影响任何线上逻辑、API 或系统行为。团队收益是减少 CI 中的假阳性失败,提升开发效率。

低风险

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论