Skip to content

训练日志的记录的loss和grad_norm与使用的GPU数量有关,这是Bug吗? #68

@0x4e8

Description

@0x4e8

我发现训练日志的记录的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)。
因此我加上了这一行代码:

Image 现在,如论我使用几张GPU训练,初始的step记录的loss为1.5左右,不会随着GPU数量而变化。 在新版的transformers官方代码中,Qwen2_5_VLForConditionalGeneration.forward函数增加了参数'**kwargs'的同时,他们也加上了‘accepts_loss_kwargs = False’。

但是我发现这样做的话,loss降不下来!

Image

这件事情困扰我一段时间了,我不知道是我的理解有问题还是目前VGLLM代码中确实应该加上‘accepts_loss_kwargs = False’。我现在正在使用3张A100训练,结束后我会第一时间测试加上‘accepts_loss_kwargs = False’后训练模型的效果。我非常希望能得到作者的回复,并很乐意能与作者讨论该问题!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions