LLMs之Chinese-LLaMA-Alpaca-2:源码解读(run_clm_sft_with_peft.py文件)—模型训练前置工作(参数解析+配置日志)→模型初始化(检测是否存在训练过的checkpoint+加载预训练模型和tokenizer)→数据预处理(监督式任务的数据收集器+指令数据集【json格式】)→优化模型配置(模型量化+匹配模型vocabulary大小与tokenizer+初始化PEFT模型【LoRA】+CheckPointing等)→模型训练(继续训练+评估指标+自动保存中间训练结果)/模型评估(+PPL指标)
目录
源码解读(run_clm_sft_with_peft.py文件)详细步骤
# 1.1、参数解析(基于HfArgumentParser库)三个主要参数类
# 1.1.1、if判断,根据命令行参数的不同,可以选择从命令行或JSON配置文件中获取参数
# 1.1.2、根据训练参数检查是否将llama_attn需要替换为flash_attn注意力机制,检查training_args中的flash_attn参数是否设置,
# 1.1.3、向某个监控或记录系统发送一条遥测数据(更好地分配资源来维护它们),包括模型参数配置和数据处理参数配置。
# 1.2、配置日志:包括日志格式和级别。通过日志了解训练过程,观察问题和进度
# 2.1、检测是否存在训练过的checkpoint(可恢复并继续训练),确保训练过程的连续性和稳定性,这有助于在训练过程中灵活地管理和恢复模型训练。
# 2.1.1、验证输出目录是否存在、检查是否为训练步骤、是否允许覆盖输出目录
# 3.1、创建一个监督式学习任务的数据收集器data_collator,用于将样本批量处理成模型可以接受的格式
# 3.3.1、if判断执行模型训练:包括构建指令数据集,输出数据集示例
# 3.3.2、if判断执行模型评估:包括构建指令数据集,输出数据集示例
# 4、优化模型配置:否启用量化、设置LoRA参数、是否使用梯度检查点
# 4.1.0、定义torch_dtype:指定张量数据类型的可选参数
# 4.1.1、定义compute_dtype:根据模型training_args参数决定浮点数精度
# 4.1.2、如果启用模型量化:判断是否为4bit或8bit,表示是否要进行4位或8位的位加载
# 4.2、预训练模型初始化,加载模型, 同时匹配模型vocabulary大小与tokenizer,它初始化好模型后, 就可以进行下游任务如微调训练等过程了
# 4.1.0用于将设备名称映射到整数值,在模型初始化时,将使用device_map来指定模型运行的设备。
# 4.2.1、先从预训练模型加载模型,指定了许多参数,包括模型名称或路径、配置、缓存目录、数据类型、梯度检查点配置、量化配置等。这将创建一个适用于因果语言建模任务的模型。
# 4.2.4、处理模型vocabulary大小与tokenizer匹配问题
# 4.3、初始化PEFT模型:为后续微调训练提供了已初始化的PEFT模型
# 4.3.1、if判断,如果提供了peft_path,则从预训练模型加载已经训练好的PEFT模型,否则从配置文件中根据一系列参数初始化一个新的模型
# 4.5、循环模型所有模块,根据一系列条件和模块名称来调整模型的配置,包括数据类型和梯度要求
# 4.6、调整模型参数状态以满足后续特定需求:目的是向后兼容训练得到的模型,保留模型原始结构
# 5、模型训练和评估: 周期性保存checkpoint,输出结果和模型参数
# 5.1、配置训练器Trainer并添加回调函数来定期自动保存中间训练
# 5.1.1、初始化Trainer对象进行模型训练,会自动完成迭代、优化等训练流程
# 5.1.2、添加回调函数SavePeftModelCallback实现定期自动保存中间训练
# 5.2、if判断执行模型【训练】任务:支持加载checkpoint继续训练。
# 5.2.1、判断从哪个checkpoint点恢复训练(继续训练的方式):根据以下情况选择恢复训练的检查点
# 5.2.2、调用trainer.train()方法来开始或继续训练模型,并传递了检查点信息
# 5.2.3、训练结果中获取训练指标metrics(如loss等),并记录这些指标
# 5.2.5、保存metrics、模型参数和模型状态,以便可以恢复训练
# 5.3.1、调用trainer.evaluate()方法评估模型
# 5.3.3、metrics内新增PPL指标,它通常用于衡量语言模型的性能。Perplexity越低,表示模型的性能越好。