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

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 given processing_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:07:06