在自然语言处理领域,像BERT这样的大型语言模型已经被广泛应用。然而,预训练这些模型通常被认为是只有少数资金充足的工业实验室才能承担得起的奢侈。那么,如何在更有限的预算下训练这样的模型呢?本文将介绍一种在24小时内使用单个低端深度学习服务器预训练掩码语言模型的方法。
本文介绍的方法基于Peter Izsak、Moshe Berchansky和Omer Levy在EMNLP 2021会议上发表的论文《How to Train BERT with an Academic Budget》。该项目的代码已在GitHub上开源,可以在IntelLabs/academic-budget-bert仓库中找到。
这种训练方法的核心在于通过软件优化、设计选择和超参数调优的组合,在原始预训练成本的一小部分下生成与BERT-base在GLUE任务上具有竞争力的模型。主要包括以下几个方面:
预训练使用run_pretraining.py
脚本进行。以下是使用论文中最佳配置进行训练的示例命令:
deepspeed run_pretraining.py \ --model_type bert-mlm --tokenizer_name bert-large-uncased \ --hidden_act gelu \ --hidden_size 1024 \ --num_hidden_layers 24 \ --num_attention_heads 16 \ --intermediate_size 4096 \ --hidden_dropout_prob 0.1 \ --attention_probs_dropout_prob 0.1 \ --encoder_ln_mode pre-ln \ --lr 1e-3 \ --train_batch_size 4096 \ --train_micro_batch_size_per_gpu 32 \ --lr_schedule time \ --curve linear \ --warmup_proportion 0.06 \ --gradient_clipping 0.0 \ --optimizer_type adamw \ --weight_decay 0.01 \ --adam_beta1 0.9 \ --adam_beta2 0.98 \ --adam_eps 1e-6 \ --total_training_time 24.0 \ --early_exit_time_marker 24.0 \ --dataset_path <dataset path> \ --output_dir /tmp/training-out \ --print_steps 100 \ --num_epochs_between_checkpoints 10000 \ --job_name pretraining_experiment \ --project_name budget-bert-pretraining \ --validation_epochs 3 \ --validation_epochs_begin 1 \ --validation_epochs_end 1 \ --validation_begin_proportion 0.05 \ --validation_end_proportion 0.01 \ --validation_micro_batch 16 \ --deepspeed \ --data_loader_type dist \ --do_validation \ --use_early_stopping \ --early_stop_time 180 \ --early_stop_eval_loss 6 \ --seed 42 \ --fp16
通过设置--total_training_time=24.0
可以将预训练限制在24小时内完成。这种基于时间的训练方法允许研究人员更好地控制训练过程,特别是在计算资源有限的情况下。
学习率可以根据配置的总训练时间进行调度变化。使用--lr_schedule time
来选择基于时间的学习率调度,并通过--curve=linear
定义退火曲线的形状。学习率的预热阶段由--warmup_proportion
指定,它表示训练会话中可用时间预算的比例。