当前位置:   article > 正文

torchtune

torchtune


一、关于 torchtune

torchtune 是用于微调大模型的 PyTorch 库。


什么是 torchtune?

torchtune是一个PyTorch库,用于轻松创作、微调和试验LLM。强调4个关键方面:

  • 简单性和可扩展性:原生PyTorch、组件化设计和易于重用的抽象。
  • 正确性 :证明成分和recipe正确性的高标准。
  • 稳定性 :PyTorch 好用,torchtune 也应该很好用。
  • Democratizing LLM微调:在不同的硬件上开箱即用。

torchtune 提供:

  • 流行LLM 的模块化本地PyTorch实现
  • 通过checkpoint-conversion 工具 与流行的model zoos 实现互操作
  • 各种微调技术的训练recipe
  • 与用于训练和评估 EleutherAI’s Eval Harness Hugging Face Datasets 集成
  • 使用FSDP 支持分布式培训
  • YAML配置,用来轻松配置训练

你可以参考以下教程


关键概念 Configs、Recipes

当你阅读教程和代码时,有两个概念将帮助你更好地理解和使用torchtune。

1、Configs :是YAML文件,可帮助您在不修改代码的情况下配置训练设置(数据集、模型、检查点)和超参数(批量大小、学习率)。
更多信息可参阅:All About Configs deep-dive

2、Recipes. :Recipes 可以被视为培训和评估LLM的有针对性的端到端管道。
每个recipe都实现了一种训练方法(例如:完全微调),并将一组有意义的特征(例如:FSDP+激活检查点+梯度积累+降低精度训练)应用于给定的模型族(例如:Llama2)。
更多信息请参阅:What Are Recipes? deep-dive


设计准则

torchtune 体现了 PyTorch’s design philosophy, 特别是 “usability over everything else”.

Native PyTorch

torchtune是本地PyTorch库。
虽然我们提供与周围生态系统的集成(例如:Hugging Face Datasets、EleutherAI Eval Harness),但所有核心功能都是用PyTorch编写的。


Simplicity and Extensibility
torchtune 设计来 易于理解、使用和扩展。

  • 实现之上的组合继承 - 用于代码重用 的继承层 使代码难以读取和扩展
  • 没有训练框架 - 明确地概述 训练逻辑,使其易于扩展到自定义用例
  • 比起不必要的抽象,代码重复更可取
  • 模块化构建块 高于 单片组件

Correctness

torchtune为经过良好测试的组件提供了高标准的正确性。
该库永远不会是第一个提供功能的库,但可用的功能将经过彻底测试。提供:

  • 广泛的单元测试,以确保与参考实现的组件级数字奇偶性
  • Checkpoint 测试,以确保与参考实现的模型级数字奇偶性
  • 集成测试,以确保 recipe 级性能与标准基准测试上的参考实施持平

二、安装

详情可见:https://pytorch.org/torchtune/stable/install.html

pip install torchtune
  • 1

你可以运行 tune 命令来检查是否安装成功


使用源码安装

git clone https://github.com/pytorch/torchtune.git
cd torchtune
pip install -e .
  • 1
  • 2
  • 3

三、微调模型

1、下载模型

torchtune 支持集成Hugging Face Hub

在这个教程中,你将使用 Llama2 7B model from Meta
Llama2 是一个 “gated model”, 这意味着您需要获得访问权限,才能下载权重。
跟随 这个向导 在Hugging Face上托管的官方Meta页面上完成这一过程。这应该需要不到5分钟的时间。
要验证您是否有访问权限,请转到 model page.
您应该能够看到模型文件。如果没有,您可能需要接受协议才能完成流程。

注:或者,您可以选择直接通过 Llama2 存储库下载模型。请参阅此页面了解更多详细信息。


获得授权后,您需要使用 Hugging Face Hub 进行身份验证。最简单的方法是为下载脚本提供访问令牌。您可以在这里找到您的令牌。

那么,就很简单了:

tune download meta-llama/Llama-2-7b-hf \
  --output-dir /tmp/Llama-2-7b-hf \
  --hf-token <ACCESS TOKEN>
  • 1
  • 2
  • 3

此命令还将下载模型标记器和其他一些有用的文件,例如负责任的使用指南。


2、选择recipe

