使用的训练命令: python tools/train.py configs/detection/dino/dino_5sc_swinl_center_iou_memoryreduce_26e_obj365.py --pretrained checkpoints/epoch_22.pth --work_dir work_dir/
日志如下: 2023-06-02 15:50:02,481 - easycv - INFO - Epoch [1][420/13236] lr: 1.000e-04, eta: 3 days, 2:49:58, time: 0.690, data_time: 0.012, memory: 8668, loss_ce: 1.9952, class_error: 85.8944, loss_bbox: 0.9517, loss_giou: 1.7226, loss_center: 0.9545, loss_iouaware: 1.1281, loss_ce_0: 1.8327, loss_bbox_0: 0.9776, loss_giou_0: 1.7397, loss_center_0: 0.9458, loss_iouaware_0: 1.1103, loss_ce_1: 1.9569, loss_bbox_1: 0.9610, loss_giou_1: 1.7214, loss_center_1: 0.9410, loss_iouaware_1: 1.1258, loss_ce_2: 2.0271, loss_bbox_2: 0.9531, loss_giou_2: 1.7204, loss_center_2: 0.9518, loss_iouaware_2: 1.1275, loss_ce_3: 2.0033, loss_bbox_3: 0.9523, loss_giou_3: 1.7213, loss_center_3: 0.9589, loss_iouaware_3: 1.1285, loss_ce_4: 2.0029, loss_bbox_4: 0.9524, loss_giou_4: 1.7215, loss_center_4: 0.9594, loss_iouaware_4: 1.1272, loss_ce_interm: 1.9905, loss_bbox_interm: 0.9592, loss_giou_interm: 1.7260, loss_center_interm: 0.9149, loss_iouaware_interm: 1.1416, loss_ce_dn: 1.1557, loss_bbox_dn: 0.4540, loss_giou_dn: 1.3770, loss_center_dn: 1.3841, loss_iouaware_dn: 1.3356, loss_ce_dn_0: 0.9538, loss_bbox_dn_0: 0.4562, loss_giou_dn_0: 1.3734, loss_center_dn_0: 1.3862, loss_iouaware_dn_0: 1.3380, loss_ce_dn_1: 0.9745, loss_bbox_dn_1: 0.4554, loss_giou_dn_1: 1.3742, loss_center_dn_1: 1.3856, loss_iouaware_dn_1: 1.3368, loss_ce_dn_2: 1.0250, loss_bbox_dn_2: 0.4549, loss_giou_dn_2: 1.3748, loss_center_dn_2: 1.3849, loss_iouaware_dn_2: 1.3365, loss_ce_dn_3: 1.0980, loss_bbox_dn_3: 0.4545, loss_giou_dn_3: 1.3756, loss_center_dn_3: 1.3842, loss_iouaware_dn_3: 1.3360, loss_ce_dn_4: 1.1567, loss_bbox_dn_4: 0.4542, loss_giou_dn_4: 1.3763, loss_center_dn_4: 1.3843, loss_iouaware_dn_4: 1.3356, loss: 80.7759 Traceback (most recent call last): File "/home/EasyCV/tools/train.py", line 322, in main() File "/home/EasyCV/tools/train.py", line 310, in main train_model( File "/home/EasyCV/package/easycv/apis/train.py", line 312, in train_model runner.run(data_loaders, cfg.workflow, cfg.total_epochs) File "/usr/local/python3.9/lib/python3.9/site-packages/mmcv/runner/epoch_based_runner.py", line 136, in run epoch_runner(data_loaders[i], **kwargs) File "/home/EasyCV/package/easycv/runner/ev_runner.py", line 107, in train self.run_iter(data_batch, train_mode=True) File "/home/EasyCV/package/easycv/runner/ev_runner.py", line 72, in run_iter outputs = self.model.train_step(data_batch, self.optimizer, File "/usr/local/python3.9/lib/python3.9/site-packages/mmcv/parallel/data_parallel.py", line 77, in train_step return self.module.train_step(*inputs[0], **kwargs[0]) File "/home/EasyCV/package/easycv/models/base.py", line 105, in train_step losses = self(**data, mode='train') File "/usr/local/python3.9/lib/python3.9/site-packages/torch/nn/modules/modul 机器学习PAI在使用dino训练自己数据时,显存在不停的增加,出现CUDA out of memory 的问题,修改了batch、尺寸都没有解决,请问如何排查呢?
在使用阿里云机器学习PAI进行dino训练的时候,如果显存不停的增加,可以从以下几个方面进行排查:
调整batch size:大多数情况下,显存增加过快是由于模型batch size设置过大导致的。可以尝试将batch size调整为更小的值,比如减半或者减少到原来的1/4, 这样可以有效降低显存的占用。
检查代码是否存在内存泄漏:检查代码是否存在内存泄漏,若存在内存泄漏则及时修复,以避免显存占用不断增加。可以使用Python中的memory_profiler库对代码进行分析,查看哪些地方存在内存泄漏。
降低图片分辨率:如果输入的图片分辨率过高,可以尝试将其降低到合适的大小,以减小占用显存的数量。
使用更小的模型:如果上述方法无法缓解显存不断增加的问题,可以考虑使用更小的模型。对于一些简单的任务来说,使用小模型不仅可以节省时间和资源,并且还可以获得更好的性能。
根据您提供的日志信息,可以看到显存在训练过程中不断增加,并且在训练过程中出现了CUDA out of memory的错误。这通常是由于显存不足导致的,可能是由于模型太大或批量大小太大等原因导致的。
为了解决这个问题,可以尝试以下方法:
减小批量大小:可以尝试减小批量大小以减少显存的使用量。可以通过修改配置文件中的batch_size参数来实现。
减小输入图像的尺寸:可以尝试减小输入图像的尺寸以减少显存的使用量。可以通过修改配置文件中的input_shape参数来实现。
减小模型的复杂度:可以尝试减小模型的复杂度以减少显存的使用量。可以通过使用更小的模型或者删除一些无关的层来实现。
使用混合精度训练:可以尝试使用混合精度训练来减少显存的使用量。可以通过在配置文件中设置fp16_enabled参数为True来启用混合精度训练。
使用多卡训练:如果您有多张GPU,可以尝试使用多卡训练来分摊显存的使用量。可以通过在配置文件中设置gpus参数来指定使用的GPU数量。
选择更大的GPU机型:如果您的显存仍然不足,可以尝试选择更大的GPU机型来增加显存的大小。
另外,您可以通过在训练过程中使用torch.cuda.memory_allocated()和torch.cuda.max_memory_allocated()等函数来监测显存的使用量,以便更好地排查问题。
您的训练日志中显示显存不停增加,最终导致 CUDA out of memory 的错误。
这通常是由于模型过大、图像分辨率过高以及 batch size 过大所导致的。另外,您可以通过使用梯度累积的方法来降低内存占用。
为了解决这个问题,以下是几个建议:
降低 batch size。您可以修改配置文件中的 batch size 参数为较小的值,重新执行训练命令,观察是否能够解决显存增加的问题。
降低图像分辨率。如果将图像分辨率降低到适当的大小,也可以减少显存的使用。您可以在配置文件中修改图像输入的尺寸大小。
降低模型复杂度。如果模型过于复杂,也会占用较多的显存,可以考虑选择轻量级模型或通过减少模型层数、参数量等来降低模型复杂度。
使用梯度累积。通过梯度累积的方法,可以在减少 batch size 的同时保证模型精度。具体来说,就是在每个 epoch 中,将多个小的 batch 的梯度累积到一个较大的 batch 中进行更新。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
人工智能平台 PAI(Platform for AI,原机器学习平台PAI)是面向开发者和企业的机器学习/深度学习工程平台,提供包含数据标注、模型构建、模型训练、模型部署、推理优化在内的AI开发全链路服务,内置140+种优化算法,具备丰富的行业场景插件,为用户提供低门槛、高性能的云原生AI工程化能力。