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个新标记。
例如,在评估时输入一个句子,模型生成的输出如下:

输入:你好,今天天气怎么样?
输出:今天的天气很好,适合出门。你可以去公园散步,享受阳光。

通过这些参数的详细设置,可以有效地控制训练过程中的日志记录、评估频率和预测生成行为,从而优化训练和评估的效率及结果。

07-29 19:56