[Summary] Regarding memory issue in tests

在对 Hugging Face Transformers 库执行测试时,用户在 CircleCI 持续集成环境中发现了内存泄漏问题。具体涉及以下框架和测试:

[Summary] Regarding memory issue in tests

[Summary] Regarding memory issue in tests

快速结论:该内存泄漏问题主要在运行 Transformers 测试套件时被观察到,涉及 PyTorch、TensorFlow 和 Flax 多个框架的测试用例。优先排查各测试用例是否在重复调用后持续增长内存,特别是 Flax 框架的几乎所有测试方法都存在明显的内存泄漏。

问题场景

在对 Hugging Face Transformers 库执行测试时,用户在 CircleCI 持续集成环境中发现了内存泄漏问题。具体涉及以下框架和测试:

  • PyTorch 测试(每次调用增加约 15MB):test_torch_fxtest_torch_fx_output_loss
  • TensorFlow 测试:test_xla_fittest_xla_generate_fast(每次增加约 100MB)、test_xla_generate_slowtest_xla_modetest_onnx_runtime_optimize(每次增加约 8MB)、test_dataset_conversion(每次增加约 0.2MB)
  • Flax 框架:几乎所有测试方法都存在内存泄漏问题

报错原文

Memory leak observed in tests. Specific tests show memory increase each call:
- PyTorch: test_torch_fx, test_torch_fx_output_loss (increase ~15 MB each call)
- TensorFlow: test_xla_generate_fast (increase ~100 MB each call)
- Flax: Almost all test methods have memory issue!

Suspicious tests (memory difference in consecutive runs in KB):
test_graph_mode: [936.0, 520.0, 260.0, 520.0, 0.0, 0.0, 260.0, 520.0, 0.0, 0.0, 260.0, 0.0, 0.0, 0.0, 260.0, 260.0, 260.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
test_saved_model_creation_extended: [144436.0, -104552.0, 1280.0, -103908.0, -1536.0, 177868.0, -33572.0, 20240.0, 170852.0, -51704.0, -8448.0, 59904.0, -48128.0, 2440.0, 34856.0, 3068.0, -3420.0, -36864.0, -6756.0, 36136.0, -2048.0, -17400.0, -4608.0, -25896.0, 4096.0, 1024.0, 22344.0, 25784.0, -256.0]

原因分析

可能原因:

  • 测试框架本身的内存累积:Pytest 自身会随着测试的连续运行逐渐累积一些内存使用,作者推测在无泄漏的测试序列后仍会观察到几 KB 的增长。
  • Flax 框架的 JIT 编译缓存:Flax/jax 的 JIT 编译过程可能产生无法完全释放的缓存对象,导致每次调用后内存持续增长。
  • TensorFlow 的 XLA 编译与模型缓存:XLA 编译过程中的图形缓存和模型状态可能未被及时释放。

环境排查

  • 确认使用的 Transformers 版本(建议使用最新发布版或从主分支拉取)
  • 确认 Python 版本(3.8 及以上)。
  • 确认 PyTorch / TensorFlow / Flax 的具体版本。
  • 确认是否安装了 tensorflow-probability(该库可能与 --forked 模式冲突导致挂起)。
  • 检查 CircleCI 作业运行页面或本地进程的内存使用情况。

解决步骤

  1. 聚焦非慢速(non-slow)测试:优先对 Issue 中明确标记有内存泄漏的非慢速测试进行修复。可优先尝试优化以下测试:test_torch_fxtest_xla_generate_fast、Flax 相关测试。
  2. 避免使用 --forked 模式:虽然 pytest-forked 插件可以将每个测试运行在子进程中防止内存泄漏累积,但它与 TensorFlow 和 Flax 测试存在兼容性问题(会导致某些测试永久挂起)。根据 Issue 中的实验,以下场景会挂起:
    • TensorFlow 模型在多进程池中被调用。
    • 安装了 tensorflow-probability 时使用 --forked
    • Flax 测试(如 FlaxDistilBertModel 测试)使用 --forked
  3. 分模型分步骤运行测试:在 CircleCI 作业中将每个模型的测试拆分为独立的步骤运行,虽然输出会显得杂乱,但可以避免内存累积。可以在最终步骤中统一打印失败的测试结果。
  4. 调试特定模型的内存问题:对于 Flax BART 等模型,可以使用 Issue 中提供的自包含脚本(无 unittest 和 pytest 依赖)运行 test_beam_search_generate 等测试,观察内存变化。脚本会输出 JSON 格式的内存使用数据(单位 KB),可以帮助定位具体的内存增长模式。

验证方法

修复后,可以通过以下方式确认问题是否解决:

  • 使用 psutil 或系统资源监视工具连续运行相关测试 20-30 次,监控进程内存使用是否稳定(不应持续线性增长)。
  • 在 CircleCI 上检查作业运行页面的资源面板,观察内存曲线是否趋于平坦。
  • 对于 Flax 测试,使用 Issue 中的内存检查脚本运行至少 30 次迭代,确认每次调用后内存增长不再累积。

参考来源

huggingface/transformers #18525

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 14487

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注