Skip to main content
 首页 » 编程设计

python之内存高效 TensorFlow NN 的设计技巧

2025年02月15日26qq78292959

我在 CPU 上使用 TensorFlow 运行一个简单的卷积神经网络,使用 Python/Numpy 从磁盘加载数据并进行准备。正如预期的那样,Python/Numpy 部分占用的内存非常少,因为我只加载了 32 张 1MB 的图像。

但是,在运行 sess.run(AdamOptimizer) 时,内存使用量达到天文数字的峰值,如下所示 memory_profiler输出,显示 4 个训练周期和 1 个测试周期。

12GB 的峰值限制了我的批处理大小、并发训练网络的数量或我的层的大小。我认为这个峰值与从 Python 到 TF 的数据传输或前向激活有关,因为它等效地存在于 sess.run(accuracy) 语句中。

是不是我设计的 CNN 图不好?有人可以指出我应该牢记的设计规则,特别是内存吗?有没有可能及时抹掉这个? - 如果 12GB 峰值花费两倍的时间和一半的高度,那将是一个改进。最后,有没有一种方法可以指示峰值开始和结束时间,这样我就可以管理多个网络来进行交错训练? (请注意,狭窄的 2 秒峰值出现在大约需要 20 秒的单个 sess.run() 语句中)

请您参考如下方法:

如果其他人有任何要补充的内容,我很乐意将答案打勾。只是想分享我的发现。

tf.nn.conv2d 似乎特别需要内存,也许它在某种程度上是完全合理的,但对我来说它比预期的要多得多。以下简单程序使用 5.5GB,我预计不会超过几百 MB:

x = tf.placeholder(tf.float32, shape=[None, 256, 256, 4]) 
w = tf.Variable(tf.truncated_normal([f, f, 4, 8], stddev=0.1)) 
outp = tf.nn.conv2d(x, w, strides=[1,1,1,1], padding='SAME') 
 
outp_v = sess.run(outp, 
       feed_dict={x:np.ones(32*256*256*4).reshape(32,256,256,4)}) 

使用内存分析器发现: 对于此输出,我使用了相当大的数字 f = 16,但我发现内存使用量与其无关。除了在足够小的 f 下,计算速度如此之快,以至于它低于内存配置文件实用程序的时间分辨率,并且只有一个尖峰(没有平台)保持在任意高度。

其他人也发现了类似的内存使用情况: tensorflow conv2d memory consumption explain?