目录

  • 前言
  • 1 phase-1: Supervised Finetuning
    • 1.1 训练数据样例
    • 1.2 训练过程
    • 1.3 关键代码详解
      • 1.3.1 基座模型结构
      • 1.3.2 LoRA结构及其正向传播
      • 1.3.3 phase1的指标评估
    • 1.4 实例测试
    • 1.5 相关拓展
      • 1.5.1 多轮对话性能
      • 1.5.2 本阶段训练更倾向过拟合
    • 1.6 版块相关问题
  • 2 phase-2: Reward Model Finetuning
    • 2.1 训练数据样例
    • 2.2 训练过程
    • 2.3关键代码详解
      • 2.3.1 RM具体结构
      • 2.3.2 DataCollator及RM所需输入形式
      • 2.3.3 RM的正向传播及成对排序损失
      • 2.3.4 phase2的指标评估
    • 2.4 实例测试
    • 2.5 相关拓展
      • 2.5.1 对话奖励聚合设计
    • 2.6 板块相关问题
  • 后续

前言


  本篇为上中下三篇章的【中篇】,接续自【上篇】。主要针对三阶段训练中第一阶段、第二阶段较为重要的部分源码进行详解。
  尽管官方的上手文档均是以sh文件为例进行演示,且源码中确实也提供了便捷的sh文件供直接使用,但我仍建议通过各阶段的main.py文件(applications/DeepSpeed-Chat/training/step*/main.py)来运行训练,大致原因有二:其一是因为官方预设的sh文件调用了applications/DeepSpeed-Chat/train.py,其中对模型选型等参数进行了严格的限制,虽然提高了代码安全性,但对于以学习为目的的探索来说失去了一定的灵活性(见下方代码块),直接通过main.py进行传参即可实现绕过限制、使用更轻量的模型进行训练;其二是因为main.py中的传参相对更接近底层,更有助于深入理解代码。
  因此各阶段的解析我都将在其main.py文件的基础上进行。

# applications/DeepSpeed-Chat/train.py
parser.add_argument(
        "--actor-model",
        # actor模型只能选用“facebook/opt”系列的1.3b~66b
        # 但即使是1.3b也仍对设备显存有一定的要求
        # 对于使用较弱设备进行学习的用户不是很友好
        type=lambda x: x.replace("facebook/opt-", ""),
        default="1.3b",
        choices=("1.3b", "6.7b", "13b", "66b"),
        help="Which facebook/opt-* model to use for Actor (step 1)",
    )

1 phase-1: Supervised Finetuning

1.1 训练数据样例

数据格式名称 说明 样例
chosen_sentence 人类偏好的完整对话,由prompt衔接偏好应答chosen得到,适用于phase1和phase2 Human: Please tell me about Microsoft in a few sentence? Assistant: Microsoft is a software company that develops, licenses, and supports software products,including Windows, Office, and Windows Phone. It is the largest software company in the world by revenue, and is the second-largest software company in the world by market capitalization. Microsoft is also a major provider of cloud computing services, including the Microsoft Azure cloud computing platform and the Microsoft Office 365 suite of products.”

  模型将基于自回归语言建模任务对形如上述样例的数据进行训练,最后将得到具备更佳对话能力的模型SFT/ref(Supervised Fine-Tuning)。
  更多的数据格式可见【上篇】的“1.2.1 数据格式基本概念”。

1.2 训练过程

在此简单讲述UML时序图的元素含义:
- 箭头表示信息传递:实线表示调用,虚线表示返回;
- alt表示假设分支,其后方“[]”中的内容表示“条件”;
- loop表示循环;
- 淡蓝色区域即为高亮部分。
  • applications/DeepSpeed-Chat/training/step1_supervised_finetuning/main.py
main1.py utils.py model_utils.py lora.py data_utils.py transformers load_hf_tokenizer() 1 tokenizer 2 create_hf_model() 3 model 4 convert_linear_layer_to_lora() 5 model 6 only_optimize_lora_parameters() 7 model 8 alt [only_optimize_lora] alt [lora_dim > 0] create_prompt_dataset() 9 train_dataset, eval_dataset 10 train_dataloader, eval_dataloader 11 DeepSpeedEngine: model, opt, lrs 12 evaluation() 13 perplexity 14 model.forward() 15 LinearLayer_LoRA.forward()