使用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],触发解包错误。
修复步骤
- 替换数据整理器:将
DataCollatorForMultipleChoice替换为因果语言模型专用的DataCollatorForLanguageModeling - 修正导入语句:确保从
transformers库导入正确的DataCollator - 设置正确参数:由于因果语言模型采用自回归训练,需将
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
相关产品推荐
相关产品推荐

