解决HuggingFace Transformers Seq2Seq训练的生成控制弃用警告
我使用HuggingFace Transformers的Seq2SeqTrainer训练序列到序列模型时,出现了以下弃用警告:
/path/to/python3.9/site-packages/transformers/generation/utils.py:1219: UserWarning: You have modified the pretrained model configuration to control generation. This is a deprecated strategy to control generation and will be removed soon, in a future version. Please use a generation configuration file.
注:原提示中的文档链接已失效。
我的代码如下:
model = BartForConditionalGeneration.from_pretrained(checkpoint) model.config.output_attentions = True model.config.output_hidden_states = True training_args = Seq2SeqTrainingArguments( output_dir = "output_dir_here", evaluation_strategy = IntervalStrategy.STEPS, #"epoch", optim = "adamw_torch", # Use new PyTorch optimizer eval_steps = 1000, # New logging_steps = 1000, save_steps = 1000, learning_rate = 2e-5, per_device_train_batch_size = batch_size, per_device_eval_batch_size = batch_size, weight_decay = 0.01, save_total_limit = 3, num_train_epochs = 30, predict_with_generate=True, remove_unused_columns=True, fp16 = True, push_to_hub = True, metric_for_best_model = 'bleu', # New or "f1" load_best_model_at_end = True # New ) trainer = Seq2SeqTrainer( model = model, args = training_args, train_dataset = train_ds, eval_dataset = eval_ds, tokenizer = tokenizer, data_collator = data_collator, compute_metrics = compute_metrics, callbacks = [EarlyStoppingCallback(early_stopping_patience=3)] ) trainer.train()
训练可以正常完成,但我想解决这个弃用警告,该怎么修改代码?
版本信息:
- Transformers 4.28.1
- Python 3.9.7
这个警告的核心原因是直接修改模型主配置(model.config)来控制生成逻辑的做法已被弃用,官方现在要求用独立的GenerationConfig来管理生成相关的参数。
你的代码中修改了model.config.output_attentions和model.config.output_hidden_states,如果这两个参数是为了生成阶段输出注意力和隐藏状态,就需要把它们移到model.generation_config中设置;如果是训练阶段需要,那修改model.config没问题,但因为开启了predict_with_generate=True,训练器会触发生成逻辑,所以需要确保生成相关的配置都通过GenerationConfig来管理。
具体修改方案
方案一:直接修改模型的generation_config
model = BartForConditionalGeneration.from_pretrained(checkpoint) # 针对生成阶段的参数,修改model.generation_config而非model.config model.generation_config.output_attentions = True model.generation_config.output_hidden_states = True # 如果训练阶段也需要输出注意力和隐藏状态,保留这两行(可选) # model.config.output_attentions = True # model.config.output_hidden_states = True
方案二:显式创建GenerationConfig并绑定到模型
from transformers import GenerationConfig model = BartForConditionalGeneration.from_pretrained(checkpoint) # 从预训练模型加载生成配置 gen_config = GenerationConfig.from_pretrained(checkpoint) # 修改生成阶段需要的参数 gen_config.output_attentions = True gen_config.output_hidden_states = True # 将生成配置绑定到模型 model.generation_config = gen_config
方案三:在训练参数中指定生成配置
如果需要更明确地控制训练时的生成行为,可以在Seq2SeqTrainingArguments中传入generation_config参数:
training_args = Seq2SeqTrainingArguments( # 其他原有参数不变 predict_with_generate=True, generation_config=gen_config, # 传入前面定义好的gen_config )
完成以上修改后,弃用警告就会消失,同时符合Transformers的新规范。
内容的提问来源于stack exchange,提问作者Raptor

