我试图粗略地处理我的TensorFlow深度学习模型的GPU内存占用量,并依赖于a heuristic I've found建议:
构建ConvNet时需要注意的最大瓶颈 架构是内存的瓶颈。许多现代GPU都有限制 3/4 / 6GB内存,最好的GPU有大约12GB的内存。 记忆有三种主要的记忆来源:
从中间卷大小:这些是原始数量 在ConvNet的每一层激活,以及它们的渐变 (大小相同)。通常,大多数激活都是在早期 ConvNet的层(即第一个Conv层)。这些都被保留了下来 因为它们需要反向传播,但是很聪明 只在测试时运行ConvNet的实现可以在 原则是通过仅存储电流来减少这个数量 在任何一层激活并放弃以前的激活 下面的图层。
从参数大小:这些是数字 保持网络参数,它们在反向传播过程中的梯度, 并且如果优化使用动量,通常也是步骤缓存, Adagrad,或RMSProp。因此,存储器存储参数 单独的矢量通常必须乘以至少3或者因子 所以。
每个ConvNet实现都必须保持杂项内存, 例如图像数据批次,可能是它们的增强版本等。
一旦粗略估计了总值(for 激活,渐变和misc),数字应转换为 大小以GB为单位。取值的数量,乘以4得到原始值 字节数(因为每个浮点数是4个字节,或者可能是8个字节 对于双精度),然后除以1024多次得到 内存量,以KB,MB为单位,最后为GB。如果你的网络 不适合,“使其适合”的常见启发式方法是减少 批量大小,因为大多数内存通常被消耗 激活。
但我不确定一些事情:
答案 0 :(得分:0)
您有一个使用批量样本训练的模型。
单个批次由多个输入组成。
使用该模型并行处理这些输入。
因此,如果批处理包含一定数量的元素,则每个元素都会从CPU(输入队列所在的位置)传输到GPU。
因此,GPU使用状态t
处的模型进行计算(将此模型视为模型,其参数在时间步t
处冻结)输入批的每个元素的正向传递。
然后,网络结果累积在矢量中,现在计算反向传播步骤。
因此,使用时间t
(再次)的模型计算批次的每个单元素的梯度(向后通过),累积在矢量中并求平均。
使用此平均值更新模型参数,模型进入状态t+1
。
根据经验,一切都是顺序的,它本质上是在CPU上(考虑输入线程,队列,单个输入值的处理,......)。 但是,网络应处理的所有内容随后都会从CPU传输到GPU。
杂项部分有点令人困惑。我想作者正在谈论数据增加以及单个输入可以以无限方式增强的事实。因此,您必须考虑到如果您将转换应用于一批输入(例如,随机亮度到整批图像),那么要计算的这些转换需要从CPU传输到GPU和增强版本应该在处理之前存储在GPU内存中。 但是,传输操作会完成相同的,你只是松了一些计算时间(当然是预处理),分配的内存会相同