我试图在我自己的数据集上对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,损失似乎也很正常。
有人能帮我解决这个问题吗?