torchtune 中的 Meta Llama3¶
下载 Llama3-8B-Instruct 权重和分词器
使用 LoRA 和 QLoRA 微调 Llama3-8B-Instruct
评估您微调的 Llama3-8B-Instruct 模型
使用您微调的模型生成文本
量化您的模型以加快生成速度
熟悉 torchtune
确保 安装 torchtune
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 提供了 LoRA、QLoRA 和完整微调配方,用于在一个或多个 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 还提供了此表格,其中列出了llama2
和llama3
的性能和准确性结果。
对于 Llama 模型,您可以使用它们讨论的generate.py
脚本直接在 torchao 上的量化模型上运行生成此自述文件。这样,您可以将自己的结果与先前链接的表格中的结果进行比较。
这仅仅是您可以使用 Meta Llama3、torchtune 和更广泛的生态系统所做的事情的开始。我们期待着看到您构建的内容!