怎么使用LoRA? 训练你自己的ChatGPT
以ChatGPT、GPT-4等为代表的大语言模型展现出了类通用人工智能的能力,受到业界广泛关注。但GPT-3有1750亿参数,为了让它能加入特定领域的知识并work,需要做微调,但是直接对GPT-3做微调,成本高且复杂。
一、什么是LoRA?
LoRA,英文全称Low-Rank Adaptation of Large Language Models,直译为大语言模型的低阶适应,是一种PEFT(参数高效性微调方法),这是微软的研究人员为了解决大语言模型微调而开发的一项技术。当然除了LoRA,参数高效性微调方法中实现最简单的方法还是Prompt tuning,固定模型前馈层参数,仅仅更新部分embedding参数即可实现低成本微调大模型,建议可从Prompt tuning开始学起。
LoRA的基本原理是冻结预训练好的模型权重参数,在冻结原模型参数的情况下,通过往模型中加入额外的网络层,并只训练这些新增的网络层参数。由于这些新增参数数量较少,这样不仅 finetune 的成本显著下降,还能获得和全模型微调类似的效果。
二、LoRA相关开源整理
2.1 HuggingFace
学习上最好的方法就是阅读文档并动手实践一下PEFT
HuggingFace开源的LoRA的实现代码:
介绍LoRa的原文地址:
Lora 参数地址:
LLaMA-7B-HF 模型地址:
2.2 Arxiv
2.3 Other
基于Alpaca-lora加上中文语料训练
基于BLOOMZ 7B,用alpaca-lora的方法,加上中文语料训练
Alpaca-Lora 地址:
Standford Alpaca 地址:
三、怎么使用LoRA?
Alpaca-Lora:训练你自己的ChatGPT
克隆仓库
git clone <https://github.com/tloen/alpaca-lora.git>
安装依赖
pip install -r requirements.txt
微调
使用通用中文语料在原版LLaMA权重的基础上进一步进行预训练。该过程又分为两个阶段:
- 第一阶段:固定模型transformer部分的参数,仅训练embedding,在尽量不干扰原模型的情况下适配新增的中文词向量。
- 第二阶段:使用LoRA技术,为模型添加LoRA权重,训练embedding的同时也更新LoRA参数。
python finetune.py
模型默认输出在“lora-alpaca”文件夹下,可以自己改这行的路径
model.save_pretrained("lora-alpaca")
训练的默认值如下所示:
batch_size: 128
micro_batch_size: 4
num_epochs: 3
learning_rate: 0.0003
cutoff_len: 256
val_set_size: 2000
lora_r: 8
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules: ['q_proj', 'v_proj']
train_on_inputs: True
group_by_length: False
wandb_project:
wandb_run_name:
wandb_watch:
wandb_log_model:
resume_from_checkpoint: False
prompt template: alpaca
使用默认参数,单卡训练完成大约需要5个小时,且对于GPU显存的消耗确实很低。
指令精调阶段使用了约200万条数据,包括中英翻译数据、pCLUE数据、Alpaca数据等。训练过程的主要超参如下:
Hyperparameters | 预训练-第一阶段 | 预训练-第二阶段 | 指令精调 |
---|---|---|---|
Batch Size | 1024 | 1024 | 512 |
Initial Learning Rate | 2e-4 | 1e-4 | 1e-4 |
Training Steps | 3K | 6K | 6K-10K |
推理
python inference.py
另外要用自己训过的模型的话注意将下面这行改成模型输出路径
LORA_WEIGHTS = "tloen/alpaca-lora-7b"
数据
原始数据在 alpaca_data.json 中,训练使用的数据默认在alpaca_data_cleaned.json中,对alpaca原始数据做了一些清洗之后的数据集,可以根据自己需要再构建新的。
将 LoRA 权重合并回基础模型
下面将 LoRA 权重合并回基础模型以导出为 HuggingFace 格式和 PyTorch state_dicts。以帮助想要在 llama.cpp 或 alpaca.cpp 等项目中运行推理的用户。
导出为 HuggingFace 格式:
修改export_hf_checkpoint.py
文件:
import os
import torch
import transformers
from peft import PeftModel
from transformers import LlamaForCausalLM, LlamaTokenizer
BASE_MODEL = os.environ.get("BASE_MODEL", None)
# TODO
LORA_MODEL = os.environ.get("LORA_MODEL", "tloen/alpaca-lora-7b")
HF_CHECKPOINT = os.environ.get("HF_CHECKPOINT", "./hf_ckpt")
assert (
BASE_MODEL
), "Please specify a value for BASE_MODEL environment variable, e.g. `export BASE_MODEL=decapoda-research/llama-7b-hf`" # noqa: E501
tokenizer = LlamaTokenizer.from_pretrained(BASE_MODEL)
base_model = LlamaForCausalLM.from_pretrained(
BASE_MODEL,
load_in_8bit=False,
torch_dtype=torch.float16,
device_map={"": "cpu"},
)
first_weight = base_model.model.layers[0].self_attn.q_proj.weight
first_weight_old = first_weight.clone()
lora_model = PeftModel.from_pretrained(
base_model,
# TODO
# "tloen/alpaca-lora-7b",
LORA_MODEL,
device_map={"": "cpu"},
torch_dtype=torch.float16,
)
...
LlamaForCausalLM.save_pretrained(
base_model, HF_CHECKPOINT , state_dict=deloreanized_sd, max_shard_size="400MB"
)
运行命令:
BASE_MODEL = pretrain/hf-llama-model/llama-7b \
LORA_MODEL = output/lora-alpaca \
HF_CHECKPOINT = output/hf_ckpt \
python export_hf_checkpoint.py
文章来源:https://zhuanlan.zhihu.com/p/620552131
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