使用 Huggingface 变压器仅保存最佳权重

See*_*Lee 14 nlp deep-learning pytorch huggingface-transformers

目前,我正在使用 Huggingface-transformers 构建一个新的基于 Transformer 的模型,其中注意力层与原始模型不同。我曾经run_glue.py在 GLUE 基准测试上检查模型的性能。然而,我发现huggingface-transformers的Trainer类保存了我设置的所有检查点,其中我可以设置要保存的最大检查点数量。但是,我只想保存验证数据集上具有最佳性能的权重(或优化器等其他内容),而当前的 Trainer 类似乎没有提供这样的东西。(如果我们设置检查点的最大数量,那么它会删除较旧的检查点,而不是性能较差的检查点)。有人已经在 Github 上问过同样的问题,但我不知道如何修改脚本并执行我想要的操作。目前,我正在考虑制作一个自定义 Trainer 类,继承原始类并更改train()方法,如果有一种简单易行的方法来做到这一点,那就太好了。提前致谢。

Sha*_*aza 12

您可以在huggingface中尝试训练师提供的以下参数

training_args = TrainingArguments(
    output_dir='/content/drive/results',          # output directory
    do_predict= True, 
    num_train_epochs=3,              # total number of training epochs
    **per_device_train_batch_size=4,  # batch size per device during training
    per_device_eval_batch_size=2**,   # batch size for evaluation
    warmup_steps=1000,                # number of warmup steps for learning rate  
    save_steps=1000,
    save_total_limit=10,
    load_best_model_at_end= True,
    weight_decay=0.01,               # strength of weight decay
    logging_dir='./logs',            # directory for storing logs
    logging_steps=0, evaluate_during_training=True)
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法来避免太多检查点并选择最佳模型。到目前为止,您不能只保存最好的模型,而是检查评估何时产生比前一个更好的结果。

  • 只是一点,如果你使用“load_best_model_at_end = True”,那么“save_steps”,显然,“save_total_limit”将被忽略 (2认同)

Kar*_*nil 12

我还没有看到任何参数。不过,有一个解决方法。

\n

使用以下组合

\n
    evaluation_strategy =\xe2\x80\x98steps\xe2\x80\x99,\n    eval_steps = 10, # Evaluation and Save happens every 10 steps\n    save_total_limit = 5, # Only last 5 models are saved. Older ones are deleted.\n    load_best_model_at_end=True,\n
Run Code Online (Sandbox Code Playgroud)\n

当我尝试使用上述组合时,任何时候都会在输出目录中保存 5 个以前的模型,但如果最佳模型不是其中之一,它也会保留最佳模型。所以这将是1+5模型。您可以更改 save_total_limit = 1 以便它将满足您的目的

\n


Wes*_* Na 5

这个答案可能有用

training_args = TrainingArguments(
    output_dir=repo_name,
    group_by_length=True,
    length_column_name='input_length',
    per_device_train_batch_size=24,
    gradient_accumulation_steps=2,
    evaluation_strategy="steps",
    num_train_epochs=20,
    fp16=True,
    save_steps=1000,
    save_strategy='steps', # we cannot set it to "no". Otherwise, the model cannot guess the best checkpoint.
    eval_steps=1000,
    logging_steps=1000,
    learning_rate=5e-5,
    warmup_steps=500,
    save_total_limit=3,
    load_best_model_at_end = True # this will let the model save the best checkpoint
)
Run Code Online (Sandbox Code Playgroud)