预测DNN训练的CPU和GPU内存需求


10

假设我有一些深度学习模型架构,以及所选的小批量大小。如何从这些数据中得出训练该模型的预期内存需求?

例如,考虑一个(非循环)模型,其输入尺寸为1000,4个完全连接的隐藏层尺寸为100,附加输出层尺寸为10。最小批量大小为256个示例。如何确定训练过程在CPU和GPU上的近似内存(RAM)占用空间?如果有什么不同,让我们假设使用TensorFlow在GPU上训练模型(因此使用cuDNN)。

Answers:


3

@ik_vision的答案描述了如何估计存储权重所需的存储空间,但是您还需要存储中间激活,尤其是对于使用3D数据的卷积网络,这是所需存储的主要部分。

要分析您的示例:

  1. 输入需要1000个元素
  2. 在1-4层之后,您有100个元素,总共400个
    1. 在最后一层之后,您有10个元素

对于1个样本,总共需要1410个元素进行正向传递。除了输入之外,您还需要有关每个梯度的信息以进行反向传递,即多输入410,每个样本总共1820个元素。乘以批处理大小即可得到465920。

我说“元素”是因为每个元素所需的大小取决于所使用的数据类型。单精度float32为4B,存储数据blob所需的总内存约为1.8MB。


1

我看到两个选择:

  1. 网络从磁盘加载
  2. 网络是动态创建的

在这两种情况下,GPU的内存大小都需要乘以批处理大小,因为每个示例都将复制大部分网络。

从磁盘加载的经验法则:如果DNN在磁盘上占用X MB,则批处理大小为1的网络在GPU内存中将是2倍。

动态创建批次大小为1的网络:计算参数并乘以4字节(float32位):手动计算参数的数量:fc1:1000x100(权重)+ 100(偏差)fc2:100x100(权重)+ 100(偏差)fc3:100x100(权重)+ 100(偏差)fc4:100x100(权重)+ 100(偏差)输出:100x10(权重)+ 10(偏差)

使用Keras计算参数数量:model.count_params()


3
据我所知,这给出了存储权重本身的内存要求,但是忽略了专门用于存储严格训练所需的任何内容(例如渐变)的任何内存。例如,为实现动量,需要存储梯度。我想念吗?
Whaa

1
@哇,这是正确的,对于正常的训练,您需要记忆来存储权重,向前传递的激活和向后传播传递的梯度(即使没有动量,也要存储3倍)。
mjul

@mjul我的实验显示了ik_vision的4.5倍估算值。我了解3x的基本原理,但不确定为什么在实践中使用4.5x。还必须有其他Keras / TF开销吗?
Wes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.