本文约5300字,建议阅读8分钟 本文介绍了大型语言模型在自然语言处理领域取得了显著进展。
Torchtune的核心设计原则
简单性和可扩展性:Torchtune采用原生PyTorch的设计风格,提供模块化的组件和接口。这使得用户能够根据自己的需求,轻松地对现有功能进行修改和扩展,构建定制化的微调流程。同时,Torchtune也提供了一系列开箱即用的工具和模块,降低了用户的使用门槛。 正确性:LLM微调对训练数据和算法实现的正确性有着较高的要求。Torchtune中的各个组件和模块都经过了严格的单元测试和验证,确保了其输出结果的可靠性。Torchtune还提供了一系列调试和分析工具,帮助用户快速定位和解决训练过程中遇到的问题。 稳定性:Torchtune构建在PyTorch的稳定版本之上,并针对LLM微调场景进行了充分的测试和优化。用户可以在各种硬件环境下稳定地运行Torchtune,不必担心兼容性和稳定性问题。 可访问性:Torchtune的一个重要目标是让更多的用户能够参与到LLM的开发和应用中来。因此,Torchtune提供了详细的文档和教程,以及常见问题的解决方案。Torchtune还提供了一系列预训练模型和数据集,降低了用户的入门成本。
Torchtune的主要特性
模块化的PyTorch实现:Torchtune实现了当前主流的LLM架构,如Transformer、GPT、BERT等。用户可以直接使用这些模块,也可以基于它们构建自己的模型。 数据集和评测工具的集成:Torchtune与Hugging Face的Datasets库和EleutherAI的Eval Harness无缝集成,提供了丰富的数据集资源和标准化的评测方案。用户可以方便地访问和使用这些资源,也可以将自己的数据集和评测方案集成到Torchtune中。 高效的分布式训练:Torchtune支持多种并行训练方式,如数据并行、模型并行、流水线并行等。特别地,Torchtune针对LLM微调实现了Fully Sharded Data Parallel v2 (FSDP2),可以显著地加速大规模模型的训练速度,并减少显存占用。 基于配置文件的任务管理:Torchtune使用YAML格式的配置文件来管理微调任务的参数和流程。用户可以通过修改配置文件,灵活地控制训练过程,而无需修改代码。Torchtune还提供了一系列预置的配置文件和脚本,进一步简化了任务的管理和执行。
Torchtune中的关键概念
配置(Config)
数据集的路径和格式 模型的架构和参数 优化器的类型和超参数 训练的批大小、学习率、迭代次数等 评测和日志的设置
dataset:
path: /path/to/dataset
format: json
fields:
- name: text
type: string
- name: label
type: int
model:
type: transformer
params:
num_layers: 12
hidden_size: 768
num_attention_heads: 12
optimizer:
type: AdamW
params:
lr: 0.001
weight_decay: 0.01
train:
batch_size: 32
num_epochs: 10
log_interval: 100
evaluate:
batch_size: 64
metric:
- accuracy
- f1
方案(Recipe)
lora_finetune_single_device:单设备上使用LoRA进行微调 lora_finetune_distributed:多设备分布式环境下使用LoRA进行微调 qlora_finetune:使用QLoRA进行参数高效微调 distill_finetune:使用知识蒸馏技术进行微调
tune run lora_finetune_single_device \
--config configs/llama2/7B_lora_single_device.yaml \
--train.batch_size 128 \
--optimizer.params.lr 0.0001
小结
使用Torchtune微调LLM
准备工作
下载预训练模型
tune download meta-llama/Llama-2-7b-hf \
--output-dir /tmp/Llama-2-7b-hf \
--hf-token <ACCESS TOKEN>
选择微调方案
tune ls
配置微调任务
通过命令行参数覆盖配置文件中的参数:
tune run lora_finetune_single_device \
--config llama2/7B_lora_single_device.yaml \
train.batch_size=128 \
train.num_epochs=5
将配置文件复制到本地,然后直接修改配置文件:
tune cp llama2/7B_lora_single_device.yaml custom_config.yaml
修改custom_config.yaml文件,然后运行:
tune run lora_finetune_single_device \
--config custom_config.yaml
启动微调任务
tune run lora_finetune_single_device \
--config llama2/7B_lora_single_device.yaml
结果展示
保存和使用微调后的模型
tune export lora_finetune_single_device \
--output_dir /path/to/output
小结
准备工作:安装Torchtune,注册Hugging Face账号。 下载预训练模型:从Hugging Face Hub下载LLaMA-2-7B模型。 选择微调方案:选择lora_finetune_single_device方案。 配置微调任务:修改lora_finetune_single_device方案的默认配置文件。 启动微调任务:使用tune run命令启动微调任务。 保存和使用微调后的模型:使用tune export命令导出微调后的模型。
参数高效的微调方法:LoRA和QLoRA
LoRA:低秩适配
import torch
from torchtune.models.llama2 import llama2_7b, lora_llama2_7b
from torchtune.modules.peft.peft_utils import get_adapter_params, set_trainable_params
# 加载预训练的LLaMA-2-7B模型
base_model = llama2_7b(weights="/path/to/llama2_7b_weights", tokenizer="/path/to/llama2_tokenizer")
# 在LLaMA-2-7B模型上应用LoRA
lora_model = lora_llama2_7b(
lora_attn_modules=['q_proj', 'v_proj'],
lora_rank=8,
lora_alpha=16
)
# 将预训练权重加载到LoRA模型中
lora_model.load_state_dict(base_model.state_dict(), strict=False)
# 设置只有LoRA参数可训练
lora_params = get_adapter_params(lora_model)
set_trainable_params(lora_model, lora_params)
# 使用torchtune的LoRA微调方案进行训练
tune_command = """
tune run --nnodes 1 --nproc_per_node 2 lora_finetune_distributed --config llama2/7B_lora \
lora_attn_modules=['q_proj', 'k_proj', 'v_proj', 'output_proj'] \
lora_rank=32 lora_alpha=64 output_dir=./lora_experiment_1
"""
QLoRA:量化LoRA
import torch
from torchtune.models.llama2 import qlora_llama2_7b
from torchtune.trainers import LoRAFinetuneTrainer
# 初始化QLoRA LLaMA-2-7B模型
qlora_model = qlora_llama2_7b(lora_attn_modules=["q_proj", "v_proj"])
# 准备QLoRA微调的Trainer
trainer = LoRAFinetuneTrainer(
model=qlora_model,
dataset_path="path_to_dataset",
output_dir="output_dir",
batch_size=2,
max_steps=1000,
logging_steps=100
)
# 开始微调
trainer.train()
# 保存微调后的模型
trainer.save_model("path_to_saved_model")
我们使用qlora_llama2_7b函数初始化了一个QLoRA LLaMA-2-7B模型,该模型的权重是4-bit量化的。 我们使用LoRAFinetuneTrainer准备了一个专门用于QLoRA微调的Trainer,设置了数据集路径、输出路径、批大小等参数。 在微调过程中,QLoRA模型的权重始终保持量化状态,只有LoRA适配器的参数被更新。这进一步减少了微调过程中的内存消耗。 微调完成后,我们使用save_model函数将微调后的模型保存到指定路径。保存的模型中包含了量化的预训练权重和LoRA适配器参数。在实际使用时,我们需要将量化的权重解量化为全精度格式。
总结
关于我们
数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。
新浪微博:@数据派THU
微信视频号:数据派THU
今日头条:数据派THU