direct-preference-optimization

direct-preference-optimization

DPO算法实现语言模型的偏好数据优化

DPO(Direct Preference Optimization)是一种语言模型训练算法,通过偏好数据优化模型。该项目提供DPO算法的参考实现,包含监督微调和基于偏好学习两个阶段。支持各种因果HuggingFace模型,可添加自定义数据集,并包括'conservative' DPO和IPO等变体。这为研究人员提供了灵活工具,用于从偏好数据训练语言模型。

DPO语言模型偏好优化机器学习训练算法Github开源项目

DPO: 直接偏好优化

新增功能: 除了原始的 DPO 算法外,本代码库现在还支持'保守式' DPOIPO

对于保守式 DPO,你只需在进行 DPO 训练时额外传递参数 loss.label_smoothing=X,其中 X 是介于 0 和 0.5 之间的值(0 表示原始 DPO 损失)。这个参数本质上是保守程度参数,即训练偏好数据中不正确(偏好方向相反)的比例。从 0.1 左右开始可能比较合理,但我还没有测试过(而且这将取决于偏好数据集)。

对于 IPO,只需传递 loss=ipoloss.beta=X,其中 X 是一个非负值(与 DPO/保守式 DPO 相同)。

这个代码库是什么?

本代码库包含了 DPO 算法的参考实现,用于从偏好数据训练语言模型,如论文直接偏好优化:你的语言模型其实是一个奖励模型中所述。

这里的代码支持任何因果 HuggingFace 模型 - 查看我们在 config/model 中的示例来添加你自己的模型。添加自己的数据集也很容易。请参阅README 部分了解如何添加数据集。

DPO 流程有两个阶段:

  1. 对感兴趣的数据集进行监督微调(SFT)。
  2. 使用偏好数据(最好与 SFT 示例来自相同分布)对第 1 步的模型进行偏好学习。

本代码库中的文件包括:

  • train.py:训练的主入口点(用于 SFT 或基于偏好的 DPO 训练)
  • trainers.py:训练器类(例如,实现学习循环以及多 GPU 逻辑)
  • utils.py:多个其他文件使用的一些便捷函数
  • preference_datasets.py:用于 SFT 和基于偏好的 DPO 训练的数据集处理逻辑;如果你想用自己的数据进行训练,需要在这里进行一些添加

运行 SFT

对于 DPO,SFT 阶段基本上确保我们训练的偏好数据在实际进行偏好学习之前对我们的策略来说是同分布的。

在 Anthropic-HH 数据上用批量大小 64 运行 Pythia 6.9B 的 SFT:

python -u train.py model=pythia69 datasets=[hh] loss=sft exp_name=anthropic_dpo_pythia69 gradient_accumulation_steps=2 batch_size=64 eval_batch_size=32 trainer=FSDPTrainer sample_during_eval=false

在 Anthropic-HH + Stanford Human Preference 数据上用批量大小 64 运行自定义模型(例如,本地路径的 Llama)的 SFT:

python -u train.py model=blank_model model.name_or_path=/PATH/TO/LLAMA/WEIGHTS model.block_name=LlamaDecoderLayer datasets=[hh,shp] loss=sft exp_name=anthropic_shp_sft_llama_7b gradient_accumulation_steps=2 batch_size=64 eval_batch_size=32 trainer=FSDPTrainer sample_during_eval=false

注意:由于我们没有使用预定义的模型配置,我们还需要传递 model.block_name 来告诉 FSDP 要包装哪些模块。

默认情况下,每 20k 个样本进行一次评估。你可以通过 eval_every 参数更改这个设置。如果你不传递 sample_during_eval=false,每次评估时也会进行采样。

要运行不同的模型,可以在 config/model 中添加新的模型配置,或者使用 blank_model 选项作为 model,并显式传递 model.name_or_path(如果使用 FSDP 训练器,还需传递 model.block_name)。例如,对于 GPT-2,这将看起来像:

