模型的基本搭建
基本工具的部署与实践
为了后续模型部分的代码更加简易的书写,我们小组先搜寻并写了一些通用工具来方便后续不同策略链的代码的实现,整个utils的目录整体如下,我将大致介绍每部分代码的大致功能,具体的使用过程在后续的具体使用时再详细阐述:
config.py:包含模型和训练的配置信息。
-
DatasetAttr 类
该类定义了数据集的属性。用于存储数据集属性,包含数据加载来源,名称,SHA1校验码等
-
load_from:从哪里加载数据。
-
dataset_name:数据集的名称。
-
dataset_sha1:数据集的哈希值。
-
source_prefix:可能用于指定数据的来源前缀。
-
prompt_column, query_column, response_column, history_column:指定数据集中的各列名称。
-
-
ModelArguments 类
此类定义了与模型相关的参数。
配置模型路径和缓存目录:指定预训练模型的路径或标识符以及缓存目录。 配置分词器:选择是否使用快速分词器。 配置身份验证:选择是否使用身份验证令牌。 配置模型版本:指定使用的模型版本。 配置量化选项:选择量化位数、类型以及是否使用双重量化。 配置检查点目录:指定保存检查点的目录。 配置奖励模型路径:指定奖励模型的路径。 配置微调选项:选择是否从上次的LoRA权重恢复训练。 配置训练损失绘图:选择是否在微调后绘制训练损失图。
-
model_name_or_path:预训练模型的路径或来自 huggingface.co/models 的模型标识符。
-
cache_dir:存储从 huggingface.co 下载的预训练模型的位置。
-
use_fast_tokenizer:是否使用快速分词器(由 tokenizers 库支持)。
-
use_auth_token:是否使用运行 huggingface-cli login 时生成的令牌。
-
model_revision:要使用的特定模型版本(可以是分支名称、标签名称或提交id)。
-
quantization_bit:量化模型的位数。
-
quantization_type:用于 int4 训练的量化数据类型。
-
double_quantization:是否使用双重量化。
-
-
GeneratingArguments 类
此类定义了与生成相关的参数。
-
do_sample:是否使用采样,否则使用贪婪解码。
-
temperature:用于调制下一个令牌的概率的值。
-
top_p:保持概率相加为 top_p 或更高的最小的最可能的令牌集。
-
top_k:用于 top-k 过滤的最高概率词汇令牌的数量。
-
num_beams:波束搜索的波束数。1 表示没有波束搜索。
-
max_length:生成令牌可以具有的最大长度。
-
max_new_tokens:要生成的令牌的最大数量,忽略提示中的令牌数量。
-
repetition_penalty:重复惩罚的参数。1.0 表示没有惩罚。
-
length_penalty:与基于波束的生成一起使用的长度的指数惩罚。
-
check.py:包含一些验证或检查逻辑。
other.py:包含一些其他的实用工具或函数。
-
无效分数处理,将Nan和Inf归零,遍历模型的所有参数。
-
将符合条件的 LayerNorm 层的参数数据类型转换为 float32。条件是参数维度为1且名称包含在 layer_norm_names 列表中的任意一个字符串。
-
这个函数用于加载可训练参数的检查点文件到模型中。
-
平滑
-
绘制损失函数图
peft_trainer.py: PEFT 的训练策略有关。
-
后续即将会使用
pairwise.py:与成对的数据操作或成对的损失函数有关。
-
实现了一些用于处理成对数据(Pairwise Data)的工具和类,主要包括数据收集器和训练器。这些工具主要用于训练模型时计算成对数据的损失和准确率。
-
PairwiseDataCollatorWithPadding类:继承自
DynamicDataCollatorWithPadding
,用于处理成对数据。__call__
方法将输入特征进行填充,使得每个 batch 中的序列长度一致。它生成了 2 倍的样本,其中前 n 个样本是被选择的,后 n 个样本是被拒绝的。 -
PairwisePeftTrainer类:该类继承自
PeftTrainer
,用于计算成对数据的损失。
common.py:包含一些公共的工具或函数。
-
数量巨大,随后随使用随分析。
-
模型加载:文件中的一部分关注于加载模型。根据不同的条件和参数,它决定从哪个检查点或路径加载模型。此外,它还处理了如何为不同的阶段准备模型,包括添加值头或加载奖励模型等。
-
适配器初始化:模型还经历了适配器的初始化过程,这可能涉及到模型的微调或其他特定任务的适应。
-
数据集预处理:根据训练的阶段,文件定义了如何预处理数据集。例如,对于预训练、有监督的微调、无监督的微调、对偶训练等,都有不同的预处理函数。
-
打印数据集示例:为了给用户提供更好的可见性,文件中有一些功能可以打印数据集的示例,以便用户可以查看经过预处理后的数据如何呈现。
-
其他实用函数:文件中还包含了其他一些实用函数,例如用于调整学习率的函数、用于计算奖励的函数等。
template.py:包含一些调用大模型的模板代码或函数。
-
类通过不同的模板配置,可以生成不同风格和格式的对话提示和内容,适用于各种对话场景。每个模板都可以配置特定的前缀、提示格式和分隔符,并且可以选择是否使用历史记录。这使得该类非常灵活和易于扩展,能够适应多种对话系统的需求。
data_collator.py:与数据整理或预处理有关的代码。
-
DynamicDataCollatorWithPadding
类通过继承DataCollatorWithPadding
,增加了动态填充和生成注意力掩码的功能,特别适用于批处理数据的填充和序列处理。它能够处理包含input_ids
和labels
的数据,确保在训练和评估时使用左侧填充,并生成相应的注意力掩码来标识填充部分。
ppo.py:与 PPO (Proximal Policy Optimization) 训练策略相关的代码。
seq2seq.py:与序列到序列模型相关的代码。与后续模型训练代码相关。文件主要涉及序列到序列模型的实现和评估。
-
导入模块:文件开始部分导入了必要的库和工具。
-
日志设置:使用 get_logger 函数创建日志记录器。
-
ComputeMetrics 类:此类将分词器包装到度量函数中,主要用于 Seq2SeqPeftTrainer 中。
-
call 方法:使用模型预测来计算度量标准。主要关注 Rouge 和 BLEU 分数的计算。
-
Seq2SeqPeftTrainer 类:继承自 PeftTrainer,用于序列到序列任务的训练。
-
compute_loss 方法:计算损失。
-
log_metrics 方法:记录模型的度量标准。
-
training_step 和 training_step_and_backward 方法:定义模型的训练步骤。
-
prediction_step 方法:定义模型的预测步骤,包括在生成的令牌中删除提示部分。
-
save_predictions 方法:将模型的预测结果保存到 output_dir。