torchtune
简介 | 安装 | 开始使用 | 文档 | 设计原则 | 社区贡献 | 许可证
[!注意] 2024年7月: torchtune已在源代码和每日构建中更新了Llama3.1的模型权重!查看我们为8B和70B版本的模型提供的配置。支持LoRA、QLoRA和完整微调方法。即将添加对QLoRA 405B的支持。
简介
torchtune是一个PyTorch原生库,用于轻松创作、微调和实验大型语言模型(LLMs)。我们很高兴宣布我们的alpha版本发布!
torchtune提供:
- 使用可组合和模块化构建块实现的流行LLMs的原生PyTorch实现
- 易于使用和可修改的流行微调技术(LoRA、QLoRA)训练配方 - 无需训练器,无需框架,仅需PyTorch!
- 用于轻松配置训练、评估、量化或推理配方的YAML配置
- 内置支持多种流行数据集格式和提示模板,帮助您快速开始训练
torchtune专注于与生态系统中的流行工具和库集成。以下只是几个例子,还有更多正在开发中:
- Hugging Face Hub用于访问模型权重
- EleutherAI的LM评估工具用于评估训练好的模型
- Hugging Face Datasets用于访问训练和评估数据集
- PyTorch FSDP用于分布式训练
- torchao用于低精度数据类型和训练后量化技术
- Weights & Biases用于记录指标和检查点,并跟踪训练进度
- Comet作为另一个日志记录选项
- ExecuTorch用于使用微调模型进行设备上推理
- bitsandbytes用于我们的单设备配方的低内存优化器
模型
torchtune目前支持以下模型。
模型 | 规模 |
---|---|
Llama3.1 | 8B, 70B [模型, 配置] |
Llama3 | 8B, 70B [模型, 配置] |
Llama2 | 7B, 13B, 70B [模型, 配置] |
Code-Llama2 | 7B, 13B, 70B [模型, 配置] |
Mistral | 7B [模型, 配置] |
Gemma | 2B, 7B [模型, 配置] |
Microsoft Phi3 | Mini [模型, 配置] |
Qwen2 | 0.5B, 1.5B, 7B [模型, 配置] |
我们一直在添加新模型,但如果您希望在torchtune中看到某个新模型,请随时提交问题!
微调配方
torchtune提供以下微调配方。
训练 | 微调方法 |
---|---|
分布式训练 [1至8个GPU] | 完整 [代码, 示例], LoRA [代码, 示例] |
单设备/低内存 [1个GPU] | 完整 [代码, 示例], LoRA + QLoRA [代码, 示例] |
单设备 [1个GPU] | DPO [代码, 示例], 使用PPO的RLHF [代码, 示例] |
内存效率对我们来说很重要。我们所有的配方都在各种设置上进行了测试,包括具有24GB显存的商用GPU以及数据中心中找到的更强大的选项。 单GPU配方提供了一些在分布式版本中无法使用的内存优化。这些包括支持来自bitsandbytes的低精度优化器,以及将优化器步骤与反向传播融合以减少梯度的内存占用(参见示例配置)。对于内存受限的设置,我们建议使用单设备配置作为起点。
这个表格展示了torchtune中配方的峰值内存使用和训练速度。
示例硬件资源 | 微调方法 | 模型 | 设置 | 每GPU峰值内存(GB) | 训练速度(tokens/秒) |
---|---|---|---|---|---|
1 x RTX 4090 | QLoRA ** | Llama2-7B | 批次大小 = 4, 序列长度 = 2048 | 12.3 GB | 3155 |
1 x RTX 4090 | LoRA | Llama2-7B | 批次大小 = 4, 序列长度 = 2048 | 21.3 GB | 2582 |
2 x RTX 4090 | LoRA | Llama2-7B | 批次大小 = 4, 序列长度 = 2048 | 16.2 GB | 2768 |
1 x RTX 4090 | 全量微调 * | Llama2-7B | 批次大小 = 4, 序列长度 = 2048 | 24.1 GB | 702 |
4 x RTX 4090 | 全量微调 | Llama2-7B | 批次大小 = 4, 序列长度 = 2048 | 24.1 GB | 1388 |
8 x A100 | LoRA | Llama2-70B | 批次大小 = 4, 序列长度 = 4096 | 26.4 GB | 3384 |
8 x A100 | 全量微调 * | Llama2-70B | 批次大小 = 4, 序列长度 = 4096 | 70.4 GB | 2032 |
*= 使用来自bitsandbytes的PagedAdamW
**= 使用torch compile
Llama3和Llama3.1
torchtune支持对Llama3 8B和70B规模的模型进行微调。我们目前支持在单个GPU上进行LoRA、QLoRA和全量微调,以及在多个设备上对8B模型进行LoRA和全量微调,还支持在多个设备上对70B模型进行LoRA微调。有关所有详细信息,请查看我们的教程。
[!注意] 我们的Llama3和Llama3.1 LoRA和QLoRA配置默认使用指令微调模型。这是因为基础的8B和70B模型中并非所有特殊标记嵌入都已初始化。
在我们对Llama3-8B的初步实验中,QLoRA的峰值分配内存约为~9GB
,而单GPU上的LoRA峰值分配内存约为~19GB
。要开始使用,您可以使用我们的默认配置来启动训练。
单GPU
LoRA 8B
tune run lora_finetune_single_device --config llama3_1/8B_lora_single_device
QLoRA 8B
tune run lora_finetune_single_device --config llama3_1/8B_qlora_single_device
全量 8B
tune run full_finetune_single_device --config llama3_1/8B_full_single_device
多GPU
全量 8B
tune run --nproc_per_node 4 full_finetune_distributed --config llama3_1/8B_full
LoRA 8B
tune run --nproc_per_node 2 lora_finetune_distributed --config llama3_1/8B_lora
LoRA 70B
请注意,Meta-Llama3 70B模型的下载命令与8B模型的下载命令略有不同。这是因为我们使用HuggingFace的safetensor模型格式来加载模型。要下载70B模型,请运行
tune download meta-llama/Meta-Llama-3.1-70b --hf-token <> --output-dir /tmp/Meta-Llama-3.1-70b --ignore-patterns "original/consolidated*"
然后,可以启动微调:
tune run --nproc_per_node 8 lora_finetune_distributed --config llama3_1/70B_lora.yaml
您可以在此处找到我们所有Llama3配置的完整列表,在此处找到Llama3.1配置的完整列表。
安装
步骤1: 安装PyTorch。torchtune已经在最新的稳定版PyTorch发布以及预览的每日构建版本上进行了测试。要微调仓库中提供的多模态LLM,您还需要安装torchvision。
# 使用pip安装稳定版PyTorch
pip install torch torchvision
# 安装每日构建版以获取最新功能
pip install --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cu121
步骤2: torchtune的最新稳定版本托管在PyPI上,可以使用以下命令下载:
pip install torchtune
要确认软件包已正确安装,您可以运行以下命令:
tune --help
您应该看到以下输出:
usage: tune [-h] {ls,cp,download,run,validate} ...
欢迎使用torchtune命令行界面!
选项:
-h, --help 显示此帮助消息并退出
...
您还可以通过安装每日构建版本来获得torchtune提供的最新和最强大的功能。
入门
要开始使用torchtune微调您的第一个LLM,请查看我们关于微调Llama2 7B的教程。我们的端到端工作流程教程将向您展示如何评估、量化和运行此模型的推理。本节的其余部分将简要概述使用Llama2进行这些步骤的过程。
下载模型
按照官方meta-llama
仓库的说明确保您有权访问官方Llama模型权重。一旦确认访问权限,您可以运行以下命令将权重下载到本地机器。这还将下载分词器模型和负责任使用指南。
Llama3下载
tune download meta-llama/Meta-Llama-3-8B \
--output-dir /tmp/Meta-Llama-3-8B \
--hf-token <HF_TOKEN> \
[!提示] 设置环境变量
HF_TOKEN
或在命令中传入--hf-token
以验证您的访问权限。您可以在https://huggingface.co/settings/tokens找到您的令牌
运行微调配方
Llama3 8B + 在单个GPU上使用LoRA:
tune run lora_finetune_single_device --config llama2/7B_lora_single_device
对于分布式训练,tune CLI 集成了 torchrun。 在两个 GPU 上运行 Llama3 8B + LoRA:
tune run --nproc_per_node 2 full_finetune_distributed --config llama2/7B_full
[!提示] 确保将任何 torchrun 命令放在配方规范之前。之后的任何 CLI 参数都将覆盖配置,而不会影响分布式训练。
修改配置
你可以通过两种方式修改配置:
配置覆盖
你可以轻松地从命令行覆盖配置属性:
tune run lora_finetune_single_device \
--config llama2/7B_lora_single_device \
batch_size=8 \
enable_activation_checkpointing=True \
max_steps_per_epoch=128
更新本地副本
你也可以将配置复制到本地目录并直接修改内容:
tune cp llama2/7B_full ./my_custom_config.yaml
已复制到 ./7B_full.yaml
然后,你可以通过将 tune run
命令指向你的本地文件来运行自定义配方:
tune run full_finetune_distributed --config ./my_custom_config.yaml
查看 tune --help
了解所有可能的 CLI 命令和选项。有关使用和更新配置的更多信息,请查看我们的配置深度探讨。
设计原则
torchtune 体现了 PyTorch 的设计哲学[详情],特别是"可用性高于一切"。
原生 PyTorch
torchtune 是一个原生 PyTorch 库。虽然我们提供与周围生态系统的集成(例如 Hugging Face Datasets、EleutherAI Eval Harness),但所有核心功能都是用 PyTorch 编写的。
简单性和可扩展性
torchtune 旨在易于理解、使用和扩展。
- 组合优于实现继承 - 用于代码重用的继承层会使代码难以阅读和扩展
- 无训练框架 - 明确概述训练逻辑使其易于扩展以适应自定义用例
- 代码重复优于不必要的抽象
- 模块化构建块优于单一组件
正确性
torchtune 提供经过充分测试的组件,对正确性有很高的要求。该库永远不会是第一个提供某个功能的库,但可用的功能将经过彻底测试。我们提供
- 广泛的单元测试,以确保组件级别与参考实现的数值一致性
- 检查点测试,以确保模型级别与参考实现的数值一致性
- 集成测试,以确保在标准基准测试上与参考实现的配方级性能一致性
社区贡献
我们非常重视我们的社区和我们出色用户做出的贡献。我们将在这一部分中呼吁一些这些贡献!如果你也想提供帮助,请查看 CONTRIBUTING 指南。
- @SalmanMohammadi 为 torchtune 添加了一个全面的端到端配方,用于使用 PPO 进行人类反馈强化学习 (RLHF) 微调
- @fyabc 为 torchtune 添加了 Qwen2 模型、分词器和配方集成
- @solitude-alive 为 torchtune 添加了 Gemma 2B 模型,包括配方更改、模型的数值验证和配方正确性
- @yechenzhi 为 torchtune 添加了直接偏好优化 (DPO),包括配方和配置以及正确性检查
致谢
此存储库中的 Llama2 代码受到原始 Llama2 代码 的启发。
我们要向 EleutherAI、Hugging Face 和 Weights & Biases 表示衷心的感谢,感谢他们成为出色的合作伙伴,并与我们一起在 torchtune 中完成一些集成工作。
我们还要感谢生态系统中一些优秀的库和工具:
- gpt-fast 提供了高性能的 LLM 推理技术,我们已经采用了开箱即用的方式
- llama recipes 为 llama2 社区提供了起步支持
- bitsandbytes 为 PyTorch 生态系统带来了多项基于内存和性能的技术
- @winglian 和 axolotl 对 torchtune 的设计和功能集提供了早期反馈和头脑风暴
- lit-gpt 推动了 LLM 微调社区的发展
- HF TRL 使奖励建模对 PyTorch 社区更易访问
许可证
torchtune 根据 BSD 3 许可证 发布。但是,你可能还有其他法律义务来管理你对其他内容的使用,例如第三方模型的服务条款。