python -u train.py ... model=blank_model model.name_or_path=gpt2-xl model.block=GPT2Block

运行 DPO

要运行 DPO,使用与 SFT 相同的命令,但传递 loss=dpoloss.beta=所需的BETA值(0.1-0.5 是一个不错的起点),以及 model.archive=/path/to/checkpoint/from/sft/step-XXXX/policy.pt。如果 SFT 成功完成,你应该还有一个来自训练结束的 /.../LATEST/policy.pt

在 Pythia 6.9B 上运行 DPO,有效批量大小为 64:

python -u train.py model=pythia69 datasets=[hh] loss=dpo loss.beta=0.1 model.archive=/path/to/checkpoint/from/sft/step-XXXX/policy.pt exp_name=anthropic_dpo_pythia69 gradient_accumulation_steps=2 batch_size=32 eval_batch_size=32 trainer=FSDPTrainer sample_during_eval=false

注意:eval_every 是以样本为单位计算的。

完整示例

让我们通过一个完整的示例,在 Anthropic-HH 数据集上训练 pythia 2.8B。

你可以在这里查看此示例的 wandb 输出样本(标记为 readme-example)。

步骤 1:设置环境

首先,创建一个虚拟环境并安装依赖项。推荐使用 Python 3.8+。

python3 -m venv env
source env/bin/activate
pip install -r requirements.txt

步骤 2:运行 SFT

我们将利用 FSDP 的 bfloat16 混合精度来加速训练;我们通常能看到约 50% 的速度提升。默认情况下,SFT 将在选定数据集的混合上运行一个 epoch。数据集将按需下载并在本地缓存。

python -u train.py model=pythia28 datasets=[hh] loss=sft exp_name=anthropic_dpo_pythia28 gradient_accumulation_steps=2 batch_size=64 eval_batch_size=32 trainer=FSDPTrainer sample_during_eval=false model.fsdp_policy_mp=bfloat16

注意:这个命令是在一台配备 4 个 80GB A100 的机器上运行的;在这种硬件上,SFT 大约需要 1 小时 30 分钟。如果你的计算资源较少,可能需要增加梯度累积步数,SFT 将花费更长时间。

你可以在这里查看 SFT 步骤的 wandb 输出样本。

步骤 3:运行 DPO

检查 wandb(如果启用,默认是启用的)或你的输出日志以找到本地运行目录。要运行 DPO,你需要最终权重的路径,它看起来像 /some/cache/dir/YOUR_USERNAME/pythia28_hh_sft_bf16_2023-06-21_16-58-17_973996/LATEST/policy.ptLATEST 目录包含训练结束时的最终权重集。

python -u train.py model=pythia28 datasets=[hh] loss=dpo loss.beta=0.1 exp_name=anthropic_dpo_pythia28 gradient_accumulation_steps=2 batch_size=64 eval_batch_size=32 trainer=FSDPTrainer sample_during_eval=false model.fsdp_policy_mp=bfloat16 model.archive=/path/to/archive/from/sft/LATEST/policy.pt

在 4 个 80GB A100 上,DPO 训练大约需要 2 小时 45 分钟。

你可以在这里查看 DPO 步骤的 wandb 输出样本。

自定义训练

训练选项位于 config/config.yamlconfig/model/blank_model.yamlconfig/loss/dpo.yaml 中。有关这些选项的作用,请参阅这些文件中的注释。

你可以通过传递 model=some_model 来使用预配置的模型,其中 config/model/some_model.yaml 存在。我们已经给出了一些示例。

如果你想使用另一个模型,只需为该模型创建一个新配置(参照我们的示例;它必须是一个 .yaml 文件!),或者使用 model=blank_model,并带上 model.name_or_path=名称或路径,如果模型的名称/路径不同,可选择性地加上 model.tokenizer_name_or_path=分词器名称或路径,以及 model.block_name=TRANSFORMER_BLOCK的名称(如果你使用 FSDP)。你可能想要更改的其他选项是 dpo 损失选项,即 loss.betaloss.reference_free(参见 config/loss/dpo.yaml)。

