Yuliang-Liu / Monkey

【CVPR 2024 Highlight】Monkey (LMM): Image Resolution and Text Label Are Important Things for Large Multi-modal Models
MIT License
1.74k stars 121 forks source link

A100 40G可以跑通训练吗?全参数SFT和LoRA我在A100 40G报OOM,我debug看到是self.visual.encode(images)就报OOM了 #83

Closed zws-2019 closed 1 week ago

zws-2019 commented 4 months ago
image
samaritan1998 commented 4 months ago

same question

echo840 commented 4 months ago

您好,我们是在80g a800上进行全参数训练的。40g a800可能不支持全参数微调,对于lora可以参考这里的解决方式。https://github.com/Yuliang-Liu/Monkey/issues/64

zws-2019 commented 4 months ago

我也是lora微调的,只训了0.15%参数,我debug看下来是VisualAttentionBlock模块每执行一次增加一点现存,导致显存过大,我在看如何优化一下

echo840 commented 4 months ago

您好,我们是在80g a800上进行全参数训练的。40g a800可能不支持全参数微调,对于lora可以参考这里的解决方式。#64

@zws-2019 您看看这样能解决吗?

zws-2019 commented 4 months ago

您好,我们是在80g a800上进行全参数训练的。40g a800可能不支持全参数参数,对于lora可以参考这里的解决方式。#64

@zws-2019 您看看这样能解决吗?

感谢,这个地方的修改是有必要的,另外需要再改一个地方才能跑通textmonkey的训练,我正在看收敛能力来确定修改正确性

echo840 commented 4 months ago

您好,我们是在80g a800上进行全参数训练的。40g a800可能不支持全参数参数,对于lora可以参考这里的解决方式。#64

@zws-2019 您看看这样能解决吗?

感谢,这个地方的修改是有必要的,另外需要再改一个地方才能跑通textmonkey的训练,我正在看收敛能力来确定修改正确性

非常感谢您的尝试,要是有啥经验也欢迎分享一下。

zws-2019 commented 4 months ago

您好,我们是在80g a800上进行全参数训练的。40g a800可能不支持全参数参数,对于lora可以参考这里的解决方法。#64

@zws-2019您看看这样能解决吗?

谢谢,这个位置的修改是有必要的,另外需要再修改一个位置才能运行textmonkey的训练,我正在看收敛能力来确定修改正确性

非常感谢您的尝试,希望有啥经验也欢迎分享一下。

除了以上修改,我还改了modeling_qwen.py中

hidden_states[i][a + 1 : b] = images[idx]
修改为
hidden_states[i][a + 1 : b].data = images[idx]

修改后可以在40G A100上训练,但是发现没有收敛,并且推理时是乱码,推理时改回modeling_qwen.py发现和原始模型推理结果相同

echo840 commented 4 months ago

您训练的是Monkey还是TextMonkey?

zws-2019 commented 4 months ago

您训练的是Monkey还是TextMonkey?

textmonkey,目前用lora只训练了LLM的参数,可以跑通,但是loss从3收敛到1.8左右后就不再收敛了,明天我再测试一下训练的效果

chenxuetian commented 4 months ago

您好,我们是在80g a800上进行全参数训练的。40g a800可能不支持全参数参数,对于lora可以参考这里的解决方法。#64

@zws-2019您看看这样能解决吗?

谢谢,这个位置的修改是有必要的,另外需要再修改一个位置才能运行textmonkey的训练,我正在看收敛能力来确定修改正确性

非常感谢您的尝试,希望有啥经验也欢迎分享一下。

除了以上修改,我还改了modeling_qwen.py中

hidden_states[i][a + 1 : b] = images[idx]
修改为
hidden_states[i][a + 1 : b].data = images[idx]

修改后可以在40G A100上训练,但是发现没有收敛,并且推理时是乱码,推理时改回modeling_qwen.py发现和原始模型推理结果相同

@echo840 请教一下这可能是什么原因?修改hidden_states[i][a + 1 : b].data导致梯度继续回传到嵌入式层?另外请教一下代码中能否做一些小改动优化计算时间和显存占用呢

zws-2019 commented 4 months ago

