代码之家  ›  专栏  ›  技术社区  ›  Juble

在将attention_mask添加到模型中并微调gemma2后,损失变为Nan

  •  0
  • Juble  · 技术社区  · 5 月前

    我试图在我自己的数据集上对gemma2 2b模型进行微调,以用于序列分类任务。但当我测试模型时,我发现在我将注意力任务插入模型后,损失变成了Nan。

    这是我的代码

    from peft import get_peft_model, LoraConfig, TaskType
    from transformers import (AutoTokenizer,Gemma2ForSequenceClassification,DataCollatorWithPadding)
    import torch
    
    temp = Gemma2ForSequenceClassification.from_pretrained(
    "gemma2b",device_map="auto",torch_dtype=torch.bfloat16)
    
    peft_config = LoraConfig(
        task_type=TaskType.SEQ_CLS,
        inference_mode=False,
        r=8,
        lora_alpha=32,
        lora_dropout=0.1,
        target_modules=['down_proj','o_proj','k_proj','q_proj','gate_proj','up_proj','v_proj']
    )
    
    model = get_peft_model(temp, peft_config)
    model.print_trainable_parameters()
    tokenizer = AutoTokenizer.from_pretrained("gemma2b")
    
    label=torch.tensor([0]).to('cuda')
    
    raw_t=tokenizer(['I like it too'],return_tensors='pt',padding='max_length',max_length=10).to('cuda')
     
    print(model(input_ids=raw_t.input_ids ,attention_mask=raw_t.attention_mask ,labels=label))
    

    Ane是输出:

    SequenceClassifierOutputWithPast(loss=tensor(nan, device='cuda:0', dtype=torch.bfloat16, grad_fn=<NllLossBackward0>), logits=tensor([[nan, nan]], device='cuda:0', dtype=torch.bfloat16,grad_fn=<IndexBackward0>), past_key_values=None, hidden_states=None, attentions=None)
    

    如果我不插入attention_mask,损失看起来很好。

    此外,我注意到,如果我不将输入填充到max_length(attention_mask都是1),就不会出现问题。

    如果我将精度更改为float16,损失似乎也很正常。

    有人能帮我解决这个问题吗?

    0 回复  |  直到 5 月前
        1
  •  0
  •   Juble    5 月前

    这就是默认关注的问题。 应用闪光注意力可以解决这个问题:

    https://github.com/huggingface/transformers/issues/32390