我正在尝试使用Keras训练网络,但是fit_generator
和过多的内存使用问题。
我目前有128GB的RAM,我的数据集占用20GB(压缩的)。我将压缩的数据集加载到RAM中,然后使用Sequence
生成器解压缩成批数据以馈入网络。我的每个样本都是100x100x100像素,存储为float32
,我使用的batch_size
为64,queue_size
为5,27个工人为multiprocessing=True
。从理论上讲,我应该总共有100 * 100 * 100 * 4 * 64 * 5 * 27 =〜35 GB。但是,当我运行脚本时,由于过多的内存使用,该脚本被排队系统杀死了:
slurmstepd: error: Job XXXX exceeded memory limit (1192359452 > 131072000), being killed
我什至尝试使用max_queue_size
少至2,并且该过程仍超出最大内存。为了使事情变得更加难以理解,有时甚至偶然地 正确执行了该过程(即使max_queue_size
为30!)。
在运行脚本之前,我使用free -m
验证了内存实际上是可用的,并且一切正常。我也尝试使用memory-profiler
来分析脚本,尽管结果很奇怪:
我看起来我的脚本正在产生54个(??????)不同的子代,并且正在使用1200 GB(!)的RAM。显然这没有任何意义...
我计算fit_generator
的内存使用量是否错误?据我从文档中了解到的,看起来数据应该在工作进程之间共享,因此排队的批处理应该使用最大的内存部分。有什么我想念的吗?