• 文档 >
  • torchtune 中的 Meta Llama3
快捷方式

torchtune 中的 Meta Llama3

您将学习如何
  • 下载 Llama3-8B-Instruct 权重和分词器

  • 使用 LoRA 和 QLoRA 微调 Llama3-8B-Instruct

  • 评估您微调的 Llama3-8B-Instruct 模型

  • 使用您微调的模型生成文本

  • 量化您的模型以加快生成速度

先决条件

Llama3-8B

Meta Llama 3 是 Meta AI 发布的一个新的模型系列,它在各种基准测试中提高了 Llama2 模型系列的性能。目前 Meta Llama 3 有两种不同的尺寸:8B 和 70B。在本教程中,我们将重点关注 8B 尺寸的模型。Llama2-7B 和 Llama3-8B 模型之间有一些主要的变化

  • Llama3-8B 使用 分组查询注意力,而不是 Llama2-7B 中的标准多头注意力

  • Llama3-8B 具有更大的词汇量大小(128,256 而不是 Llama2 模型中的 32,000)

  • Llama3-8B 使用与 Llama2 模型不同的分词器(tiktoken 而不是 sentencepiece

  • Llama3-8B 在其 MLP 层中使用更大的中间维度,而不是 Llama2-7B

  • Llama3-8B 使用更高的基值来计算其 旋转位置嵌入中的 theta


获取 Llama3-8B-Instruct

在本教程中,我们将使用 Llama3-8B 的指令微调版本。首先,让我们从 Hugging Face 下载模型。您需要按照 Meta 官方页面上的说明获取模型访问权限。接下来,确保您从 此处获取您的 Hugging Face 令牌。

tune download meta-llama/Meta-Llama-3-8B-Instruct \
    --output-dir <checkpoint_dir> \
    --hf-token <ACCESS TOKEN>

在 torchtune 中微调 Llama3-8B-Instruct

torchtune 提供了 LoRAQLoRA 和完整微调配方,用于在一个或多个 GPU 上微调 Llama3-8B。有关 torchtune 中 LoRA 的更多信息,请参阅我们的 LoRA 教程。有关 torchtune 中 QLoRA 的更多信息,请参阅我们的 QLoRA 教程

让我们看看如何在单个设备上使用 torchtune 通过 LoRA 微调 Llama3-8B-Instruct。在本例中,我们将对一个常见的指令数据集进行一个 epoch 的微调,以说明目的。单个设备 LoRA 微调的基本命令是

tune run lora_finetune_single_device --config llama3/8B_lora_single_device

注意

要查看所有配方及其相应的配置列表,只需从命令行运行 tune ls

我们还可以根据需要添加 命令行覆盖,例如

tune run lora_finetune_single_device --config llama3/8B_lora_single_device \
    checkpointer.checkpoint_dir=<checkpoint_dir> \
    tokenizer.path=<checkpoint_dir>/tokenizer.model \
    checkpointer.output_dir=<checkpoint_dir>

这将从上面 tune download 命令中使用的 <checkpoint_dir> 加载 Llama3-8B-Instruct 检查点和分词器,然后按照原始格式在同一目录中保存最终检查点。有关 torchtune 支持的检查点格式的更多详细信息,请参阅我们的 检查点深入探讨

注意

要查看此配置(和其他配置)的完整可配置参数集,我们可以使用 tune cp 复制(和修改)默认配置。tune cp 也可以与配方脚本一起使用,如果您想进行更多自定义更改,而这些更改无法通过直接修改现有可配置参数来实现。有关 tune cp 的更多信息,请参阅我们“微调你的第一个 LLM”教程中关于 修改配置的部分。

训练完成后,模型检查点将被保存,其位置将被记录。对于 LoRA 微调,最终检查点将包含合并后的权重,并且仅保存 LoRA 权重的副本(更小)。

在我们的实验中,我们观察到峰值内存使用量为 18.5 GB。默认配置可以在具有 24 GB VRAM 的消费级 GPU 上进行训练。

如果您有多个 GPU 可用,则可以运行配方的分布式版本。torchtune 利用 PyTorch Distributed 中的 FSDP API 来分片模型、优化器状态和梯度。这应该使您能够增加批量大小,从而加快整体训练速度。例如,在两个设备上

tune run --nproc_per_node 2 lora_finetune_distributed --config llama3/8B_lora

最后,如果我们想使用更少的内存,我们可以通过以下方式利用 torchtune 的 QLoRA 配方

tune run lora_finetune_single_device --config llama3/8B_qlora_single_device

由于我们的默认配置启用了完整的 bfloat16 训练,因此所有上述命令都可以在具有至少 24 GB VRAM 的设备上运行,事实上,QLoRA 配方的峰值分配内存应该低于 10 GB。您还可以尝试不同的 LoRA 和 QLoRA 配置,甚至运行完整的微调。试试吧!


使用 EleutherAI 的评估套件评估微调的 Llama3-8B 模型

现在我们已经微调了我们的模型,接下来是什么?让我们从上一节中微调的 LoRA 模型出发,看看我们可以用几种不同的方法来评估它在我们关心的任务上的性能。

首先,torchtune 提供了与 EleutherAI 的评估套件的集成,用于在常见基准任务上评估模型。

注意

确保您已通过 pip install "lm_eval==0.4.*"安装了评估套件。

在本教程中,我们将使用套件中的 truthfulqa_mc2 任务。此任务衡量模型在回答问题时保持真实性的倾向,并衡量模型在问题后跟一个或多个真实答案和一个或多个错误答案时的零样本准确率。首先,让我们复制配置,以便我们可以将 YAML 文件指向我们微调的检查点文件。

tune cp eleuther_evaluation ./custom_eval_config.yaml

接下来,我们修改 custom_eval_config.yaml 以包含微调的检查点。

model:
  _component_: torchtune.models.llama3.llama3_8b

checkpointer:
  _component_: torchtune.training.FullModelMetaCheckpointer

  # directory with the checkpoint files
  # this should match the output_dir specified during
  # fine-tuning
  checkpoint_dir: <checkpoint_dir>

  # checkpoint files for the fine-tuned model. These will be logged
  # at the end of your fine-tune
  checkpoint_files: [
    meta_model_0.pt
  ]

  output_dir: <checkpoint_dir>
  model_type: LLAMA3

# Make sure to update the tokenizer path to the right
# checkpoint directory as well
tokenizer:
  _component_: torchtune.models.llama3.llama3_tokenizer
  path: <checkpoint_dir>/tokenizer.model

最后,我们可以使用我们修改后的配置运行评估。

tune run eleuther_eval --config ./custom_eval_config.yaml

自己试试看,看看你的模型能达到什么准确率!


使用我们微调的 Llama3 模型生成文本

接下来,让我们看看评估模型的另一种方法:生成文本!torchtune 也提供了一个生成配方

与我们之前做的一样,让我们复制并修改默认的生成配置。

tune cp generation ./custom_generation_config.yaml

现在我们修改custom_generation_config.yaml以指向我们的检查点和分词器。

model:
  _component_: torchtune.models.llama3.llama3_8b

checkpointer:
  _component_: torchtune.training.FullModelMetaCheckpointer

  # directory with the checkpoint files
  # this should match the output_dir specified during
  # fine-tuning
  checkpoint_dir: <checkpoint_dir>

  # checkpoint files for the fine-tuned model. These will be logged
  # at the end of your fine-tune
  checkpoint_files: [
    meta_model_0.pt
  ]

  output_dir: <checkpoint_dir>
  model_type: LLAMA3

# Make sure to update the tokenizer path to the right
# checkpoint directory as well
tokenizer:
  _component_: torchtune.models.llama3.llama3_tokenizer
  path: <checkpoint_dir>/tokenizer.model

使用我们经过 LoRA 微调的模型运行生成,我们看到以下输出

tune run generate --config ./custom_generation_config.yaml \
prompt="Hello, my name is"

[generate.py:122] Hello, my name is Sarah and I am a busy working mum of two young children, living in the North East of England.
...
[generate.py:135] Time for inference: 10.88 sec total, 18.94 tokens/sec
[generate.py:138] Bandwidth achieved: 346.09 GB/s
[generate.py:139] Memory used: 18.31 GB

通过量化加速生成

我们依靠torchao 进行训练后量化。要安装 torchao 后量化微调模型,我们可以运行以下命令

# we also support `int8_weight_only()` and `int8_dynamic_activation_int8_weight()`, see
# https://github.com/pytorch/ao/tree/main/torchao/quantization#other-available-quantization-techniques
# for a full list of techniques that we support
from torchao.quantization.quant_api import quantize_, int4_weight_only
quantize_(model, int4_weight_only())

量化后,我们依靠 torch.compile 来加速。更多详细信息,请参阅此示例用法

torchao 还提供了此表格,其中列出了llama2llama3的性能和准确性结果。

对于 Llama 模型,您可以使用它们讨论的generate.py脚本直接在 torchao 上的量化模型上运行生成此自述文件。这样,您可以将自己的结果与先前链接的表格中的结果进行比较。

这仅仅是您可以使用 Meta Llama3、torchtune 和更广泛的生态系统所做的事情的开始。我们期待着看到您构建的内容!

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取针对初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源