#问题描述:RuntimeError: CUDA out of memory.Tried to allocate 1.86GiB(GPU 3;23.70 GiB total capacity; 20.81 GiB already allocated; 1.10GiB free;20.92 GiB reserved in total by PyTorch)
#代码图片:
使用yolov7训练AI-TOD数据(大概27G左右),训练几个轮次之后会中断程序并报错。
使用yolov7-tiny结构是可以正常训练,使用yolov7标准版会报错
#我的初步解答思路:
1.改batch-size:缩小为8,4,2等,
2.改workers,改为4,2,1等
3.改img-size,将img-size改为【320,320】
以上三种方法可以让训练多几个epochs,但是最多十次左右还是会终止。
4.运行torch.cuda.empty_cache()函数。
放在代码之前没有作用,放在每个epoch后面直接报错
#操作环境及配置
ubuntu系统,3090显卡
该回答通过自己思路及引用到各个渠道搜索综合及思考,得到内容具体如下:
根据您提供的信息,这个错误是由于GPU内存不足引起的。在训练yolov7标准版时,需要更多的GPU内存,而您的GPU内存已经被占用了大约20.81 GiB,只剩下1.10 GiB的空闲内存。因此,您可以尝试以下方法来解决这个问题:
1. 使用更小的batch size。您已经尝试过这个方法了,可以继续缩小batch size,比如将其设置为1或2。
2. 减小模型的复杂度。如果您的模型太复杂,可以尝试减少卷积层的数量或者使用更小的卷积核。
3. 减小输入图片的大小。您已经尝试过这个方法了,可以继续缩小输入图片的大小,比如将其设置为224x224。
4. 使用更少的worker数。您已经尝试过这个方法了,可以继续减少worker数,比如将其设置为1或2。
5. 使用多GPU训练。如果您的电脑有多个GPU,可以尝试使用多GPU训练来增加GPU内存。
6. 使用混合精度训练。可以尝试使用混合精度训练来将模型参数和梯度转换为半精度浮点数,从而减少GPU内存的使用。
7. 减小模型的输入数据维度。可以通过对图片做降采样或裁剪等方式来减小模型的输入数据维度。
8. 在训练过程中定期调用torch.cuda.empty_cache()函数。该函数可以释放一些没有被使用的GPU内存,但是需要在训练代码中适当的位置调用,否则可能会导致程序崩溃。
以上是一些可能有用的解决方法,您可以尝试其中的一些或者多个来解决这个问题。另外,您可以使用nvidia-smi命令来查看GPU内存的使用情况,以便更好地了解训练过程中GPU内存的变化。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
爆缓存了,大的模型还是上专业卡吧,3090那点显存肯定不够的。
chatgpt:
根据错误信息,您的程序在GPU 3上分配内存时出现了 CUDA out of memory 错误。这意味着您的程序在训练模型时尝试分配超过显存总容量的内存,导致程序崩溃。以下是您可以尝试的几种方法:
降低 batch size:降低每批次训练的样本数量,以减少内存使用。您已经尝试过这个方法,可以进一步减小 batch size。
减少图像大小:减小输入图像的大小,可以减少每个样本所需的内存量。但是,太小的图像大小可能会影响模型的性能。
减少模型参数:可以通过减少模型的大小来减少内存的使用,如使用 YOLOv7-tiny 而不是标准版 YOLOv7。
开启 mixed precision 训练模式:这种模式可以减少模型所需的内存,并加快训练速度。您可以尝试在 PyTorch 中使用 Apex 库来实现 mixed precision 训练。
增加显存:如果您的显存不足,可以考虑增加显存,或使用多个显卡并行训练。
减少内存泄漏:在每个 epoch 结束后,使用 torch.cuda.empty_cache() 函数清除 GPU 缓存,以防止内存泄漏。
参照2.5训练,改小参数就可以了。就可以解决了