[Python] Trainer is failing to load optimizer save state when resuming training

Discussão em 'Python' iniciado por Stack, Maio 18, 2025.

  1. Stack

    Stack Membro Participativo

    Intro to the problem


    I am trying to train Llama-3.1 8B on an H100 but I keep running into the following error when trying to resume training

    ...
    File "/home/jovyan/folder/training/.venv/lib/python3.10/site-packages/transformers/trainer.py", line 2405, in _inner_training_loop
    self._load_optimizer_and_scheduler(resume_from_checkpoint)
    File "/home/jovyan/folder/training/.venv/lib/python3.10/site-packages/transformers/trainer.py", line 3452, in _load_optimizer_and_scheduler
    self.optimizer.load_state_dict(
    File "/home/jovyan/folder/training/.venv/lib/python3.10/site-packages/accelerate/optimizer.py", line 107, in load_state_dict
    self.optimizer.load_state_dict(state_dict)
    File "/home/jovyan/folder/training/.venv/lib/python3.10/site-packages/torch/_compile.py", line 51, in inner
    return disable_fn(*args, **kwargs)
    File "/home/jovyan/folder/training/.venv/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py", line 838, in _fn
    return fn(*args, **kwargs)
    File "/home/jovyan/folder/training/.venv/lib/python3.10/site-packages/torch/optim/optimizer.py", line 872, in load_state_dict
    raise ValueError(
    ValueError: loaded state dict contains a parameter group that doesn't match the size of optimizer's group

    What I am trying to do


    I have two scripts, train.py and resume.py. train.py keeps crashing every now and then, likely due to issues with the hardware so I am trying to resume training from a checkpoint every time it crashes. I am also quantizing the model and using Lora to add trainable parameters.

    # train.py
    from data import LanguageDataset
    from torch.utils.data import DataLoader
    from transformers import Trainer, TrainingArguments, DataCollatorForLanguageModeling, AutoTokenizer, BitsAndBytesConfig, AutoModelForCausalLM
    from tokenization import LanguageTokenizer
    from torch.optim import AdamW
    import torch
    from peft import LoraConfig, TaskType, PeftModel, PeftConfig, get_peft_model
    from safetensors.torch import save_model


    def train_loop():

    dataset = LanguageDataset()

    quantization_configs = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    )

    model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B"
    , device_map="auto", quantization_config=quantization_configs)
    t = LanguageTokenizer().tokenizer
    model.resize_token_embeddings(len(t), mean_resizing=True)

    training_args = TrainingArguments(
    output_dir="./training_output",
    per_device_train_batch_size=8,
    num_train_epochs=3,
    save_steps=10,
    save_strategy="steps",
    save_safetensors=False,
    logging_steps=10,
    )

    lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    inference_mode=False,
    r=8,
    lora_alpha=32,
    lora_dropout=0.1
    )

    peft_model = get_peft_model(model=model, peft_config=lora_config)


    data_collator = DataCollatorForLanguageModeling(tokenizer=t, mlm=False)
    trainer = Trainer(
    model=peft_model,
    processing_class=t,
    args=training_args,
    train_dataset=dataset,
    data_collator=data_collator
    )


    trainer.train()


    if __name__ == "__main__":
    train_loop()


    # resume.py
    from data import LanguageDataset
    from torch.utils.data import DataLoader
    from transformers import Trainer, TrainingArguments, DataCollatorForLanguageModeling, AutoTokenizer, BitsAndBytesConfig, AutoModelForCausalLM
    from config import epochs, model_name, batch_size
    from tokenization import LanguageTokenizer
    from torch.optim import AdamW
    import torch
    from peft import LoraConfig, TaskType, PeftModel, PeftConfig
    from safetensors.torch import save_model

    def resume_loop():
    dataset = LanguageDataset()

    quantization_configs = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    )

    model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B", device_map="auto", quantization_config=quantization_configs)
    t = LanguageTokenizer().tokenizer
    model.resize_token_embeddings(len(t), mean_resizing=True)

    peft_model = PeftModel.from_pretrained(model, "./training_output/checkpoint-20")

    training_args = TrainingArguments(
    output_dir="./training_output",
    per_device_train_batch_size=8,
    num_train_epochs=3,
    save_steps=10,
    save_strategy="steps",
    save_safetensors=False,
    logging_steps=10,
    )

    data_collator = DataCollatorForLanguageModeling(tokenizer=t, mlm=False)

    t = AutoTokenizer.from_pretrained("./training_output/checkpoint-20")
    trainer = Trainer(
    model=peft_model,
    processing_class=t,
    args=training_args,
    train_dataset=dataset,
    data_collator=data_collator,
    )


    trainer.train(resume_from_checkpoint="./training_output/checkpoint-20")


    if __name__ == "__main__":
    resume_loop()


    The tokenizer I am defining is Llama's pretrained tokenizer in the AutoTokenizer class. It is tokenizing with a target_text so the outputs include input_ids, attention_mask and labels.

    The issue seems to be with loading the optimizer save state. In the checkpoint folder, optimizer.pt and scheduler.pt files do exist. But I am quite a bit confused because I am letting Trainer pick the optimizer and scheduler. I am not quite sure what I am doing wrong here.

    I've tried to make my code resemble as closely to other training code I found on the internet. I have also tried disabling mean_resizing to no avail.

    Continue reading...

Compartilhe esta Página