recipe是 torchtune 用户的主要入口点。这些可以被认为是**可破解的、专注于与 LLM 交互的脚本,**包括训练、推理、评估和量化。

每个recipe由三个部分组成:

  • 可配置参数,通过 yaml 配置和命令行覆盖指定
  • Recipe 脚本,将所有内容放在一起的入口点,包括解析和验证配置、设置环境以及正确使用recipe类
  • Recipe 类,训练所需的核心逻辑,通过一组API公开

注:要了解有关“recipe”概念的更多信息,请查看我们的技术深入探讨:什么是recipe?


torchtune 提供内置recipe,可在单个设备、具有FSDP 的多个设备上进行微调,使用LoRA等内存高效技术!

您可以在 GitHub 上查看所有内置recipe。
您还可以使用 tune ls 命令打印出所有recipe和相应的配置。

$ tune ls
RECIPE                                   CONFIG
full_finetune_single_device              llama2/7B_full_low_memory
                                         mistral/7B_full_low_memory
full_finetune_distributed                llama2/7B_full
                                         llama2/13B_full
                                         mistral/7B_full
lora_finetune_single_device              llama2/7B_lora_single_device
                                         llama2/7B_qlora_single_device
                                         mistral/7B_lora_single_device
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

出于本教程的目的,您将使用在单个设备上使用LoRA微调 Llama2 模型的recipe。
有关 torchtune 中 LoRA 的更深入讨论,您可以查看完整的使用 LoRA 微调 Llama2教程。

注:为什么要为单一设备和分布式设备制定单独的方案?这在什么是recipe?中讨论过。
但我们在 torchtune 中的核心原则之一是最小化抽象和样板代码。
如果您只想在单个 GPU 上进行训练,我们的单设备recipe可确保您不必担心仅分布式训练所需的其他功能,例如 FSDP。


3、修改配置

YAML 配置包含运行recipe所需的大部分重要信息。
您可以设置超参数、指定指标记录器(例如WandB )、选择新数据集等等。
有关当前支持的所有数据集的列表,请参阅torchtune.datasets


有两种方法可以修改现有配置:

1、从命令行覆盖现有参数

您可以使用格式从命令行覆盖现有参数key=value。假设您要将训练时期数设置为 1。

tune run <RECIPE> --config <CONFIG> epochs=1
  • 1

2、通过tune cp复制配置并直接修改

如果您想对配置进行更多实质性更改,可以使用 CLItune将其复制到本地目录。

$ tune cp llama2/7B_lora_single_device custom_config.yaml
Copied file to custom_config.yaml
  • 1
  • 2

现在您可以按照您喜欢的方式更新自定义 YAML 配置。尝试设置随机种子以使复制更容易、更改 LoRA 等级、更新批量大小等。

注:查看All About Configs 以更深入地了解 torchtune 中的配置。


4、训练模型

现在您已经有了正确格式的模型和适合您需求的配置,让我们开始训练吧!

就像所有其他步骤一样,您将使用 tune CLI 工具来启动微调运行。

$ tune run lora_finetune_single_device --config llama2/7B_lora_single_device epochs=1
INFO:torchtune.utils.logging:Running LoRAFinetuneRecipeSingleDevice with resolved config:
Writing logs to /tmp/lora_finetune_output/log_1713194212.txt
INFO:torchtune.utils.logging:Model is initialized with precision torch.bfloat16.
INFO:torchtune.utils.logging:Tokenizer is initialized from file.
INFO:torchtune.utils.logging:Optimizer and loss are initialized.
INFO:torchtune.utils.logging:Loss is initialized.
INFO:torchtune.utils.logging:Dataset and Sampler are initialized.
INFO:torchtune.utils.logging:Learning rate scheduler is initialized.
1|52|Loss: 2.3697006702423096:   0%|| 52/25880 [00:24<3:55:01,  1.83it/s]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可以看到所有模块都已成功初始化,模型已开始训练。
您可以通过 tqdm 栏监控丢失和进度,但 torchtune 还会按照配置中定义的时间间隔记录更多指标,例如 GPU 内存使用情况。


现在您已经训练了模型并设置了环境,可以通过查看 E2E 工作流教程 来看看我们可以使用新模型做什么。


2024-04-23(二)

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号