我试图围绕一台笔记本电脑培训神经网络的能力来校准我的期望。我正在使用tensorflow和keras,大约10分钟后,它崩溃了。我已经看过killsignal 9 exit code 137
了,我想知道这是否是由于内存不足造成的?其他时候,当使用np_utils.to_categorical()
进行单热编码时,我在控制台中看到了单词memoryerror
,而且它和我的脚本崩溃了。这只是试图将输出转换为神经网络在运行之前所期望的结果。
我有6400个输入和1500个输出以及一个100个节点的小隐藏层。批量大小128。
就是这样。它甚至都不深。无论是使用nvidia gpu还是4核心cpu都会崩溃。对于专业人士来说,我的网络太大了,无法在我的系统上进行训练(i7 4核,16gb ram,nvidia GT 750m,计算能力3.0)。我的神经网络被认为是一个大的吗?我有300万个样本,顺便说一句。
1)如何估算网络所需的内存量?是6400 (# inputs) * 1500 (#outputs) * 4 bytes (per parameter) = 38.4 gb
吗?我可以在某个地方的Mac上看到实时使用了多少内存?我使用过活动监控器,内存压力表正常。
2)GPU通常最大容量为8gb-12gb RAM,而台式机上的CPU容易达到64GB。因此,如果我的网络的内存需求超过8GB的RAM,那么在单个GPU上进行训练是不可能的?
3)batch_size和batch_training之间有什么区别,特别是内存方面的差异?
谢谢!
答案 0 :(得分:2)
你的计算是正确的乘法,除了你处理兆字节而不是千兆字节。实际要求是6400 * 100 * 4 + 100 * 1500 * 4,如果使用默认的float32,则应为~4 MB。您将两个后续层的图层大小相乘,因为每个神经元都连接到后续图层中的每个神经元。然后将整个内存需求乘以批量大小。这就是卷积层用于训练深度网络的原因。
对于gpu,我使用nvidia-smi来监控linux上的内存需求。谷歌搜索给了我这个mac:https://phvu.net/2015/03/30/nvidia-smi-on-macos/。如果内存要求超过GPU内存,则无法在gpu上进行训练。你可以在cpu上训练它,但这需要很长时间。
有多种方法可以训练大型训练集。通常,发电机用于批量训练。这意味着只加载您实际需要的训练集部分(https://keras.io/getting-started/faq/#how-can-i-use-keras-with-datasets-that-dont-fit-in-memory)。
答案 1 :(得分:2)
查找神经网络的内存要求不仅取决于网络的大小或参数本身的数量。为了计算神经网络的记忆足迹,我经常去的一个文件是Stanford CS231n Convolutional Neural Networks for Visual Recognition课程笔记。请查看他们为网络的每一层找到内存要求的部分。
除此之外,批量大小(每批次的输入数量)是决定“内存使用”的关键因素。例如,在较新的NVIDIA P100 GPU中,如果我训练CIFAR10模型,如果我在ImageNet数据集上训练AlexNet,则每批可以多达2048张图像。输入大小很重要,批量大小也是如此,因为GPU内存需要考虑一批输入。
测试批处理大小的一种方法是nvidia-smi
并查看使用了多少内存。由于时不时地做这件事很无聊,我通常在我的Linux机器上做watch nvidia-smi
。在我的MAC中,我没有安装NVIDIA GPU,因此我很少使用这些技巧。当我想,我会写这样的快速bash脚本:
while true; do nvidia-smi; sleep 0.5; clear; done
您也可以在Mac上移植watch
。
htop
为您提供了一个更好的图形界面,可以在Linux中使用着名的top
命令。它为您提供有关内存和处理器使用情况以及不同进程的实时信息。如果您对sudo
授予htop
访问权限,则可以直接从界面更改niceness和其他参数。
dstat
为您提供有关I / O的实时信息。在大多数情况下,我会添加两个标志-d
和-n
来指定磁盘和网络使用情况。
幸运的是,可以通过运行以下方式在Mac上安装htop
:
brew install htop
另一方面, dstat
无法直接使用。请查看ifstat
或iostat
了解相似的功能。