Homework 2

作业二:奖励建模与直接偏好对齐

本次作业重点关注基于偏好数据集的对齐方法。具体包括 奖励建模(Reward Modeling) 和 直接偏好对齐微调(Direct Preference Optimization, DPO)。

提交内容包括完整代码和实验报告。注意,如果在作业中遇到问题,先尝试自己解决或和同学讨论。环境配置可以参考代码库中README的介绍。自己实在无法解决,请在align-anything仓库中提issue/disscussion询问(详细流程会在后文介绍)。

本次作业提供了120%的得分点,上限为100%,你只需在报告中呈现在完成情况即可踩点得分。在这些作业的基础上,鼓励自行探索,如果你能有一些创新的想法、观察、改进,可以在报告中写清楚并高亮出来,可以考虑加分。

本次作业有一定工作量,建议尽早开始做。

0. align-anything部署(40%)

预估时间:2小时。

这部分内容为完成本次作业所需的前置工作,包括代码部署、模型下载和数据下载三个部分,它们是参与大模型项目开发所需要的必备能力,熟悉这些流程将为你后续基于开源框架开发大模型提供便利。

实验材料一览

模型:PKU-Alignment/Beaver-0.5B-Instruct

数据:PKU-Alignment/PKU-SafeRLHF-single-dimension

代码:PKU-Alignment/align-anything

本作业的代码仓库经历过2次补丁更新,强烈建议同学们使用谷歌云盘下载代码仓库,而不是直接用服务器上的已有代码。

PS: 如果你不想在课程服务器上完成作业,请从以下地址将代码下载至你的计算设备上:

PKU-Alignment/align-anything

如果你在本系作业的GPU集群上发生GPU相关报错,请执行:

nvidia-smi

如果你发现:

Failed to initialize NVML: Unknown Error

请在备份好数据(基于你初次登陆服务器以后的改动),然后私信助教Jiayi,帮忙重启服务器。

浅橙色高亮块
注意 由于服务器供应商暂不稳定支持命令行配置代理,本作业并不要求同学们完成代码、模型与数据集下载。代码仓库、数据集与模型已被助教放置在工作路径下,只要能【独立完成】以下【最简部署指南】即可得到本部分所有分数。以下除0.0以外的指南仅作为阅读材料,希望能为同学们后续科研带来帮助!

0.0 最简部署指南

  1. 在你熟悉的编译器软件,如VS Code中,配置助教提供的ssh远程连接。
  2. 在 VS Code 中,安装 Remote - SSH 和 Jupyter 插件。
  3. 点击 VS Code 左侧的 Remote Explorer 选项卡,点击配置或添加按钮,效果基本相同。

配置实例:

Host homework-2  
  HostName www.example.com  # 请将www.example.com替换为你的服务器地址
  User coder  # 请将coder替换为你的用户名
  Port 30316 # 请将30316替换为你的端口号
  IdentityFile ~/.ssh/id_rsa # 请将id_rsa替换为你的公钥文件名
  1. 随后点击远程资源管理器,点击homework-2建立连接,操作平台选择Linux,在确保公钥正确的情况下,即可连接远程服务器。

参考教程:https://server.51cto.com/article/684146.html

  1. 除VS Code外,你也可以使用命令行终端连接服务器,示例:
ssh -i ~/.ssh/id_rsa [email protected] -p 30316

登录上服务器后,进入工作目录下,执行setup.sh

cd /home/align-anything  
bash setup.sh

随后,安装align-anything,即可完成部署

cd align-anything  
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple  
pip install -e .
注意 服务器的实例在正常情况下将会持续运行,但不排除因不可抗力等因素导致实例停止或重启,这将使整个工作区的状态回退到step 1之前。因此,我们强烈建议同学们及时将工作记录保存至本地,具体保存操作可以参考:https://www.ruanyifeng.com/blog/2020/08/rsync.html。在服务器的bash中运行的程序会因为Vs Code退出而自动终止,如果同学们想要令程序在后台持续运行,可以在tmux中运行程序,具体可以参考:https://matpool.com/supports/doc-tmux-matpool/

【以下内容(0.1至0.2)为扩展阅读材料,仅供参考,不需要同学们完成】

0.1 代码部署指南

  1. 使用你的个人邮箱创建github账号,github地址为:https://github.com
  2. 点击PKU-Alignment/align-anything进入项目主页
  3. 点击网页右上角的Fork按钮
  4. 点击Create fork

将你fork完成的仓库克隆到服务器,随后,根据PKU-Alignment/align-anything主页中提供的安装教程完成安装。

关于GitHub的建议操作可以参考GitHub教程

