InternVL2-模型保存全部模型和断点训练

467 篇文章 6 订阅
28 篇文章 0 订阅

这段代码主要用于训练一个多模态模型,结合了视觉Transformer(ViT)和语言模型(LLM),例如InternVLChatModel。在训练过程中,代码提供了对LoRA(Low-Rank Adaptation)的支持,这是一种用于微调大型预训练模型的技术。

在LoRA训练过程中,原始模型的权重被冻结,而LoRA层的权重被训练。LoRA层通过在原始模型的权重矩阵上添加低秩结构来实现微调,这样可以有效地调整模型的行为,同时保持原始模型的大部分参数不变。

在代码中,有以下与LoRA相关的部分:

if model_args.use_backbone_lora:
    model.wrap_backbone_lora(r=model_args.use_backbone_lora, lora_alpha=2 * model_args.use_backbone_lora)
    model.config.use_backbone_lora = model_args.use_backbone_lora

if model_args.use_llm_lora:
    model.wrap_llm_lora(r=model_args.use_llm_lora, lora_alpha=2 * model_args.use_llm_lora)
    model.config.use_llm_lora = model_args.use_llm_lora

这些代码片段调用了wrap_backbone_lorawrap_llm_lora方法来为模型的视觉和语言模型部分添加LoRA层。

关于保存的模型,代码中的这一部分:

trainer.save_model()  # Saves the tokenizer too for easy upload

这行代码会保存整个模型,包括原始模型的权重和LoRA层的权重。这意味着保存的模型是一个合并的模型,它包含了原始模型的参数和通过LoRA训练更新的参数。

因此,根据这段代码,保存的模型是一个自动合并的模型,它不仅包含原始模型的权重,还包含了LoRA层的权重。这不是一个单独的LoRA模型,而是一个完整的、经过LoRA微调的多模态模型。

是的,这段代码支持断点训练,也就是从中断的地方继续训练模型。这是通过检查是否存在之前的检查点(checkpoint)来实现的。代码中的以下部分负责处理断点训练的逻辑:

# Detecting last checkpoint and eventually continue from last checkpoint.
last_checkpoint = None
if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir:
    last_checkpoint = get_last_checkpoint(training_args.output_dir)
    if last燃料电池训练过程中,保存的模型是自动合并的模型吗?还是单独的lora模型?这段代码,确定下模型在进行lora训练过程,保存的模型是自动合并的模型吗?还是单独的lora模型?

在LoRA训练过程中,原始模型的权重被冻结,而LoRA层的权重被训练。LoRA层通过在原始模型的权重矩阵上添加低秩结构来实现微调,这样可以有效地调整模型的行为,同时保持原始模型的大部分参数不变。

在代码中,有以下与LoRA相关的部分:

```python
if model_args.use_backbone_lora:
    model.wrap_backbone_lora(r=model_args.use_backbone_lizer, lora_alpha=2 * model_args.use_backbone_lora)
    model.config.use_backbone_lora = model_args.use_backbone_lora

if model_args.use_llm_lora:
    model.wrap_llm_lora(r=model_args.use_llm_lora, lora_alpha=2 * model_args.use_llm_lora)
    model.config.use_llm_lora = model_args.use_llm_lora

这些代码片段调用了wrap_backbone_lorawrap_llm_lora方法来为模型的视觉和语言模型部分添加LoRA层。

关于保存的模型,代码中的这一部分:

trainer.save_model()  # Saves the tokenizer too for easy upload

这行代码会保存整个模型,包括原始模型的权重和LoRA层的权重。这意味着保存的模型是一个合并的模型,它包含了原始模型的参数和通过LoRA训练更新的参数。

因此,根据这段代码,保存的模型是一个自动合并的模型,它不仅包含原始模型的权重,还包含了LoRL训练过程中,保存的模型是自动合并的模型吗?还是单独的lora模型?这段代码,确定下模型在进行lora训练过程,保存的模型是自动合并的模型吗?还是单独的lora模型?

在LoRA训练过程中,原始模型的权重被冻结,而LoRA层的权重被训练。LoRA层通过在原始模型的权重矩阵上添加低秩结构来实现微调,这样可以有效地调整模型的行为,同时保持原始模型的大部分参数不变。

在代码中,有以下与LoRA相关的部分:

if model_args.use_backbone_lora:
    model.wrap_backhead_lora(r=model_args.use_backbone_lora, lora_alpha=2 * model_args.use_backbone_lora)
    model.config.use_backbone_lora = model_args.use_backbone_lora

if model_args.use_llm_lora:
    model.wrap_llm_lora(r=model_args.use_llm_lizer, lora_alpha=2 * model_args.use_llm_lora)
    model.config.use_llm_lora = model_args.use_llm_lora

这些代码片段调用了wrap_backbone_lizerwrap_llm_lora方法来为模型的视觉和语言模型部分添加LoRA层。

关于保存的模型,代码中的这一部分:

trainer.save_model()  # Saves the tokenizer too for easy upload

这行代码会保存整个模型,包括原始模型的权重和LoRA层的权重。这意味着保存的模型是一个合并的模型,它包含了原始模型的参数和通过LoRA训练更新的参数。

因此,根据这段代码,保存的模型是一个自动合并的模型,它不仅包含原始模型的权重,还包含了LoRA层的权重。这不是一个单独的LoRA模型,而是一个完整的、经过LoRA微调的多模态模型。

这段代码是一个用于训练和微调多模态大型语言模型(如InternVL-2.0)的脚本。在这个脚本中,使用了LoRA(Low-Rank Adaptation)技术来调整模型的特定部分。LoRA 是一种参数效率更高的方法,用于在不显著增加模型大小的情况下调整预训练模型的行为。

在脚本中,有两处与LoRA相关的代码:

  1. if model_args.use_backbone_lora: 检查是否使用LoRA来调整视觉模型(backbone)的部分。
  2. if model_args.use_llm_lora: 检查是否使用LoRA来调整语言模型(LLM)的部分。

当设置 model_args.use_backbone_loramodel_args.use_llm_lora 为大于0的值时,会通过调用 wrap_backbone_lorawrap_llm_lora 方法来应用LoRA。这些方法会修改模型的相应部分,以引入LoRA的低秩结构。

关于模型保存的部分,在脚本的最后:

if training_args.do_train:
    # ...
    train_result = trainer.train(resume_from_checkpoint=checkpoint)
    trainer.save_model()  # Saves the tokenizer too for easy upload

这里,trainer.save_model() 方法被用来保存训练后的模型。根据 transformers 库的默认行为,保存的模型将包括所有修改,包括任何通过LoRA引入的调整。因此,保存的模型是一个完整的模型,它包含了LoRA的调整,而不是一个单独的LoRA模型。

这意味着保存的模型文件将包括原始的预训练参数以及通过训练过程中的LoRA调整更新的参数。加载这个保存的模型将恢复完整的模型权重,可以直接用于推理或进一步的训练。

需要注意的是,具体的保存细节可能会受到 transformers 库版本和脚本中其他自定义逻辑的影响。如果需要确切的行为,可以查看 save_model 方法的具体实现或在保存模型后检查保存的文件内容。

是的,这段代码支持断点训练,即可以从之前训练中断的地方继续训练模型。这通常通过指定一个检查点(checkpoint)来实现,检查点包含了模型在某一训练阶段的所有状态信息,包括权重、优化器状态、训练轮次等。

在代码中,这一功能通过以下部分实现:

  1. 检测最后检查点

    last_checkpoint = get_last_checkpoint(training_args.output_dir)
    

    这段代码会检查输出目录中是否存在检查点,get_last_checkpoint 函数会返回目录中最后保存的检查点文件的路径。

  2. 继续训练

    if training_args.resume_from_checkpoint is not None:
        checkpoint = training_args.resume_from_checkpoint
    elif last_checkpoint is not None:
        checkpoint = last_checkpoint
    

    这里,如果用户没有明确指定从哪个检查点恢复(通过 training_args.resume_from_checkpoint),代码会尝试从最后检测到的检查点继续训练。

  3. 训练调用

    train_result = trainer.train(resume_from_checkpoint=checkpoint)
    

    在调用 trainer.train() 方法时,通过 resume_from_checkpoint 参数指定了从哪个检查点恢复训练。

如何使用断点训练

要使用断点训练功能,你可以在命令行中指定 --resume_from_checkpoint 参数,或者在 JSON 配置文件中设置该参数。例如:

python your_script.py --resume_from_checkpoint <path_to_checkpoint>

或者在 JSON 配置文件中:

{
  "resume_from_checkpoint": "<path_to_checkpoint>"
}

注意事项

  • 确保检查点路径正确,且检查点文件未损坏。
  • 检查点文件通常很大,确保有足够的存储空间。
  • 在继续训练前,最好验证检查点的内容,确保它包含所有必要的训练状态信息。

通过这种方式,代码能够灵活地从中断的地方恢复训练,这对于长时间训练任务非常有用,可以在出现意外中断(如硬件故障、电源中断等)时保护训练进度。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值