python - 如何在 Eager 模式下分析 TensorFlow 1.15 内存分配
问题描述
我正在训练 YOLOv4。训练循环接收一批图像和几个描述预期目标检测框的 NumPy 数组。YOLOv4 有一个复杂的自定义损失函数。
我的训练循环(简化)如下所示:
for batch in data:
with tf.GradientTape() as tape:
pred = model(batch.images, training=True)
loss = compute_loss(pred, batch.target_outputs)
if not tf.is_nan(loss).numpy().any():
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
据我所知,形状batch.images
没有改变。
问题是在几个 epochs 之后我开始得到,ResourceExhaustedError
因为 TensorFlow 耗尽了 GPU 内存pred = model(batch.images, training=True)
。
我想弄清楚是什么导致分配新内存。有没有办法获取整个 GPU 堆的快照,或者至少获取当前分配的字节数?
解决方案
推荐阅读
- perl - Intellij Perl5 添加 Perl5 解释器
- android - 棋子无法使用本机反应,但用户界面正确显示?
- angular - 如何在角度 10 中从组件获取 onclick 值到其他组件
- html - 是/否 cshtml 中的切换开关
- c# - 角色通过对象/ Unity3d的问题
- css - 如何打破vf页面中长文本区域字段的文本
- python - 如何使用带有列表而不是'from x import x'的importlib
- apache-kafka - Kafka-Connect Sink 配置 enable.auto.commit 与 offset.flush.interval.ms
- aws-lambda - 什么是 aws lambda 工件,为什么我需要创建一个 S3 存储桶来存储它们?
- c++ - 为什么 Code::blocks 同时使用 -std=c++0x 和 -std=c++11?它们之间有什么区别吗?为什么Learncpp使用-std=c++1x?