LLMs之InternLM-20B:源码解读(train.py文件)—初始化配置→数据预处理(txt/json/jsonl等需转换为bin/meta文件再入模)→模型训练(批处理加载+内存分析+支持在特定步数进行验证评估+TensorBoard可视化监控+支持分布式训练【多机多卡训练同步更新】)+模型评估(ACC+PPL)+性能监控(日志记录+性能分析+内存监控等)
目录
# 2.1、初始化训练和验证数据加载器:读取不同输入文件格式(txt/json/jsonl)转为bin文件再处理bin文件和meta文件为训练集
# 3.0、读取模型配置文件:从指定的配置文件中读取配置信息。
# 3.1、初始化模型:调用initialize_model函数初始化神经网络模型
# 3.2、初始化损失函数:调用FlashGPTLMLoss类初始化损失函数,其中可能包括一些并行计算。
# 3.3、初始化优化器、学习率调度器等并恢复训练状态:创建一个TrainState对象,用于存储训练状态,然后初始化优化器、学习率调度器等,同时尝试从之前的训练中恢复状态。
# (3)、初始化SchedulerMetricHook调度器钩子:可以根据metric调整学习率等超参数
# (4)、初始化训练器:根据训练指标自动调整学习率等超参数
# (5)、初始化内存分析工具:如果启用了内存分析,将会初始化一个内存分析工具。
# (6)、初始化批次跳过器:创建一个BatchSkipper对象,用于跳过一些批次的训练。
# 3.5、执行模型训练:批处理加载+内存分析+支持在特定步数进行验证评估+TensorBoard可视化监控+支持分布式训练【多机多卡训练同步更新】
# (1)、将训练数据加载器 train_dl 转换为一个迭代器对象 train_iter,用于逐批次地遍历训练数据。
# (2)、with语句初始化性能分析工具:执行下面的训练循环,并在循环结束后完成性能分析
# (3)、开始训练循环:进入一个训练循环,不断迭代数据批次进行模型训练。每个批次的训练包括前向传播、反向传播、参数更新、性能指标记录、验证等多个步骤。
# (4)、利用empty_cache_and_diag函数清理GPU内存或进行一些诊断操作,根据参数 interval 控制操作的频率。
# (5)、从训练数据加载器 train_dl 中获取一个新的数据批次
# (7)、判断是否应该跳过当前批次的训练:在满足一些条件的情况下跳过当前批次的训练,实现一些特定的训练策略或逻辑
# (8)、将模型参数的梯度清零,以准备进行反向传播。在每个训练批次开始前,通常需要清零梯度,因为梯度是在反向传播中累积的。
# (9)、处理数据:如果当前批次数据中包含名为 "type_ids" 的字段,通常用于处理多输入模型,其中 "type_ids" 可能用于区分不同类型的输入数据,例如文本和图像
# (10)、执行正向和反向传播:对当前模块启动记录计时器,并执行训练器的计划(schedule)来进行前向传播和反向传播,计算损失(loss)等。
# (11)、更新模型参数,会返回成功更新的状态和梯度范数信息;如果参数更新失败会增加一次无效记录并且发送一条警告消息
# (12)、计算和记录训练中的各种指标,如损失、准确度、梯度范数等。
# (13)、定期进行验证:在训练过程中,定期在验证数据集上评估模型的性能损失Loss+准确率ACC+困惑度PPL
# (15)、如果启用了内存分析器,用于跟踪记录模型训练过程中的内存使用情况
# 3.6、在训练结束后,等待异步上传操作完成,确保保存的训练状态已经完全上传或保存
源代码地址: