SFTTrainer中eos_token被替换为<EOS_TOKEN>,Qwen2TokenizerFast报错找不到该token
问题分析:SFTTrainer中eos_token被替换为<EOS_TOKEN>的原因
问题背景
将Python的trl包升级至0.18.1版本,使用其中的SFTTrainer微调Qwen2.5大语言模型,从TrainingArgument迁移至SFTConfig后,手动指定与Qwen2TokenizerFast匹配的eos_token="<|im_end|>",但创建训练器时该值被替换为<EOS_TOKEN>,触发错误:
"SFTTrainer: The specified
eos_token('<EOS_TOKEN>') is not found in the vocabulary of the givenprocessing_class(Qwen2TokenizerFast)"
训练器代码如下:
trainer = SFTTrainer( model=model, processing_class=tokenizer, train_dataset=train_dataset, eval_dataset=eval_dataset, data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer), callbacks=[train_log_callback], args=SFTConfig( per_device_train_batch_size=per_device_train_batch_size, gradient_accumulation_steps=gradient_accumulation_steps, warmup_steps=warmup_steps, num_train_epochs=max_epochs, max_steps=max_steps, max_seq_length=block_size, learning_rate=learning_rate, fp16=not is_bfloat16_supported(), bf16=is_bfloat16_supported(), logging_steps=logging_steps, optim="paged_adamw_8bit", weight_decay=0.01, lr_scheduler_type="linear", seed=random_seed, eval_strategy="epoch" if eval_dataset is not None else "no", save_strategy="no", output_dir="models", save_steps=50, report_to="none", packing=False, dataset_text_field="text", eos_token="<|im_end|>", # eos token is set! ), )
同时使用了unsloth工具,怀疑存在后台影响。
核心原因
- Unsloth的隐性token修改逻辑:Unsloth在处理Qwen系列模型时,会自动对tokenizer的特殊token进行替换,将
eos_token强制设置为内部定义的<EOS_TOKEN>,这个操作会在你设置SFTConfig之前就修改tokenizer的属性,导致后续传入训练器的tokenizer已经被篡改。 - SFTTrainer的参数优先级规则:在trl 0.18.1中,当
processing_class被指定为tokenizer时,SFTTrainer会优先读取tokenizer自身的eos_token属性,而非SFTConfig中手动设置的值。如果Unsloth已经修改了tokenizer的eos_token,训练器就会读取到<EOS_TOKEN>,触发词汇表不存在的错误。 - SFTConfig的参数同步机制:新版本的SFTConfig在初始化时会与
processing_class的配置做同步校验,若发现双方特殊token不一致,会以tokenizer的现有值为准,这进一步导致你手动设置的eos_token被覆盖。
临时解决思路
- 初始化Unsloth的tokenizer后,立即手动重置
tokenizer.eos_token = "<|im_end|>",再将tokenizer传入SFTTrainer - 不在SFTConfig中单独设置
eos_token,确保tokenizer的特殊token已经正确配置,让SFTTrainer自动读取tokenizer的默认设置 - 检查Unsloth的版本,查看其tokenizer处理模块的代码,确认是否存在可关闭的特殊token自动替换开关
内容的提问来源于stack exchange,提问作者soosmann
相关产品推荐
相关产品推荐

