启动训练脚本

用户在安装了InternEvo之后,需要自行编写训练启动脚本,请参考: train.py

脚本中的流程可以分为三步:参数解析、初始化、启动训练。其中参数解析和初始化过程的具体原理参见: 训练初始化

配置参数解析

args = parse_args()

调用 parse_args 函数,解析在启动训练传入的配置文件中设置的参数。详见: 命令行参数解析

初始化过程

  • 初始化分布式训练环境

initialize_distributed_env(config=args.config, launcher=args.launcher, master_port=args.port, seed=args.seed)

调用 initialize_distributed_env 函数,支持通过 slurm 或 torch 方式启动训练脚本,并传入配置文件、端口号、进程随机种子等信息。函数详细说明如下:

  • 初始化模型

model = initialize_model_and_parallel_communicator()

详细介绍请参考: 模型初始化

  • 初始化训练数据加载器

train_dl, dataset_types = build_train_loader_with_data_type()

详细介绍请参考: 数据加载器初始化

  • 初始化验证数据加载器

val_dls = build_valid_loader_with_data_type()

初始化验证数据加载器,加载过程与训练数据加载类似,通过配置文件中的 ``VALID_FOLDER `` 字段设置验证数据集路径。

  • 初始化Trainer

trainer = TrainerBuilder(model, train_dl, val_dls, **kwargs)

这里 TrainerBuilder 接口继承自 Trainer 类,InternEvo 的训练 API 由 internlm.core.trainer.Trainer 管理。在定义了训练引擎和调度器之后,我们可以调用 Trainer API 来执行模型训练、评估、梯度清零和参数更新等。

有关详细用法,请参阅 Trainer API 文档和示例。

启动训练过程

trainer.fit()

首先,通过 self.train() 方法,将模型设置为training状态。

在每一步训练的过程中,通过 load_new_batch 加载数据集。 然后通过 execute_schedule 调度器启动训练,调用 forward_backward_step 开始forward及backward训练过程。 之后,通过 self.step() 更新参数,并返回梯度值。 如果达到了需要验证的step数,则通过 evaluate_on_val_dls 对模型训练结果进行评估。 最后,如果开启了保存ckpt功能,通过 try_save_checkpoint 函数保留训练中间状态以及最终训练结果。