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

使用LoRA微调LLM时遇ValueError报错:too many values to unpack (expected 2)

问题描述

在使用LoRA微调大语言模型(LLM,基于facebook/opt-6.7b)时,运行训练代码触发如下报错:

ValueError: too many values to unpack (expected 2)

相关代码:

import os
os.environ["CUDA_VISIBLE_DEVICES"]="0"
import torch
import torch.nn as nn
import bitsandbytes as bnb
from transformers import AutoTokenizer, AutoConfig, AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "facebook/opt-6.7b", 
    load_in_8bit=True, 
    device_map='auto',
)

tokenizer = AutoTokenizer.from_pretrained("facebook/opt-6.7b")
for param in model.parameters():
  param.requires_grad = False  # 冻结模型
  if param.ndim == 1:
    # 为稳定将层归一化转换为fp32
    param.data = param.data.to(torch.float32)

model.gradient_checkpointing_enable()
model.enable_input_require_grads()

class CastOutputToFloat(nn.Sequential):
  def forward(self, x): return super().forward(x).to(torch.float32)
model.lm_head = CastOutputToFloat(model.lm_head)
from transformers import AutoModelForMultipleChoice, TrainingArguments, Trainer
model_dir = 'output'
from peft import LoraConfig, get_peft_model 
import transformers
config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)
model = get_peft_model(model, config)
training_args = TrainingArguments(
    output_dir=model_dir,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    learning_rate=3e-5,
    per_device_train_batch_size=4,
    per_device_eval_batch_size=8,
    num_train_epochs=7,
    weight_decay=0.01,
    report_to='none'
)
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_train_ds,
    eval_dataset=tokenized_train_ds,
    tokenizer=tokenizer,
    data_collator=DataCollatorForMultipleChoice(tokenizer=tokenizer),
)

model.config.use_cache = False  # 消除警告,推理时需重新启用。
trainer.train()

报错堆栈:

ValueError                                Traceback (most recent call last)
Cell In[8], line 13
      3 trainer = Trainer(
      4     model=model,
      5     args=training_args,
   (...)
      9     data_collator=DataCollatorForMultipleChoice(tokenizer=tokenizer),
     10 )
     12 model.config.use_cache = False  # 消除警告,推理时需重新启用。
---> 13 trainer.train()

File ~/llm/venv/lib/python3.8/site-packages/transformers/trainer.py:1526, in Trainer.train(self, resume_from_checkpoint, trial, ignore_keys_for_eval, **kwargs)
   1521     self.model_wrapped = self.model
   1523 inner_training_loop = find_executable_batch_size(
   1524     self._inner_training_loop, self._train_batch_size, args.auto_find_batch_size
   1525 )
-> 1526 return inner_training_loop(
   1527     args=args,
   1528     resume_from_checkpoint=resume_from_checkpoint,
   1529     trial=trial,
   1530     ignore_keys_for_eval=ignore_keys_for_eval,
   1531 )

File ~/llm/venv/lib/python3.8/site-packages/transformers/trainer.py:1796, in Trainer._inner_training_loop(self, batch_size, args, resume_from_checkpoint, trial, ignore_keys_for_eval)
...
--> 637 batch_size, seq_length = input_shape
    638 past_key_values_length = past_key_values[0][0].shape[2] if past_key_values is not None else 0
    639 # required mask seq length can be calculated via length of past

ValueError: too many values to unpack (expected 2)
解决方法

问题根源

任务类型不匹配:配置的是**因果语言模型(CAUSAL_LM)**用于自回归类任务(如文本生成、续写),但错误使用了针对多项选择任务的DataCollatorForMultipleChoice。该数据整理器会给输入张量添加额外维度(对应选项数量),导致模型预期的[batch_size, seq_length]形状变成[batch_size, num_choices, seq_length],触发解包错误。

修复步骤

  1. 替换数据整理器:将DataCollatorForMultipleChoice替换为因果语言模型专用的DataCollatorForLanguageModeling
  2. 修正导入语句:确保从transformers库导入正确的DataCollator
  3. 设置正确参数:由于因果语言模型采用自回归训练,需将mlm参数设为False(掩码语言模型任务才需要设为True)

修改后的关键代码片段:

# 替换原有的AutoModelForMultipleChoice导入,新增DataCollatorForLanguageModeling
from transformers import TrainingArguments, Trainer, DataCollatorForLanguageModeling

# 定义正确的数据整理器
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)

# 初始化Trainer时使用新的data_collator
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_train_ds,
    eval_dataset=tokenized_train_ds,
    tokenizer=tokenizer,
    data_collator=data_collator,
)

额外检查

确保tokenized_train_ds数据集格式符合因果语言模型要求:应包含input_ids、attention_mask字段,若为有监督微调任务,还需包含labels字段,不要携带多项选择任务特有的字段(如choices、单值label等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:55:53