您好,我们是在80g a800上进行全参数训练的。40g a800可能不支持全参数参数,对于lora可以参考这里的解决方法。#64

@zws-2019您看看这样能解决吗?

谢谢,这个位置的修改是有必要的,另外需要再修改一个才能运行textmonkey的训练,我正在看收敛能力来确定修改正确性

非常感谢您的尝试,希望有啥经验也欢迎分享一下。

除了以上修改,我还修改了modeling_qwen.py中

hidden_states[i][a + 1 : b] = images[idx]
修改为
hidden_states[i][a + 1 : b].data = images[idx]

修改后可以在40G A100上训练,但是发现没有收敛,并且推理时是乱码,推理时改回modeling_qwen.py发现和原始模型推理结果相同

@echo840请教一下这可能是什么原因?hidden_​​​​​​states[i][a + 1 : b].data 导致突然继续传回嵌入式层?另外请教一下代码中能否做一些小问题优化计算时间和显着的占用呢?

当我们禁用模型参数,使用lora微调时,会使用

        if training_args.gradient_checkpointing:
            model.enable_input_require_grads()

这会使能输入梯度,这时执行下面命令会报错,因为hidden_states有梯度,而images没有梯度,所以需要给hidden_states.data赋值(但是我不清楚这样做会不会有风险)

hidden_states[i][a + 1 : b] = images[idx]

另外我还改了其他地方降低显存使用

                # images = self.visual.encode(images)
                images = cp.checkpoint(self.visual.encode, images)
    if training_args.use_lora:
        for name, param in model.named_parameters():
            param.requires_grad = False
        lora_config = LoraConfig(
            r=lora_args.lora_r,
            lora_alpha=lora_args.lora_alpha,
            target_modules=lora_args.lora_target_modules,
            lora_dropout=lora_args.lora_dropout,
            bias=lora_args.lora_bias,
            task_type='CAUSAL_LM',
        )

        model = get_peft_model(model, lora_config)
        model.print_trainable_parameters()

        if training_args.gradient_checkpointing:
            model.enable_input_require_grads()

现在的问题是收敛到1.7左右就很难再收敛,测试infer效果比较差,我的finetune里样本用了很多换行,就没有学到

chenxuetian commented 4 months ago

您好,我们是在80g a800上进行全参数训练的。40g a800可能不支持全参数参数,对于lora可以参考这里的解决方法。#64

@zws-2019您看看这样能解决吗?

谢谢,这个位置的修改是有必要的,另外需要再修改一个才能运行textmonkey的训练,我正在看收敛能力来确定修改正确性

非常感谢您的尝试,希望有啥经验也欢迎分享一下。

除了以上修改,我还修改了modeling_qwen.py中

hidden_states[i][a + 1 : b] = images[idx]
修改为
hidden_states[i][a + 1 : b].data = images[idx]

修改后可以在40G A100上训练,但是发现没有收敛,并且推理时是乱码,推理时改回modeling_qwen.py发现和原始模型推理结果相同

@echo840请教一下这可能是什么原因?hidden_​​​​​​states[i][a + 1 : b].data 导致突然继续传回嵌入式层?另外请教一下代码中能否做一些小问题优化计算时间和显着的占用呢?

当我们禁用模型参数,使用lora微调时,会使用

        if training_args.gradient_checkpointing:
            model.enable_input_require_grads()

这会使能输入梯度,这时执行下面命令会报错,因为hidden_states有梯度,而images没有梯度,所以需要给hidden_states.data赋值(但是我不清楚这样做会不会有风险)

hidden_states[i][a + 1 : b] = images[idx]

另外我还改了其他地方降低显存使用

                # images = self.visual.encode(images)
                images = cp.checkpoint(self.visual.encode, images)
    if training_args.use_lora:
        for name, param in model.named_parameters():
            param.requires_grad = False
        lora_config = LoraConfig(
            r=lora_args.lora_r,
            lora_alpha=lora_args.lora_alpha,
            target_modules=lora_args.lora_target_modules,
            lora_dropout=lora_args.lora_dropout,
            bias=lora_args.lora_bias,
            task_type='CAUSAL_LM',
        )

        model = get_peft_model(model, lora_config)
        model.print_trainable_parameters()

        if training_args.gradient_checkpointing:
            model.enable_input_require_grads()

