退出代码为 137 表示进程因 “内存不足” 或 “被操作系统强制终止”(通常是由于超出内存限制)而退出。这个错误主要在内存资源有限的环境下发生,例如,当你运行较大模型训练或处理大批量数据时。
可能的原因:
- 内存不足:你的程序占用了太多的内存,导致操作系统强制终止进程以保护系统资源。
- 批量大小过大:如果你训练模型时使用的 batch size 很大,可能会耗尽内存。
- 其他系统进程:如果系统上有其他进程占用大量内存,可能会导致可用内存不足。
解决方法:
-
减少 batch size:通过减小训练时的 batch size 来减少每次训练迭代所需的内存。
-
优化数据加载:使用
pin_memory=True
和num_workers
来优化数据加载,尤其是在使用 GPU 时,可以提高内存效率:DataLoader(dataset, batch_size=8, pin_memory=True, num_workers=4)
-
减少模型复杂性:尝试减少模型的参数数量或降低模型的复杂性(例如,减少网络层数或通道数),从而减少内存占用。
-
检查内存占用:可以通过系统命令或监控工具(如
htop
、free -m
或nvidia-smi
)检查当前的内存使用情况,了解哪些进程占用了大量内存。 -
使用 swap 内存:如果在内存不足的情况下,系统还没有启用 swap 空间,尝试增加 swap 空间以避免被杀掉。
-
定期保存并清理缓存:如果训练时间较长,可以定期保存模型并清理内存缓存,尤其是在使用 PyTorch 时可以通过以下命令释放显存:
import torch torch.cuda.empty_cache()
为什么调小batch size能缓解内存不足?
1. 内存占用与batch size的关系
-
batch size 是一次前向和后向传播中,输入网络的样本数量。在深度学习中,每一批数据都需要存储输入、输出、梯度、权重等信息。如果 batch size 较大,则在训练过程中要处理更多的样本数据,这会增加显存(GPU)或内存(RAM)的占用。
-
当 batch size 增大时:每个样本的激活(intermediate activations)、梯度以及模型权重的更新信息都会增多,导致显存或内存的占用急剧上升。
-
减少batch size 可以直接减少每次前向传播时需要存储的数据量:因此,调小 batch size 会减少每次传递的数据量,从而减少显存或内存的消耗,缓解内存不足的问题。
-
中间激活值:每个 batch 的样本都要经过若干层网络,产生中间激活值(即网络各层输出)。batch size 越大,需要存储的激活值也就越多。
-
梯度:反向传播时,每个样本的梯度需要计算并存储。batch size 越大,需要存储的梯度也越多。
-
batch size 过小的潜在问题:
- 批量归一化(Batch Normalization):许多深度学习模型使用批量归一化,它依赖于 batch 内的统计量(均值和方差)。当 batch size 过小时,这些统计量可能不准确,影响模型训练的稳定性。
- 收敛速度:较小的 batch size 可能导致每次更新的梯度方向不够准确,从而使模型的收敛速度变慢。不过,通常我们可以通过降低学习率来部分补偿这一影响。
- 调小 batch size 能缓解内存不足的原因是:它减少了在每次前向和后向传播中需要存储的中间激活值和梯度信息,从而减少了显存或内存的占用。但调小 batch size 可能会对模型训练的速度和收敛性带来一些负面影响,需要进行权衡。