假设我有一些深度学习模型架构,以及选定的小批量大小。我如何从这些训练该模型的预期内存需求中得出?
例如,考虑一个(非循环)模型,其输入维度为 1000,4 个维度为 100 的全连接隐藏层,以及一个维度为 10 的附加输出层。小批量大小为 256 个示例。如何确定训练过程在 CPU 和 GPU 上的近似内存 (RAM) 占用量?如果有什么不同,我们假设该模型是在带有 TensorFlow 的 GPU 上训练的(因此使用 cuDNN)。
假设我有一些深度学习模型架构,以及选定的小批量大小。我如何从这些训练该模型的预期内存需求中得出?
例如,考虑一个(非循环)模型,其输入维度为 1000,4 个维度为 100 的全连接隐藏层,以及一个维度为 10 的附加输出层。小批量大小为 256 个示例。如何确定训练过程在 CPU 和 GPU 上的近似内存 (RAM) 占用量?如果有什么不同,我们假设该模型是在带有 TensorFlow 的 GPU 上训练的(因此使用 cuDNN)。
@ik_vision 的答案描述了如何估计存储权重所需的内存空间,但您还需要存储中间激活,特别是对于处理 3D 数据的卷积网络,这是所需内存的主要部分。
分析您的示例:
对于 1 个样本,前向传递总共需要 1410 个元素。除了输入之外,您还需要关于它们中的每一个的梯度信息用于后向传递,即多 410 个,每个样本总共 1820 个元素。乘以批量大小得到 465 920。
我说的是“元素”,因为每个元素所需的大小取决于使用的数据类型。对于单精度float32
,它是 4B,存储数据 blob 所需的总内存约为 1.8MB。
我看到两个选项:
在这两种情况下,GPU 中的内存大小都需要乘以 Batch 大小,因为每个样本都会复制大部分网络。
如果从磁盘加载,经验法则:如果 DNN 在磁盘上占用 X MB,则对于批量大小 1,网络在 GPU 内存中将是 2 倍。
网络是为批量大小 1 动态创建的:计算参数并乘以 4 个字节(float32 位):手动计算参数的数量:fc1:1000x100(权重)+ 100(偏差) fc2:100x100(权重)+ 100(偏差) fc3:100x100(权重)+ 100(偏差) fc4:100x100(权重)+ 100(偏差)输出:100x10(权重)+ 10(偏差)
使用 Keras 计算 Parameter 的数量:model.count_params()