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

调用GPT2的trainer.train()触发torch.embedding索引越界错误求助

解决GPT2训练时的IndexError问题

问题根源

你手动设置的GPT2Config里vocab_size=10000,但使用的GPT2Tokenizer.from_pretrained('gpt2')的词汇表大小是50257。模型的embedding层权重只初始化了10000个词的向量,但tokenizer生成的部分token id会超过10000,导致torch.embedding时索引越界。

解决方案

有两种可行的修复方式,根据需求选择:

方式一:使用预训练GPT2模型的默认配置(推荐)

直接加载预训练的GPT2模型,不用手动创建config,模型和tokenizer的词汇表大小会自动匹配:

from transformers import GPT2LMHeadModel, GPT2Tokenizer, TextDataset, DataCollatorForLanguageModeling, Trainer, TrainingArguments

# 直接加载预训练模型和对应的tokenizer
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')

train_data = TextDataset(tokenizer=tokenizer, file_path='train.txt', block_size=256)

training_args = TrainingArguments(
    output_dir='./models',
    overwrite_output_dir=True,
    num_train_epochs=1,
    per_device_train_batch_size=4,
    save_steps=1000,
    save_total_limit=2,
    prediction_loss_only=True,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_data,
    data_collator=DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False),
)
trainer.train()

方式二:自定义模型配置并匹配tokenizer词汇表大小

如果确实需要自定义模型参数(层数、隐藏层维度等),需确保vocab_size和tokenizer的实际词汇表大小一致:

from transformers import GPT2Config, GPT2LMHeadModel, GPT2Tokenizer, TextDataset, DataCollatorForLanguageModeling, Trainer, TrainingArguments

tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
# 获取tokenizer的实际词汇表大小
vocab_size = tokenizer.vocab_size

# 自定义config时使用该vocab_size
config = GPT2Config(
    vocab_size=vocab_size, 
    n_positions=256, 
    n_ctx=256, 
    n_embd=512, 
    n_layer=12, 
    n_head=8
)

model = GPT2LMHeadModel(config=config)

train_data = TextDataset(tokenizer=tokenizer, file_path='train.txt', block_size=256)

training_args = TrainingArguments(
    output_dir='./models',
    overwrite_output_dir=True,
    num_train_epochs=1,
    per_device_train_batch_size=4,
    save_steps=1000,
    save_total_limit=2,
    prediction_loss_only=True,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_data,
    data_collator=DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False),
)
trainer.train()

注意:Trainer初始化时无需重复设置prediction_loss_only=True,TrainingArguments中已配置该参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:08:12