A-A+

怎么使用LoRA? 训练你自己的ChatGPT

2023年04月20日 15:45 汪洋大海 暂无评论 共3747字 (阅读774 views次)

以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 的成本显著下降,还能获得和全模型微调类似的效果。

蓝色模块是原模型,而橙色模块则是新增网络层,通过控制参数 r 的大小,可以有效减少新增网络层的参数。

二、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权重的基础上进一步进行预训练。该过程又分为两个阶段:

  1. 第一阶段:固定模型transformer部分的参数,仅训练embedding,在尽量不干扰原模型的情况下适配新增的中文词向量。
  2. 第二阶段:使用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

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言