0.2 模型下载指南

Huggig Face是目前最被广泛使用的大模型开源社区。本次作业涉及的模型与数据集均已被上传至该平台。在完成后续操作前,请注册一个Hugging Face账号,并在个人设置页面获取hf_token,形如:hf_xxxxxxxxx。

注意,Hugging Face只会显示一次hf_token,请在生成hf_token后及时保存。

  1. huggingface-cli登陆

完成代码部署后,在虚拟环境激活的前提下,在命令行执行:

huggingface-cli login

随后终端会提示你输入hf_token,请将先前保存的内容粘贴至终端。

  1. huggingface-cli下载模型

在命令行执行:

huggingface-cli download --resume-download PKU-Alignment/Beaver-0.5B-Instruct --local-dir LOCAL_DIR

请在LOCAL_DIR参数处指定你希望模型保存的路径,例如/home/user/Beaver-0.5B-Instruct

0.3 数据集下载指南

与下载模型类似,下载数据集的命令为:

huggingface-cli download --repo-type dataset --resume-download PKU-Alignment/PKU-SafeRLHF-single-dimension --local-dir LOCAL_DIR --local-dir-use-symlinks False

关于网络问题,没办法使用HuggingFace,可以参考HF-Mirror设置

1. 奖励模型实现(40%)

  • 预估时间:5小时。
  • 训练所需时间:2小时
  • 显存占用:不超过20GB

作业目的

  • 熟悉大模型微调框架的部署;
  • 熟悉大语言模型奖励建模的作用,原理;
  • 使用给定偏好数据集完成奖励模型的训练;
  • 在提供的验证集上进行评测,并基于验证集表现进行参数调优;

算力要求

  • 该部分作业需要在GPU上运行。

学习资料

以下是一些可以参考的资料:

1.1 部署align-anything,训练奖励模型(30%)

1.1.1 偏好数据集键值转换(10%)

大语言模型对齐研究往往需要研究不同偏好数据集,而不同的偏好数据集往往包含不同的键值名称,因此需要完成偏好数据集的键值转换。例如,本实验使用的PKU-SafeRLHF偏好数据集的键值名称为:

{  
    "prompt": "...",  
    "reponse_0": "...",  
    "reponse_1": "...",  
    "better_response_id": "..."  
}

而align-anything在进行奖励建模时,需要的键值名称为:

{  
    "better_text": "...",  
    "worse_text": "...",  
}

align-anything提供了一套名为template的机制,位于align-anything/configs/template.py,可以完成偏好数据集的键值转换。请根据上述信息,实现一个名为HOMEWORK的template,并基于该template完成偏好数据集的键值转换。

1.1.2 训练奖励模型(10%)

基于上述实现好的template,使用align-anything完成奖励模型训练。

训练的脚本位于align-anything/scripts/rm.sh,而奖励模型训练的超参数位于align-anything/configs/train/text_to_text/rm.yaml。你需要在脚本中指定好初始模型路径、数据集路径以及输出路径参数。

随后,运行如下命令完成奖励模型训练:

cd align-anything/scripts  
bash rm.sh
注意: 如果需要实时检测训练过程中某些指标(如损失函数、准确率等)的变化情况,可以在训练前指定WANDB_API_KEY,在训练开始后,即可在wandb网站上实时查看训练曲线。如果在训练前忘记指定WANDB_API_KEY,可在训练结束后使用wandb sync命令将训练曲线同步到wandb网站上。更多细节可以参考:https://docs.wandb.ai/。由于服务器无法访问境外网络,在线的wandb也许会发生连接错误,我们提供了tensorboard的备选方案。你可以使用tensorboard --logdir OUTPUT_DIR命令启动本地浏览器,观察训练曲线。其中OUTPUT_DIR为你当前训练保存模型的路径。

1.1.3 评测奖励模型(10%)

基于训练脚本,将训练数据集部分置空,随后将模型路径修改为训练完毕的奖励模型路径,运行脚本即可完成奖励模型评测,例如:

cd align-anything/scripts  
bash rm.sh

通过评测奖励模型在验证集上的表现,结合训练过程曲线,即可观察奖励模型是否存在过拟合等现象,从而完成参数调优。

注意 建议在执行脚本前执行chmod +x -R align-anything/scripts,确保每个脚本都拥有写权限

1.1.4 使用奖励模型可视化偏好数据集(10%)

偏好数据集中包含chosen和rejected的response,它们对应了人类的高维偏好。请你使用一些可视化方法直观地呈现它们的差异性。例如,可以使用训练好的奖励模型进行评分后,可视化问答对的评分频率分布。

