GPT-J模型简单微调无法运行的问题求助
解决GPT-J微调时"模型未返回loss"的问题
核心错误原因
你遇到的ValueError本质是Trainer没有获得用于计算损失的labels,结合代码来看,主要问题有:
- 初始化Trainer时未传入
data_collator,而你定义的DataCollatorForLanguageModeling是自动生成labels、处理padding掩码的关键组件 TrainingArguments里的label_names参数设置错误,因果语言模型的训练标签就是input_ids本身,错误的配置会导致Trainer无法识别损失计算所需输入- 代码末尾的
start变量未定义,会触发训练结束时的NameError
修复后的完整代码
from transformers import Trainer, TrainingArguments, AutoModelForCausalLM from transformers import GPTJForCausalLM, AutoTokenizer from datasets import load_dataset import time import torch import os import numpy as np import evaluate import transformers # 初始化模型与Tokenizer if torch.cuda.is_available(): print("Using CUDA!!!") model = GPTJForCausalLM.from_pretrained("EleutherAI/gpt-j-6B", torch_dtype=torch.float16).cuda() else: print("OOPS, NO CUDA") model = GPTJForCausalLM.from_pretrained("EleutherAI/gpt-j-6B", torch_dtype=torch.float16) tokenizer = AutoTokenizer.from_pretrained("EleutherAI/gpt-j-6B") model.config.pad_token_id = model.config.eos_token_id tokenizer.pad_token = tokenizer.eos_token # 分词函数 def tokenize_function(examples): return tokenizer(examples["text"], padding="max_length", truncation=True) # 加载并处理数据集 tuned_gptj = "./tuned_models/gpt-j-6B" current_dataset = load_dataset("csv", data_files="train.csv") tokenized_datasets = current_dataset.map(tokenize_function, batched=True) small_train_dataset = tokenized_datasets["train"].select(range(24000)) # 训练参数设置:移除错误的label_names配置 training_args = TrainingArguments( output_dir=tuned_gptj, report_to='all', logging_dir='./logs', per_device_train_batch_size=1, num_train_epochs=1, no_cuda=False, deepspeed='ds_config_stage1.json' ) # 初始化数据收集器(mlm=False对应因果语言模型训练) from transformers import DataCollatorForLanguageModeling data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False) # 初始化Trainer:必须传入data_collator trainer = Trainer( model=model, args=training_args, train_dataset=small_train_dataset, data_collator=data_collator ) # 启动训练 print("Starting training") start = time.time() trainer.train() print(f"Finished fine-tuning in {time.time() - start}")
关键修改点说明
- 传入DataCollator:在Trainer初始化时添加
data_collator=data_collator,该组件会自动将input_ids复制为labels,并对padding部分的标签掩码,避免无效损失计算 - 移除错误的label_names:删除
TrainingArguments中错误的label_names配置,Trainer会自动识别因果语言模型所需的labels - 定义start变量:在训练开始前添加
start = time.time(),修复时间打印的NameError - 简化分词函数:无需手动处理labels,交给data_collator完成即可
额外建议
- 可以去掉
compute_metrics函数和accuracy指标加载,因为accuracy并不适合生成式任务的评估,后续可使用BLEU、ROUGE或人工评估来衡量生成效果 - GPT-J-6B显存占用较高,若出现OOM错误,可在
TrainingArguments中添加gradient_accumulation_steps=4等参数,通过梯度累积变相增大批次大小
内容的提问来源于stack exchange,提问作者DirectNirvana
相关产品推荐
相关产品推荐