现在的问题是收敛到1.7左右就很难再收敛,测试infer效果比较差,我的finetune里样本用了很多换行,就没有学到

感谢你的回复,我刚刚使用lora训练也遇到相同报错,由于hidden_states需要梯度,不能做原地赋值操作。但是我不清楚开启输入梯度的原因是什么。hidden_states需要梯度,但是从input_ids计算hidden_states的嵌入层却不需要梯度。也许hidden_states的梯度会传递到其他模块的参数中去,因此你直接为hidden_states.data赋值扰乱了梯度传递,导致后面的参数错误变化。另外你为什么设置模型的所有参数都不需要梯度呢?我理解应该保留四个lora参数和resampler模块需要参数。

zws-2019 commented 4 months ago

您好,我们是在80g a800上进行全参数训练的。40g a800可能不支持全参数参数,对于lora可以参考这里的解决方法。#64

@zws-2019您看看这样能解决吗?

谢谢,这个位置的修改是有必要的,另外需要再修改一个才能运行textmonkey的训练,我正在看收敛能力来确定修改正确性

非常感谢您的尝试,希望有啥经验也欢迎分享一下。

除了以上修改,我还修改了modeling_qwen.py中

hidden_states[i][a + 1 : b] = images[idx]
修改为
hidden_states[i][a + 1 : b].data = images[idx]

修改后可以在40G A100上训练,但是发现没有收敛,并且推理时是乱码,推理时改回modeling_qwen.py发现和原始模型推理结果相同

@echo840请教一下这可能是什么原因?hidden_​​​​​​states[i][a + 1 : b].data 导致突然继续传回嵌入式层?另外请教一下代码中能否做一些小问题优化计算时间和显着的占用呢?

当我们禁用模型参数,使用lora微调时,会使用

        if training_args.gradient_checkpointing:
            model.enable_input_require_grads()

这会使能输入梯度,这时执行下面命令会报错,因为hidden_states有梯度,而images没有梯度,所以需要给hidden_states.data赋值(但是我不清楚这样做会不会有风险)

hidden_states[i][a + 1 : b] = images[idx]

另外我还改了其他地方降低显存使用

                # images = self.visual.encode(images)
                images = cp.checkpoint(self.visual.encode, images)
    if training_args.use_lora:
        for name, param in model.named_parameters():
            param.requires_grad = False
        lora_config = LoraConfig(
            r=lora_args.lora_r,
            lora_alpha=lora_args.lora_alpha,
            target_modules=lora_args.lora_target_modules,
            lora_dropout=lora_args.lora_dropout,
            bias=lora_args.lora_bias,
            task_type='CAUSAL_LM',
        )

        model = get_peft_model(model, lora_config)
        model.print_trainable_parameters()

        if training_args.gradient_checkpointing:
            model.enable_input_require_grads()

现在的问题是收敛到1.7左右就很难再收敛,测试infer效果比较差,我的finetune里样本用了很多换行,就没有学到

感谢你的回复,我刚刚使用lora训练也遇到相同报错,由于hidden_states需要梯度,不能做原地赋值操作。但是我不清楚开启输入梯度的原因是什么。hidden_states需要梯度,但是从input_ids计算hidden_states的嵌入层却不需要梯度。也许hidden_states的梯度会传递到其他模块的参数中去,因此你直接为hidden_states.data赋值扰乱了梯度传递,导致后面的参数错误变化。另外你为什么设置模型的所有参数都不需要梯度呢?我理解应该保留四个lora参数和resampler模块需要参数。

我试过按照当前finetune_multitask_dialouge_doc.py的代码训练lora也是同样的问题,现在看下来是hidden_states的梯度问题,你那边有解决方案吗?

JeffRody commented 2 months ago

有问题 这种方法 我说过了 训练可以跑通 但是损失到了后面不减反增

JeffRody commented 2 months ago

text_monkey微调代码有问题麻烦有空更新一下,显示内存占用过高

echo840 commented 1 week ago

Hello, you can try our latest model MiniMonkey, which can be trained on eight 3090 GPUs.