训练器类

我们在trainers.py中实现了三种不同的训练器类:

  • BasicTrainer:对于多个GPU,简单地将模型在它们之间进行分区。例如,对于两个GPU,模型的前半部分层将在GPU 0上,后半部分将在GPU 1上。这个训练器有效地增加了可用的GPU内存,但不会同时使用多个GPU进行计算(所以不会获得加速)。

  • FSDPTrainer:使用PyTorch的完全分片数据并行(FSDP)实现来在可用的GPU之间分片每个transformer块。当每个GPU的批量大小>1时,应该比BasicTrainer获得显著的加速。每个GPU的批量大小等于batch_size / (gradient_accumulation_steps * num_gpus)使用此训练器时,您可能需要在启动脚本中运行ulimit -n 64000,然后再调用train.py;例如,ulimit -n 64000; python train.py ...

  • TensorParallelTrainer:使用PyTorch张量并行(通过这个包装器)在可用的GPU之间分片每个线性层。这个训练器是实验性的,但应该可以工作。

**警告:**对于FSDPTrainer和特别是TensorParallelTrainer来说,采样可能会非常慢(分别参见这个问题这个问题)。建议对这些训练器传递sample_during_eval=false

我应该使用哪个训练器?

对于单GPU训练,使用BasicTrainer。对于多GPU设置,FSDPTrainer很可能是最佳选择,尽管尚未对这些进行基准测试。

添加新数据集

添加新的/自定义数据集很容易,通常不会花费超过10分钟左右。将您的数据集添加到preference_datasets.py中(我们已经实现了Anthropic-HH、Stanford Human Preferences和StackExchange作为参考)。按照我们的参考数据集(在函数get_se()get_shp()get_hh()中);您基本上需要返回一个字典,将每个提示映射到另一个包含三个值的字典:

  • responses: List[str]:给出偏好的响应列表
  • pairs: List[Tuple[int]]:偏好对,其中每个元组的第一个值是首选响应,第二个值是非首选响应
  • sft_target: str:SFT期间用于此提示的响应(此响应可能是也可能不是responses中的一个值)

一旦添加了您的数据集,例如xyz,您可以通过在SFT或DPO训练命令中传递datasets=[xyz]来对其进行训练。

确保您已更新preference_datasets:get_dataset()以在传入其名称时返回您的新数据集!

在多个GPU上加快训练的技巧

当有多个GPU可用时,建议使用FSDP以加快训练速度。通常,您应该尝试在每个GPU上使用至少2的批量大小(即batch_size // (grad_accumulation_steps * N_GPUS)至少为2)以从FSDP获得比BasicTrainer更快的速度。实现这一点的一种方法是使用混合精度。本仓库通过FSDP实现混合精度。通过传递model.fsdp_policy_mp=bfloat16model.fsdp_policy_mp=float16来启用混合精度(目前仅支持FSDPTrainer)(仅测试了bfloat16)。另一种减少内存使用的方法是激活检查点(或梯度检查点),可以通过activation_checkpointing=true启用(也仅为FSDPTrainer实现)。激活检查点并不总是能提高吞吐量,但如果您每个GPU的批量大小被限制在1,那么值得一试。

有关优化FSDP的更多信息,请参阅这篇文章

引用DPO

如果DPO或本仓库在您的研究中有用,您可以使用以下BibTeX条目:

@inproceedings{
    rafailov2023direct,
    title={Direct Preference Optimization: Your Language Model is Secretly a Reward Model},
    author={Rafael Rafailov and Archit Sharma and Eric Mitchell and Christopher D Manning and Stefano Ermon and Chelsea Finn},
    booktitle={Thirty-seventh Conference on Neural Information Processing Systems},
    year={2023},
    url={https://arxiv.org/abs/2305.18290}
}

编辑推荐精选

问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多