You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

关键修改点说明

  1. 传入DataCollator:在Trainer初始化时添加data_collator=data_collator,该组件会自动将input_ids复制为labels,并对padding部分的标签掩码,避免无效损失计算
  2. 移除错误的label_names:删除TrainingArguments中错误的label_names配置,Trainer会自动识别因果语言模型所需的labels
  3. 定义start变量:在训练开始前添加start = time.time(),修复时间打印的NameError
  4. 简化分词函数:无需手动处理labels,交给data_collator完成即可

额外建议

  • 可以去掉compute_metrics函数和accuracy指标加载,因为accuracy并不适合生成式任务的评估,后续可使用BLEU、ROUGE或人工评估来衡量生成效果
  • GPT-J-6B显存占用较高,若出现OOM错误,可在TrainingArguments中添加gradient_accumulation_steps=4等参数,通过梯度累积变相增大批次大小

内容的提问来源于stack exchange,提问作者DirectNirvana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:32:10