DARWIN_CJQ 2024-11-16 14:34 采纳率: 0%
浏览 7

Whisper模型改造,断点续训出现问题。

https://github.com/yeyupiaoling/Whisper-Finetune
我是使用上面这个代码仓的代码,对基座模型Whisper进行修改,主要是添加了其他预训练音频模型与decoder的输入进行融合。

img

img


截图是我修改模型结构的代码,是在代码仓的finetune.py里修改的。

现在遇到的问题是:我在断点续训的时候发现loss比之前的检查点(checkpoint)大很多,我觉得是前面的训练是白费的。感觉添加的模块的参数没有被保存或者加载。

下面是我加载训练好模型的代码,代码的训练方式使用的是LoRA:

img

有无专家可以帮忙解决一下?

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    断点续训时遇到模型加载问题,特别是在添加了自定义层或模块的情况下,通常有几种可能的原因和解决方案:

    1. 自定义层的加载问题:确保自定义层 (CustomWhisperForConditionalGeneration) 在加载模型权重时能够正确加载。有时候,如果自定义层与基础模型的结构不完全匹配,可能会导致加载失败或参数不匹配的问题。检查自定义层的定义和初始化是否与基础模型兼容。
    2. 检查点加载方式:确保您正确加载了检查点。在断点续训时,确保检查点包含完整的模型状态,包括优化器的状态。有时候只加载模型权重可能导致问题。您可以尝试完整加载模型和优化器状态。
    3. 参数更新方式(LoRA):如果您使用的是LoRA(Low-Rank Adaptation)方法更新模型参数,确保在断点续训时正确处理这些更新。有时,直接加载基础模型的权重可能会忽略通过LoRA添加的更改。
    4. 设备兼容性:确保您在加载和训练模型时使用的设备是一致的。如果在GPU上训练模型然后在CPU上续训,可能会出现兼容性问题。
    5. 严格的权重加载:在调用 load_state_dict 时,使用 strict=False 参数会跳过不匹配的层。这可能会导致某些层没有被正确初始化或加载。尝试在不使用 strict=False 的情况下加载权重,看看是否所有层都能正确加载。
    6. 检查点路径和格式:确保检查点文件的路径正确,并且文件格式与您的代码兼容。有时文件损坏或不正确的格式也会导致加载失败。
    7. 调试和日志记录:增加日志记录来跟踪模型的加载过程,特别是在自定义层和权重加载时。这有助于诊断问题所在。

    关于代码的部分,确保以下几点:

    • 确保 CustomWhisperForConditionalGeneration 类正确继承自 WhisperForConditionalGeneration 并正确实现了所需的方法。
    • 在断点续训时,尝试先加载整个模型的检查点(包括优化器状态),然后再从该检查点开始训练,而不是先加载基础模型的权重然后再继续训练。
    • 检查 PeftModel.from_pretrained 方法的实现,确保它能够正确处理自定义层和权重。

    如果问题仍然存在,建议提供更详细的日志或错误消息,以便更准确地诊断问题所在。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月16日