data_config:
train_file: train.jsonl # 训练数据文件路径
val_file: dev.jsonl # 验证数据文件路径
test_file: dev.jsonl # 测试数据文件路径
num_proc: 1 # 处理数据时使用的进程数量
combine: True # 是否组合输入和输出序列
max_input_length: 512 # 输入序列的最大长度
max_output_length: 512 # 输出序列的最大长度
training_args:
output_dir: ./output # 输出目录,用于保存模型和检查点
max_steps: 3000 # 最大训练步数
learning_rate: 5e-4 # 学习率
per_device_train_batch_size: 1 # 每个设备的训练批次大小
dataloader_num_workers: 16 # 数据加载器使用的线程数量
remove_unused_columns: false # 是否移除未使用的列
save_strategy: steps # 检查点保存策略
save_steps: 500 # 每多少步保存一次检查点
log_level: info # 日志记录级别
logging_strategy: steps # 日志记录策略
logging_steps: 10 # 每多少步记录一次日志
per_device_eval_batch_size: 4 # 每个设备的评估批次大小
eval_strategy: steps # 评估策略
eval_steps: 500 # 每多少步进行一次评估
predict_with_generate: true # 是否使用生成模式进行预测
generation_config:
max_new_tokens: 512 # 生成的最大新标记数
# deepspeed: configs/ds_zero_3.json # DeepSpeed配置文件路径
peft_config:
peft_type: LORA # 微调类型
task_type: CAUSAL_LM # 任务类型
r: 8 # LORA的秩参数
lora_alpha: 32 # LORA的缩放因子
lora_dropout: 0.1 # LORA的dropout率
target_modules: ["query_key_value"] # 目标模块
data_config
数据这部分的就不举例说明了,相信大家都明白
combine: True
combine 参数决定了输入和输出序列是否合并处理。合并处理指的是将输入和输出序列拼接成一个完整的序列,在训练时一起考虑。这在对话生成任务中尤其常见。
例子:
假设你有一个对话数据集,其中每个对话包含用户和机器人的多轮交互。
- 用户输入(input):“你好,今天的天气怎么样?”
- 机器人输出(output):“今天的天气很好,适合出门。”
如果 combine: True,则输入序列和输出序列将被拼接成一个序列,如下所示
[CLS] 你好,今天的天气怎么样? [SEP] 今天的天气很好,适合出门。 [EOS]
这样,模型在训练时会同时看到输入和输出,并尝试生成输出部分。
详细说明和举例
示例对话数据
假设我们有以下对话数据:
{
"messages": [
{"role": "user", "content": "你好,今天的天气怎么样?"},
{"role": "assistant", "content": "今天的天气很好,适合出门。"},
{"role": "user", "content": "那我应该穿什么衣服呢?"},
{"role": "assistant", "content": "你可以穿轻便的衣服,比如T恤和短裤。"}
]
}
combine = True 的情况
如果 combine 设置为 True,输入和输出序列将被合并。例如
[CLS] 你好,今天的天气怎么样? [SEP] 今天的天气很好,适合出门。 [SEP] 那我应该穿什么衣服呢? [SEP] 你可以穿轻便的衣服,比如T恤和短裤。 [EOS]
max_input_length
参数指定输入序列的最大长度。输入序列超过这个长度将被截断。
例子:
假设 max_input_length 设置为 512 字符,以下是两个场景:
1、输入序列长度小于 512 字符:
"你好,今天的天气怎么样?"
这个输入长度为 11 字符,小于 512,因此不会被截断。
2、输入序列长度大于 512 字符:
"你好,今天的天气怎么样?" + "更多文字..."(超过 512 字符)
在这种情况下,输入序列会被截断到前 512 个字符。
max_output_length
同理max_input_length
max_steps
作用:最大训练步数。指定训练过程中最大的步数限制,一旦达到这个步数,训练过程就会终止。
在训练过程中的表现:模型将进行最多3000个训练步。
例子:假设我们有一个训练过程,每个epoch包含1000个训练样本。如果设置 max_steps: 3000,即使有多个epoch,每个epoch包含1000步,训练也将在达到第3000步时停止,而不再继续。
learning_rate
作用:学习率,用于优化模型。决定了每一步参数更新的步长。
在训练过程中的表现:每一步参数更新时,学习率影响梯度的大小。
例子:假设初始权重为 w,梯度为 g,更新后的权重 w’ 计算公式为 w’ = w - learning_rate * g。如果 learning_rate 设置为 0.0005(即 5e-4),那么每一步的更新步长为 0.0005 倍的梯度。
per_device_train_batch_size
作用:每个设备(例如GPU)的训练批次大小。决定每个训练步中每个设备上处理的样本数量。
在训练过程中的表现:每个GPU将处理1个样本。
例子:如果有两个GPU,且 per_device_train_batch_size 设置为 1,那么每个训练步总共处理 2 个样本(每个GPU处理1个样本)。
dataloader_num_workers
作用:数据加载器使用的线程数量。用于并行加载数据,提高数据读取效率。
在训练过程中的表现:数据加载时,使用16个并行线程读取数据,提高数据加载速度。
例子:如果 dataloader_num_workers 设置为 16,则在每次读取数据时,数据加载器会使用16个线程并行读取数据,从而减少等待数据加载的时间。
remove_unused_columns: false
作用:是否移除未使用的列。指定是否在处理数据时移除未使用的列。
在训练过程中的表现:如果设置为 false,则保留数据集中的所有列。
例子:假设数据集包含列 [‘input’, ‘output’, ‘extra_info’],模型只使用 input 和 output 列,如果 remove_unused_columns 设置为 false,extra_info 列将保留在数据集中。
save_strategy: steps
作用:检查点保存策略。指定保存模型检查点的策略,可以是按步保存(steps)或按epoch保存(epoch)。
在训练过程中的表现:模型将在指定的步数后保存一个检查点。
例子:如果 save_strategy 设置为 steps,并且 save_steps 设置为 500,则每500步保存一次检查点。
save_steps: 500
作用:每多少步保存一次检查点。
在训练过程中的表现:每达到500步时保存一个模型检查点。
例子:如果训练过程设定了 max_steps 为 3000,那么在训练过程中,将分别在第500步、第1000步、第1500步、第2000步、第2500步和第3000步保存检查点。
1.初始化和设置:
模型初始化并加载数据。
数据加载器使用16个线程并行加载数据。
每个设备的训练批次大小设置为1。
2.训练开始:
第一步到第五百步:
学习率设置为 0.0005,每步更新时按照该学习率调整模型参数。
每一步处理每个设备上的一个样本。
模型在每500步后保存一次检查点到 ./output 目录。
第500步:
保存第一个检查点 checkpoint-500。
第501步到第1000步:
继续训练,每步处理每个设备上的一个样本,学习率保持不变。
第1000步:
保存第二个检查点 checkpoint-1000。
3.继续训练:
每500步保存一次检查点,直到达到最大步数 3000:
第1500步保存 checkpoint-1500。
第2000步保存 checkpoint-2000。
第2500步保存 checkpoint-2500。
第3000步保存 checkpoint-3000 并结束训练。
通过这些参数的详细设置,可以有效地控制训练过程中的各种细节,从而优化训练效率和模型性能。
log_level
作用:日志记录级别,指定记录的日志详细程度。
在训练过程中的表现:记录信息级别的日志,包括训练进度、损失值等重要信息。
例子:如果设置为 info,训练过程会记录所有信息级别及以上的日志,例如每次保存检查点、每次评估等。
logging_strategy: steps
作用:日志记录策略,指定日志记录的频率策略,可以按步(steps)或按epoch(epochs)记录。
在训练过程中的表现:按照步数记录日志。
例子:如果设置为 steps,日志将按照指定步数记录。
logging_steps: 10
作用:每多少步记录一次日志。
在训练过程中的表现:每10步记录一次日志。
例子:假设 logging_steps 设置为 10,那么训练过程中每10步将记录一次日志,包括损失值、当前步数等信息。
per_device_eval_batch_size: 4
作用:每个设备的评估批次大小。
在训练过程中的表现:每个GPU在评估时处理4个样本。
例子:如果有两个GPU,且 per_device_eval_batch_size 设置为 4,那么每次评估时每个GPU处理4个样本,总共处理8个样本。
eval_strategy: steps
作用:评估策略,指定评估的频率策略,可以按步(steps)或按epoch(epochs)进行评估。
在训练过程中的表现:按照步数进行评估。
例子:如果设置为 steps,模型将按照指定步数进行评估。
eval_steps: 500
作用:每多少步进行一次评估。
在训练过程中的表现:每500步进行一次评估。
例子:假设 eval_steps 设置为 500,那么训练过程中每500步将进行一次评估,计算模型的性能指标。
predict_with_generate: true
作用:是否使用生成模式进行预测。
在训练过程中的表现:在评估和预测时,模型将生成文本输出而不是仅计算损失。
例子:如果设置为 true,在进行预测时,模型将根据输入生成文本,并将生成的文本作为输出。
generation_config
作用:生成配置,指定生成文本的具体参数。
在训练过程中的表现:配置生成文本的行为,例如生成的最大新标记数。
例子:包含 max_new_tokens: 512,表示生成的最大新标记数为512个标记。
举例说明:
1.初始化和设置:
- 设置日志记录级别为 info。
- 日志记录策略为按步(steps)记录,每10步记录一次日志。
- 每个GPU评估时处理4个样本。
- 评估策略为按步(steps)进行,每500步进行一次评估。
- 预测时使用生成模式。
- 生成配置为最大新标记数为512。
2.训练开始: - 前10步:
- 训练过程中每10步记录一次日志,包括当前步数、损失值等信息。
- 例如在第10步时,记录日志如下:
[INFO] Step 10: loss=0.5432
- 第500步:
- 进行评估,评估时每个GPU处理4个样本,总共评估8个样本。
- 使用生成模式进行预测,生成的最大新标记数为512。
- 评估完成后记录评估结果,如损失值、生成的文本等。
3.继续训练:
-
每10步记录一次日志,直到训练结束:
- 第20步记录日志:
[INFO] Step 20: loss=0.5123
- 第30步记录日志:
[INFO] Step 30: loss=0.4876
- 每500步进行一次评估:
- 第1000步进行评估,记录评估结果:
[INFO] Evaluation at step 1000: eval_loss=0.4567
4.预测和生成:
在每次评估时,使用生成模式进行预测,生成的文本长度最多为512个新标记。
例如,在评估时输入一个句子,模型生成的输出如下:
输入:你好,今天天气怎么样?
输出:今天的天气很好,适合出门。你可以去公园散步,享受阳光。
通过这些参数的详细设置,可以有效地控制训练过程中的日志记录、评估频率和预测生成行为,从而优化训练和评估的效率及结果。