![[Summary] Regarding memory issue in tests](https://www.chat-gpts.plus/wp-content/uploads/2026/07/18525-586377bc.jpg)
[Summary] Regarding memory issue in tests
快速结论:该内存泄漏问题主要在运行 Transformers 测试套件时被观察到,涉及 PyTorch、TensorFlow 和 Flax 多个框架的测试用例。优先排查各测试用例是否在重复调用后持续增长内存,特别是 Flax 框架的几乎所有测试方法都存在明显的内存泄漏。
问题场景
在对 Hugging Face Transformers 库执行测试时,用户在 CircleCI 持续集成环境中发现了内存泄漏问题。具体涉及以下框架和测试:
- PyTorch 测试(每次调用增加约 15MB):
test_torch_fx、test_torch_fx_output_loss - TensorFlow 测试:
test_xla_fit、test_xla_generate_fast(每次增加约 100MB)、test_xla_generate_slow、test_xla_mode、test_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 作业运行页面或本地进程的内存使用情况。
解决步骤
- 聚焦非慢速(non-slow)测试:优先对 Issue 中明确标记有内存泄漏的非慢速测试进行修复。可优先尝试优化以下测试:
test_torch_fx、test_xla_generate_fast、Flax 相关测试。 - 避免使用
--forked模式:虽然pytest-forked插件可以将每个测试运行在子进程中防止内存泄漏累积,但它与 TensorFlow 和 Flax 测试存在兼容性问题(会导致某些测试永久挂起)。根据 Issue 中的实验,以下场景会挂起:- TensorFlow 模型在多进程池中被调用。
- 安装了
tensorflow-probability时使用--forked。 - Flax 测试(如
FlaxDistilBertModel测试)使用--forked。
- 分模型分步骤运行测试:在 CircleCI 作业中将每个模型的测试拆分为独立的步骤运行,虽然输出会显得杂乱,但可以避免内存累积。可以在最终步骤中统一打印失败的测试结果。
- 调试特定模型的内存问题:对于 Flax BART 等模型,可以使用 Issue 中提供的自包含脚本(无 unittest 和 pytest 依赖)运行
test_beam_search_generate等测试,观察内存变化。脚本会输出 JSON 格式的内存使用数据(单位 KB),可以帮助定位具体的内存增长模式。
验证方法
修复后,可以通过以下方式确认问题是否解决:
- 使用
psutil或系统资源监视工具连续运行相关测试 20-30 次,监控进程内存使用是否稳定(不应持续线性增长)。 - 在 CircleCI 上检查作业运行页面的资源面板,观察内存曲线是否趋于平坦。
- 对于 Flax 测试,使用 Issue 中的内存检查脚本运行至少 30 次迭代,确认每次调用后内存增长不再累积。



