如何避免T5模型训练时重复打印Generate config日志?
问题
训练google/flan-t5-base模型时,每次执行评估步骤后都会重复打印Generate config GenerationConfig相关日志,干扰训练全局状态的查看。尝试设置os.environ.TF_CPP_MIN_LOG_LEVEL=2修改日志级别,但没有效果。
日志示例
***** Running Evaluation ***** Num examples = 819 Batch size = 32 Generate config GenerationConfig { "decoder_start_token_id": 0,
"eos_token_id": 1, "output_attentions": true,
"output_hidden_states": true, "pad_token_id": 0,
"transformers_version": "4.26.1" }
...
训练代码
from transformers import AutoModelForSeq2SeqLM model_id="google/flan-t5-base" model = AutoModelForSeq2SeqLM.from_pretrained(model_id) repository_id = f"{model_id.split('/')[1]}-{dataset_id}" training_args = Seq2SeqTrainingArguments( output_dir=repository_id, #gradient_accumulation_steps = 8, per_device_train_batch_size=8, per_device_eval_batch_size=8, predict_with_generate=True, fp16=False, # Overflows with fp16 learning_rate=5e-6, num_train_epochs=5, optim = "adamw_torch", logging_dir=f"{repository_id}/logs", logging_strategy="steps", logging_steps=50, evaluation_strategy="steps", eval_steps=5, save_strategy="steps", save_total_limit=2, load_best_model_at_end=True, report_to="tensorboard", push_to_hub=False, hub_strategy="every_save", hub_model_id=repository_id, hub_token=HfFolder.get_token(), ) trainer = Seq2SeqTrainer( model=model, args=training_args, data_collator=data_collator, train_dataset=tokenized_dataset["train"], eval_dataset=tokenized_dataset["test"], compute_metrics=compute_metrics, ) trainer.train()
尝试过的无效方法
import os os.environ.TF_CPP_MIN_LOG_LEVEL=2
解决方法
方法1:调整transformers库的日志级别
TF的日志设置对transformers内部日志无效,需直接调整transformers的日志等级:
import logging from transformers import logging as hf_logging # 只输出错误信息,过滤INFO及以下日志 hf_logging.set_verbosity_error() # 若需要保留警告信息,可改为: # hf_logging.set_verbosity_warning()
方法2:显式指定生成配置并关闭冗余输出
在初始化Seq2SeqTrainingArguments时,通过generation_config参数定义生成配置,关闭不需要的输出项(日志中output_attentions和output_hidden_states为True是冗余项,默认应为False):
from transformers import GenerationConfig gen_config = GenerationConfig( decoder_start_token_id=0, eos_token_id=1, pad_token_id=0, output_attentions=False, output_hidden_states=False, ) training_args = Seq2SeqTrainingArguments( # 其他原有参数保持不变 generation_config=gen_config, )
方法3:自定义Trainer屏蔽评估时的冗余日志
如果前两种方法无效,可以自定义Seq2SeqTrainer,临时调整评估过程中的日志级别:
from transformers import Seq2SeqTrainer, logging as hf_logging class CustomSeq2SeqTrainer(Seq2SeqTrainer): def evaluate(self, eval_dataset=None, ignore_keys=None, metric_key_prefix="eval"): # 保存原日志级别,临时设为ERROR original_verbosity = hf_logging.get_verbosity() hf_logging.set_verbosity_error() result = super().evaluate(eval_dataset, ignore_keys, metric_key_prefix) # 恢复原日志级别 hf_logging.set_verbosity(original_verbosity) return result # 使用自定义Trainer替代原Trainer trainer = CustomSeq2SeqTrainer( model=model, args=training_args, data_collator=data_collator, train_dataset=tokenized_dataset["train"], eval_dataset=tokenized_dataset["test"], compute_metrics=compute_metrics, )
内容的提问来源于stack exchange,提问作者good_guy_from_ozzi
相关产品推荐
相关产品推荐

