xiuqhou / Relation-DETR

[ECCV2024 Oral] Official implementation of the paper "Relation DETR: Exploring Explicit Position Relation Prior for Object Detection"
Apache License 2.0
134 stars 11 forks source link

关于“如何在资源有限的情况下,减少训练用时”的讨论 #22

Open DoctorDream opened 2 months ago

DoctorDream commented 2 months ago

Question

由于我的资源有限而数据量较大,如果直接训练模型耗时过于庞大,所以想了两种途径试图减少训练时间,请问作者这两种方式是否可行?

  1. 首先先使用640小尺寸训练多个epoch,最后再用640模型作为预训练模型,继续训练800-1333模型
  2. 首先在backbone部分只使用return_indices=(1, 2, 3)训练一个预训练模型,然后再次基础上使用return_indices=(0,1, 2, 3)继续训练正常的800-1333模型

我的上述思想主要基于减少显存占用以获取更大的batch_size以增加训练速度,不知道这样是否可行,尤其是第二种方法会不会因为模型参数的变换无法加载预训练权重,或者因为模型参数的变换导致该方法实际上并无加速效果?

补充信息

No response

xiuqhou commented 2 months ago

Hi @DoctorDream

这两个方式是可行的,先用更少的显存增大batch_size快速训练模型,然后再用更大的图片尺寸和更多特征图进行全量微调。

第一个方法在用的时候请注意要同时修改train_transform中的图片尺寸和模型输入参数中的min_size/max_size,前者是训练时候的数据增强,后者是推理时候的数据增强,把他们都修改成640*640对应的尺寸。

第二个方法不太推荐。return_indices会改变网络结构,导致预训练和微调时候的权重对不上,当然只加载匹配的权重来微调也是可以的。但用return_indices=(0, 1, 2, 3)也不会提升太多精度,还会大幅提升显存占用,我建议预训练和微调都直接用return_indices=(1, 2, 3)。

xiuqhou commented 2 months ago

另外还可以使用混合精度训练,这样可以降低显存,从而使用更大的batch_size。在训练命令后面加上--mixed-precision参数:

CUDA_VISIBLE_DEVICES=0 accelerate launch main.py --mixed-precision bf16
# 或者
CUDA_VISIBLE_DEVICES=0 accelerate launch main.py --mixed-precision fp16
lihui52 commented 1 month ago

请问“修改train_transform中的图片尺寸”,在哪个文件修改呢?另外加上了--mixed-precision fp16 但是提示“--mixed_precision was set to a value of 'no'

xiuqhou commented 1 month ago

train_transform都定义在transforms/presets.py文件中,这里有一些我常用的数据增强,其中有resize相关的变换会改变图像尺寸,请相应地修改resize后的图像尺寸,确保他们和模型中的min_size、max_size大致匹配上。

--mixed-precision fp16的提示不用理会,他警告是因为accelerate默认参数是no,这个不影响。