提示 你可能需要手动处理你的偏好数据集,拆开为单个问答分别进行奖励模型打分,具体细节也可以参考2.1.2
cd align-anything/scripts  
bash rm_score.sh

1.2 回答问题(10%)

在你的实验报告中回答下列问题:

  • 奖励建模有哪些应用?
  • 奖励建模训练可能存在哪些鲁棒性问题?
  • 如何缓解奖励建模的长度偏差?
  • 有哪些拟合多元人类偏好的奖励建模方法?

每个问题的得分上限为5%,你可以参考以下的case决定如何在报告中回答问题:

满分case

  1. case_1: 高质量地回答了2个问题(回答的内容正确而丰富,有文献支撑)
  2. case_2: 认真地回答了3-4个问题(尽管有一些错误,但看得到你的思考)

低分case

  1. case_3: 使用GPT等模型生成不相关的4个答案
  2. case_4: 答案与其他同学存在雷同

2. DPO微调(40%)

  • 预估时间:10小时。
  • 训练时间:2.5小时
  • 显存占用:不超过40GB

作业目的

  • 理解DPO的原理,熟悉使用DPO进行微调的流程,并基于给定的偏好数据集完成模型的微调;
  • 评测DPO微调模型的效果,与初始模型进行对比,理解对齐算法的作用;
  • 分析DPO的局限性,并理解其局限性背后的原因;

算力要求

该部分作业需要在GPU上运行。

2.1 使用DPO微调模型(40%)

2.1.1 运行DPO微调(15%)

基于先前实现好的template,使用align-anything完成DPO模型的训练。

训练的脚本位于align-anything/scripts/dpo.sh,而DPO模型训练的超参数位于align-anything/configs/train/text_to_text/dpo.yaml。你需要在脚本中指定好初始模型路径、数据集路径以及输出路径参数。

随后,运行如下命令完成DPO模型训练:

cd align-anything/scripts  
bash dpo.sh

2.1.2 评测DPO微调模型(15%)

大语言模型的训练效果评测往往是面向结果的评测。首先,需要使用PKU-SafeRLHF数据集中的测试集,令模型在测试集上生成回复。生成脚本位于align-anything/generate_scripts/下。你需要指定模型路径、数据集路径、输出路径等参数,生成并查看初始模型回复和DPO微调模型回复。脚本中的NUM_RESPONSES表示模型为每个问题生成的回复数量。

cd align-anything/generate_scripts  
bash launch.sh

首先,观察一些case,分析DPO改变了模型的何种行为,这种改变是否与偏好数据集一致。随后,将模型生成的回答地址输入align-anything/scripts/rm_score.sh文件,随后执行该文件

cd align-anything/scripts  
bash rm_score.sh
  1. 使用你先前训练的奖励模型为DPO微调模型和初始模型生成的回答分别打分,并统计二者的得分差异性。
  2. 如果DPO微调模型在测试集上的表现优于初始模型,请具体观察那些得分更高的case,并分析DPO微调模型在哪些方面做出了改进。
  3. 如果DPO微调模型在测试集上的表现不如初始模型,请分析原因,是DPO微调不准确,还是奖励建模不准确。

2.2 回答问题(10%)

  • 从强化学习的角度,DPO是on-policy还是off-policy的,是online的还是offline的,为什么?
  • DPO主要针对传统RLHF的哪个方面进行了优化,关键见解是什么?
  • DPO和传统RLHF相比有哪些局限性,具体体现在哪些方面?
  • 现有的研究(KTO,SimPO,ORPO等)主要从哪些方面对DPO进行优化?

每个问题的得分上限为5%,你可以参考以下的case决定如何在报告中回答问题:

满分case

  1. case_1: 高质量地回答了2个问题(回答的内容正确而丰富,有文献支撑)
  2. case_2: 认真地回答了3-4个问题(尽管有一些错误,但看得到你的思考)

低分case

  1. case_3: 使用GPT等模型生成不相关的4个答案
  2. case_4: 答案与其他同学存在雷同

2.3 学习资料

以下是一些可以参考的资料:

2.4 作业提交

需要提交的材料包括PDF发送到指定邮箱,以及保留自己Fork的仓库,具体来说包括:

  1. 以PDF为格式的实验报告(中英文形式都可,编写方式自由,可以根据个人偏好使用word或latex),PDF文件需要发送至[email protected]
  2. 训练和评估过程中的可视化分析、case、以及模型生成的结果(不超过10MB),放于results文件夹中。
  3. 注意最后你需要提交的内容为:实验报告(pdf格式),支撑材料(文件夹),打包为压缩文件后发送至邮箱中即可。
Previous
Next