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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:36:04