我发现训练日志的记录的loss和grad_norm与使用的GPU数量有关,这是一个Bug吗?
如果使用4张卡训练,那么最初的几个step记录的loss大概为20左右,如果使用2张卡,那么就是40左右,论文使用8张卡,训练日志中loss是10,也就是最初的step的loss*GPU数量是一个常数(约80)。
然后我仔细看了一下代码,发现在Qwen2_5_VLForConditionalGenerationWithVGGT.forward()函数中,相比于transformers-v4.50.0的Qwen2_5_VLForConditionalGeneration.forward()函数中多了一个参数'**kwargs',这样会导致model_accepts_loss_kwargs默认设置为True,也就是说loss不会再除以累积的梯度大小(https://huggingface.co/blog/gradient_accumulation#where-does-it-stem-from)(https://discuss.huggingface.co/t/model-accepts-loss-kwargs-detection-based-on-kwargs-is-too-permissive/148368)。
因此我加上了这一行代码:

现在,如论我使用几张GPU训练,初始的step记录的loss为1.5左右,不会随着GPU数量而变化。
在新版的transformers官方代码中,Qwen2_5_VLForConditionalGeneration.forward函数增加了参数'**kwargs'的同时,他们也加上了‘accepts_loss_kwargs = False’。
但是我发现这样做的话,loss降不下来!
这件事情困扰我一段时间了,我不知道是我的理解有问题还是目前VGLLM代码中确实应该加上‘accepts_loss_kwargs = False’。我现在正在使用3张A100训练,结束后我会第一时间测试加上‘accepts_loss_kwargs = False’后训练模型的效果。我非常希望能得到作者的回复,并很乐意能与作者讨论该问题!
我发现训练日志的记录的loss和grad_norm与使用的GPU数量有关,这是一个Bug吗?
如果使用4张卡训练,那么最初的几个step记录的loss大概为20左右,如果使用2张卡,那么就是40左右,论文使用8张卡,训练日志中loss是10,也就是最初的step的loss*GPU数量是一个常数(约80)。
然后我仔细看了一下代码,发现在Qwen2_5_VLForConditionalGenerationWithVGGT.forward()函数中,相比于transformers-v4.50.0的Qwen2_5_VLForConditionalGeneration.forward()函数中多了一个参数'**kwargs',这样会导致model_accepts_loss_kwargs默认设置为True,也就是说loss不会再除以累积的梯度大小(https://huggingface.co/blog/gradient_accumulation#where-does-it-stem-from)(https://discuss.huggingface.co/t/model-accepts-loss-kwargs-detection-based-on-kwargs-is-too-permissive/148368)。
因此我加上了这一行代码:
但是我发现这样做的话,loss降不下来!
这件事情困扰我一段时间了,我不知道是我的理解有问题还是目前VGLLM代码中确实应该加上‘accepts_loss_kwargs = False’。我现在正在使用3张A100训练,结束后我会第一时间测试加上‘accepts_loss_kwargs = False’后训练模型的效果。我非常希望能得到作者的回复,并很乐意能与作者讨论该问题!