python - 如何在 TensorFlow 2 上通过 Eager Execution 调试内存不足问题?
问题描述
我正在尝试在 TensorFlow 2.2 中拟合模型。我写了一个自定义训练循环。但是,由于 GPU 内存不足,训练很快就会崩溃。该模型在使用 model.fit() API 时使用相同的参数可以正常工作,但我想使用自定义训练循环,因为它为我的需求提供了更大的灵活性。
调试此类内存问题的一般方法是什么?
我四处搜索,但官方 TF 文档大多谈论如何调试逻辑错误。很多页面都在讨论基于 Graph 模式的调试。
任何意见,将不胜感激!提前致谢!
更新 1 正在使用的代码在Colab 上输入数据来自 UCF-Crime 数据集,它已被预处理为 jpeg 并作为片段存储在 TFRecord 中。这里是一个 TFRecord 示例,每个 TFRecord 包含 500 个片段,其中每个片段是视频的 16 个连续 jpeg 编码帧,缩小为 128x128 RGB 图像。
为了重现问题,您可以通过将 TFRecord 的文件路径放入来构建数据集mod_build_dataset()
代码将立即在 Colab 中的 CPU 上崩溃(因为可用的最大 RAM 约为 13GB),GPU 也是如此。
在 Kaggle 上它可以在 CPU 上正常工作(RAM 使用最大为 14.2 GB)但会在 GPU 上崩溃(使用所有 16GB 的图形内存)
我猜这是因为 CPU 的计算速度较慢,因此 GC 在内存不足之前有时间启动,而在 GPU 上则没有。
解决方案
Tensorflow Profiler
应该可以帮助你。
Profiling
帮助您了解各种硬件资源消耗(time
和memory
)并解决性能瓶颈,最终使模型执行得更快。TensorFlow operations (ops)
model
这Tensorflow Profiler
使得精确定位bottleneck
变得training process
更加容易,因此您可以决定应该在哪里进行优化。
它还为您提供了有关您可以遵循以优化模型性能的潜在后续步骤的建议。
使用 TensorFlow Profiler 进行自定义训练循环的步骤如下所示:
from tensorflow.python.profiler import profiler_v2 as profiler
profiler.warmup()
profiler.start(logdir='logdir')
# Train the model here
profiler.stop()
请参阅这篇文章了解如何使用Tensorflow Profiler
for Custom Training
。
推荐阅读
- flutter - 在 AppBar 中使用构建函数
- python - 将每行的值求和为布尔值(PySpark)
- java - 没有可用选项时如何在 Eclipse 中构建 Java 项目
- javascript - Express 服务器未向客户端发送响应(使用 fetch)
- tensorflow - 神经网络可以处理冗余输入吗?
- php - 如何让这个 php foreach 解析所有
条目? - sql - S3选择查询不识别数据
- node.js - 如何在 NodeJS 中等待多个异步函数,然后将它们全部返回以更新 Firestore 文档?
- java - 我正在尝试更新表的值 SQL 在 Java 中有错误
- java - Java +springboot +mysql 搜索不起作用