使用Hugging Face微调GPTNeo时报序列长度不匹配ValueError如何解决
问题根因
报错出现在数据集拼batch阶段,你的训练文本每行长度不一致,token化后得到的input_ids序列长度也不同,Hugging Face默认的拼接函数不会自动处理填充,无法将不同长度的序列转换为同维度张量,因此抛出维度不匹配错误。
修复步骤
1. 给tokenizer配置填充标记
GPTNeo使用的GPT2Tokenizer默认没有PAD标记,需要用EOS标记替代:
tokenizer = GPT2Tokenizer.from_pretrained('EleutherAI/gpt-neo-1.3B') # 新增这行 tokenizer.pad_token = tokenizer.eos_token
2. 替换数据拼接器
使用专门针对自回归语言模型的拼接器,自动处理填充和标签生成,避免手动处理的疏漏:
首先导入依赖:
from transformers import DataCollatorForLanguageModeling
实例化拼接器,注意自回归模型要关闭MLM模式:
data_collator = DataCollatorForLanguageModeling( tokenizer=tokenizer, mlm=False )
将拼接器传入Trainer:
trainer = Trainer( model=model, args=training_args, train_dataset=ttk_dataset, # 新增这行 data_collator=data_collator )
可选优化:提升数据利用率
你当前是逐行token化,短文本会浪费大量填充位,建议做批量切分处理:
# token化阶段开启批处理,去掉原始text字段减少内存占用 def tokenize(batch): return tokenizer(batch['text'], truncation=True, max_length=512) tk_dataset = dataset.map(tokenize, batched=True, remove_columns=["text"]) # 将所有token拼接后切分为固定长度的块 def group_texts(examples): block_size = 512 concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()} total_length = len(concatenated_examples[list(examples.keys())[0]]) total_length = (total_length // block_size) * block_size result = { k: [t[i : i + block_size] for i in range(0, total_length, block_size)] for k, t in concatenated_examples.items() } # 自回归训练标签和输入一致 result["labels"] = result["input_ids"].copy() return result lm_dataset = tk_dataset.map(group_texts, batched=True)
后续训练直接使用lm_dataset作为训练集即可。
内容的提问来源于stack exchange,提问作者Ulto 4
相关产品推荐
相关产品推荐

