训练开放指令跟随语言模型
本仓库是一项开放的努力,旨在使用公开可用的数据集对流行的预训练语言模型进行指令微调。我们发布此仓库并将持续更新以下内容:
- 使用最新技术和统一格式的指令数据集对语言模型进行微调的代码。
- 在一系列基准测试上运行标准评估的代码,针对这些语言模型的不同能力。
- 我们在探索过程中构建的检查点或其他有用的人工制品。
请参阅我们的第一篇论文《骆驼能走多远?探索开放资源上的指令调优现状》,了解更多关于这个项目背后的思考和我们的初步发现。请参阅我们的第二篇论文《变化气候中的骆驼:用Tulu 2增强语言模型适应性》,了解使用Llama-2模型和直接偏好优化的结果。我们仍在研究更多模型。关于最近涉及PPO和DPO的结果,请参阅我们的第三篇论文《拆解DPO和PPO:解开偏好反馈学习的最佳实践》。
注意: Open Instruct的早期版本使用了固定版本的Transformers来复现Tulu 1/2的结果。如果这是你的目标,请参考此提交或更早版本。
新闻
- [2024-07-01] 我们发布了拆解DPO和PPO:解开偏好反馈学习的最佳实践,并大幅更新了我们的代码库以支持新模型和软件包版本。
- [2023-11-27] 我们发布了变化气候中的骆驼:用Tulu 2增强语言模型适应性。在这里查看我们的模型。我们添加了一个DPO微调脚本用于复现我们的结果。
- [2023-09-26] 我们转而使用官方的alpaca-eval库来运行AlpacaFarm评估,但使用重新生成的更长参考输出。这将改变我们在论文中报告的数字。我们将尽快更新论文。
- [2023-09-25] 在评估中支持使用vLLM,将评估速度提高了10倍。
- [2023-09-17] 支持LoRA和QLoRA微调。更多详情请参见这里。
- [2023-08-18] 增加了对ToxiGen/TrutufulQA评估的支持。查看我们的
scripts/eval/
了解运行示例。 - [2023-08-08] 支持了几个新的指令数据集,包括LIMA / WizardLM / Open-Orca。详情请参见准备脚本。性能尚未评估。
- [2023-08-06] 通过升级transformers和许多其他依赖项的版本,支持了LLaMa 2微调和FlashAttention-2。
- [2023-06-29] 为我们发布的模型添加了许可信息。
- [2023-06-09] 在HuggingFace上发布了Tülu(在强大的混合数据集上全面微调的一系列LLaMa模型)和许多其他检查点[链接]。
- [2023-06-09] 初次发布代码库,包含我们arxiv论文的训练和评估代码。
设置
安装过程轻量,假设两种安装策略之一。 首先,在裸环境中安装(无Cuda镜像)。
安装前,如果不在已安装NVCC的Docker容器中,你应该运行:
conda install cuda-nvcc=<ver> -c nvidia
然后,从源代码安装torch==2.3.0
。
要运行我们微调模型的训练、评估或推理,你需要通过运行以下命令安装所需的包(在安装pytorch之后):
pip install -r requirements.txt
注意: Open Instruct的早期版本使用了固定版本的Transformers来复现Tulu 2结果。如果这是你的目标,请参考此提交或更早版本。
如果你只想要权重差异脚本的依赖项,请使用:
pip install -r weight-diff-requirements.txt
对于第二种安装策略,如果你想在Docker环境中运行实验,你可以使用以下命令创建一个:
docker build --build-arg CUDA=12.1.0 --build-arg TARGET=cudnn8-devel --build-arg DIST=ubuntu20.04 --build-arg REQUIRE=requirements.txt . -t open_instruct
# 如果你在AI2内部,你可以这样创建镜像:
beaker image create open_instruct -n open_instruct -w ai2/$(whoami)
如果你在AI2内部,你可以使用这个预构建的beaker镜像hamishivi/open-instruct-eval
(最新版本在此)。对于微调,你可以使用hamishivi/open-instruct-public
(最新版本在此)。我会尽量定期更新这些镜像。
OLMo用户注意事项: 由于deepspeed和vLLM之间的版本冲突,我们无法在同一镜像中同时支持OLMo推理和deepspeed(这个问题将在deepspeed允许使用pydantic >= 2后得到解决)。要构建适用于OLMo推理/评估的Docker镜像,请使用以下命令:
docker build --build-arg CUDA=12.1.0 --build-arg TARGET=cudnn8-devel --build-arg DIST=ubuntu20.04 --build-arg REQUIRE=requirements-olmo.txt -f Dockerfile.olmo . -t <你的标签>
对于训练,你可以使用之前的镜像。
开发
向本仓库提交PR时,我们会使用以下命令检查open_instruct/
中核心代码的风格:
make style
make quality
仓库结构
├── assets/ <- 图片、许可证等
├── configs/
| ├── beaker_configs/ <- AI2 Beaker配置
| ├── ds_configs/ <- DeepSpeed配置
| └── train_configs/ <- 训练配置
├── eval/ <- 微调模型的评估套件
├── human_eval/ <- 人工评估界面(未维护)
├── open_instruct/ <- 源代码(扁平结构)
├── quantize/ <- 量化脚本
├── scripts/ <- 核心训练和评估脚本
├── Dockerfile <- 主Dockerfile
└── Dockerfile.olmo <- OLMo用户的Dockerfile(当前存在版本冲突)
训练
数据集准备
我们在探索中包含了一系列具有代表性的指令数据集,并正在不断添加新的数据集。我们将它们统一为相同的对话格式。要下载和准备这些数据集,只需运行以下命令:
./scripts/data/prepare_train_data.sh
请检查这些数据集的许可证和使用限制!
你还可以在HuggingFace上找到处理过的Tulu v1和Tulu v2 SFT数据集。请注意,由于生成过程中的随机性和数据可用性的变化,训练数据准备脚本不会精确地重现Tulu v2混合数据集 - 详情请参见这个PR。如果你需要完全相同的训练数据,HuggingFace上的混合数据集就是这个 - 与模型训练时使用的数据完全相同。
模型准备
通常,大多数兼容huggingface的因果语言模型都可以与我们的代码库正常配合使用,可能需要对不同的分词器等进行一些调整。某些模型可能需要额外的请求才能下载。例如,对于LLaMa 1和2,请参考Hugging Face文档以请求访问权限并将其转换为兼容huggingface的格式。
微调
你可以使用以下命令进行指令调优(微调预训练模型以遵循指令):
./scripts/finetune_with_accelerate.sh
确保根据你的模型/数据/设置调整model_name_or_path
、tokenizer_name
、train_file
和output_dir
。默认情况下,这使用deepspeed
和accelerate
。
注意: 如果你想复现已发布的Tulu 2模型,可能需要将损失计算切换为--reduce_loss sum
。这使用求和而不是平均来进行损失计算,意味着我们在训练时对所有token进行均等加权,更好地模拟了用于训练Tulu 2模型的较大批量大小。有关更多讨论和细节,请参见https://github.com/huggingface/transformers/issues/24725。通常,*如果你需要使用大量梯度累积,使用求和归约可能会得到更好的结果*(包括训练Llama 3模型)。
参数高效微调
我们支持LoRA微调,其中只更新少量参数,从而实现更快、更便宜的训练。为了更高的效率,我们还支持QLoRA微调,其中在4位训练过程中对非训练(基础)模型参数进行量化。这意味着你可以在单个80GB A100上训练70b Llama模型!请参阅相应的论文了解更多详情。
请注意,目前你不能将QLoRA与模型并行性一起运行 - 只支持数据并行训练,因此你不能训练一个不适合单个GPU的模型。对于LoRA,你可以使用deepspeed + zero-3来实现模型并行(目前不支持FSDP)。
请参阅./scripts/finetune_lora_with_accelerate.sh
和./scripts/finetune_qlora_with_accelerate.sh
以获取示例超参数。我们发现较大的秩(例如256)和较高的学习率(例如2e-4)效果最佳。此外,我们发现QLoRA总是能达到与LoRA相似的结果,而LoRA本身有时会落后于全量微调,特别是在长而复杂的生成任务中。然而,对于大多数用途,LoRA训练基本上能达到与全量微调相匹配的性能。我们建议将使用QLoRA学习的模块合并到反量化的模型中(使用--qlora
标志运行我们的合并脚本)。
DPO微调
有关如何使用DPO进行全量微调的示例,请参见scripts/dpo_train_with_accelerate.sh
。请注意,你至少需要8个80GB的A100才能训练7b大小的模型,对于更大的模型则需要更多计算资源。我们尚未测试过使用此脚本进行多节点训练,但理论上应该可以工作。
我们的脚本还支持使用QLoRA进行PEFT训练。有关示例,请参见scripts/dpo_train_with_qlora.sh
。我们尚未使用此方法训练过模型,因此可能需要额外的超参数调整才能达到合理的结果。
发布的检查点
我们的检查点可以在以下位置找到:
- 这里是所有Tulu v1模型。
- 这里是所有Tulu v2模型。
- OLMo 7B SFT和Instruct,以及2048序列长度版本的Tulu 2。
权重差异脚本
我们的Tulu V1模型以权重差异的形式发布(由于LLaMa 1许可证的原因)。我们使用了略微修改的Alpaca权重差异脚本,其运行方式相同。 合并模型的步骤:
- 下载相关的LLaMa模型并将其转换为Hugging Face格式(参见上文)。
- 下载我们的代码库并安装正确的依赖项(参见上文)。
- 下载您想要的模型差异文件。
- 运行以下命令:
python scripts/weights/weight_diff.py recover --path_raw ${hf_llama_path} --path_tuned ${output_path} --path_diff ${diff_location}
评估
基于基准的评估
我们提供了在一系列标准基准测试上运行Huggingface/OpenAI模型评估的脚本,这些基准测试旨在评估大型语言模型的核心能力。这些基准包括:
- MMLU
- Grade School Math (GSM)
- MATH
- Big-Bench Hard (BBH)
- TydiQA
- Codex HumanEval
- HumanEval+ 和 MBPP+
- IFEval
- ToxiGen
- XSTest
- TruthfulQA
- AlpacaEval 1 和 2
我们正在努力将更多有前景的基准测试纳入此列表。请继续关注!
您可以使用以下脚本下载所有评估数据:
./scripts/data/prepare_eval_data.sh
不同数据集的评估脚本放在./scripts
下。例如,您可以使用以下命令运行MMLU评估脚本:
./scripts/eval/mmlu.sh
Ai2内部评估
我们提供了一个与beaker集成的脚本,供Ai2内部使用。例如,要运行所有tulu 3评估并轻松上传:
python scripts/submit_eval_jobs.py \
--model_name <模型名称> \
--location <beaker id> \
--is_tuned --workspace tulu-3-results \
--preemptible \
--use_hf_tokenizer_template \
--beaker_image nathanl/open_instruct_olmo_auto \
--upload_to_hf allenai/tulu-3-evals \
--run_oe_eval_experiments
将location替换为您的beaker ID,将model name替换为您的模型名称(注意这将影响实验命名,所以请使其独特且易记!)。对于HF模型,请在model_name参数中使用hf-<model-name>
格式的名称,location则提供HF路径(例如meta-llama/Meta-Llama-3-8B-Instruct
)。请注意,这假设您的模型具有有效的HF标记器聊天模板。
要使此脚本正常工作,您必须将以下存储库克隆到open-instruct存储库的顶级目录。
人工评估
我们在./human_eval
文件夹中发布了我们的人工评估界面和收集的注释。更多详细信息请参阅相应的README。
许可
此代码库根据LICENSE中给出的Apache 2.0许可证授权。
我们为发布的V1模型使用的许可证(连同基础模型许可证)可以在assets/model_licenses/tulu_license.txt中找到 - 只需将<MODELNAME>
替换为实际的模型名称(即HuggingFace上的名称)。
V2模型根据低风险AI2 ImpACT许可证授权。更多详情请参见此处。
引用
如果您使用了此存储库或我们的模型,请引用我们的工作:
@misc{wang2023far,
title={How Far Can Camels Go? Exploring the State of Instruction Tuning on Open Resources},
author={Yizhong Wang and Hamish Ivison and Pradeep Dasigi and Jack Hessel and Tushar Khot and Khyathi Raghavi Chandu and David Wadden and Kelsey MacMillan and Noah A. Smith and Iz Beltagy and Hannaneh Hajishirzi},
year={2023},
eprint={2306.04751},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
@misc{ivison2023camels,
title={Camels in a Changing Climate: Enhancing LM Adaptation with Tulu 2},
author={Hamish Ivison and Yizhong Wang and Valentina Pyatkin and Nathan Lambert and Matthew Peters and Pradeep Dasigi and Joel Jang and David Wadden and Noah A. Smith and Iz Beltagy and Hannaneh Hajishirzi},
year={2023},
eprint={2311.10702},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
@misc{ivison2024unpacking,
title={Unpacking DPO and PPO: Disentangling Best Practices for Learning from Preference Feedback},
author={Hamish Ivison and Yizhong Wang and Jiacheng Liu and Zeqiu Wu and Valentina Pyatkin and Nathan Lambert and Noah A. Smith and Yejin Choi and Hannaneh Hajishirzi},
year={2024},
eprint={2406.09279},
archivePrefix={arXiv},
primaryClass={cs.CL},
}