LLaMA2微调时数据集格式错误导致的问题记录
在使用LLaMA2进行微调的过程中,遇到了一个非常典型的配置错误问题:数据集格式不正确导致训练失败。本文将详细记录该问题的排查过程与解决方法。
问题现象
在使用HuggingFace的Trainer API进行微调时,训练过程中出现如下报错信息:
ValueError: Expected a list of tensors, got <class 'dict'>
该错误提示表明,在数据加载阶段,模型期望接收一个张量列表,但实际接收到的是字典格式的数据。
原因分析
通过深入排查发现,问题出在数据集文件格式上。我们使用的数据集是一个JSONL格式的文件,其中每行是一条样本,但字段结构不符合Trainer的要求。例如:
{"prompt": "你好", "completion": "你好啊"}
{"prompt": "今天天气怎么样?", "completion": "天气很好。"}
而我们期望的数据格式是:
{'input_ids': [1, 2, 3], 'labels': [1, 2, 3]}
解决方案
为了解决这个问题,我们需要在数据预处理阶段将原始数据转换为模型可接受的格式。以下是完整的代码示例:
from datasets import load_dataset
from transformers import LlamaTokenizer
# 加载tokenizer和数据集
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = LlamaTokenizer.from_pretrained(model_name)
# 自定义数据预处理函数
def preprocess_function(examples):
prompts = examples["prompt"]
completions = examples["completion"]
# 构造完整的输入格式
full_prompts = [f"{prompt} {completion}" for prompt, completion in zip(prompts, completions)]
# 使用tokenizer进行编码
model_inputs = tokenizer(full_prompts, truncation=True, padding="max_length", max_length=512)
return model_inputs
# 加载数据集并应用预处理
train_dataset = load_dataset("json", data_files="train.jsonl")
processed_dataset = train_dataset.map(preprocess_function, batched=True)
最佳实践建议
- 数据格式必须符合模型要求,通常为
input_ids和labels的字典结构 - 预处理阶段要统一处理特殊字符和长度截断问题
- 使用
datasets.Dataset.map()进行批处理,提高预处理效率
该问题在生产环境部署中尤其重要,因为不正确的数据格式可能导致训练任务无法启动或中途失败。

讨论