深入理解LLaMA, Alpaca, ColossalChat 系列模型

这篇具有很好参考价值的文章主要介绍了深入理解LLaMA, Alpaca, ColossalChat 系列模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

知乎:紫气东来
https://zhuanlan.zhihu.com/p/618695885

一、从 LLaMA 到 Alpaca:大模型的小训练

1.1 LLaMA 概要与实践

LLaMA(Large Language Model Meta AI) 是由 Meta AI 发布了一款全新的大型语言模型,共有7B、13B、33B、65B 四种版本,其模型参数如下表所示:

深入理解LLaMA, Alpaca, ColossalChat 系列模型

与原始的 transformer Decoder 相比,LLaMA主要有以下改进:

  • 预归一化(Pre-normalization)[GPT3]
    为了提高训练的稳定性,LLaMA对每个transformer子层的输入进行归一化,而不是对输出进行归一化。同时使用RMSNorm归一化函数。

  • SwiGLU激活函数[PaLM]
    LLaMA用SwiGLU激活函数取代ReLU非线性,以提高性能。SwiGLU激活函数的实现如下:

其中 ,,具体实现参考这里[1]

  • 旋转嵌入(Rotary pos)[GPTNeo]

LLaMA删除了绝对位置嵌入,取而代之的是在网络的每一层添加旋转位置嵌入(RoPE),RoPE的实现参见这里[2]。当前 HuggingFace 已经实现了 LLaMA 模型 代码,可通过以下方式直接调用:

from transformers import LlamaForCausalLM
USE_8BIT = True # use 8-bit quantization; otherwise, use fp16
model = LlamaForCausalLM.from_pretrained(
            "pretrained/path",
            load_in_8bit=USE_8BIT,
            torch_dtype=torch.float16,
            device_map="auto",
        )
if not USE_8BIT:
    model.half()  # use fp16
model.eval()

1.2 Alpaca 如何使用小成本训练大模型

如下图所示,Stanford的研究者使用 52K 个 intruction-following examples 来微调 LLaMA 7B 模型,从而生成了 Alpaca[3] 7B。

Alpaca 团队使用 self-instruct[4] 提供的 175 个 prompts,调用 OpenAI 的text-davinci-003模型,利用 OpenAI 的模型来产生有价值的 instructions 。

深入理解LLaMA, Alpaca, ColossalChat 系列模型

将 OpenAI 性能完备的模型作为 Teacher,来指导参数更少的 Alpaca 模型进行训练,大幅降低了训练成本 。其中调用 OpenAI API 的成本不到 500 美元,另外微调 7B 参数的 LLaMA 模型,使用云服务商提供的 8 块 80GB A100 显卡,训练 3 小时,消费不到 100 美元,因此整体成本是小于 600 美元。

二、Alpaca 的优化、训练及应用

2.1 alpaca-lora 的优化

alpace-lora[5] 是在alpaca的基础上把训练方式改成用lora训练,仅需要在消费级的GPU上经过数小时的训练,就可以达到和alpaca差不多的效果。

LoRA(Low-Rank Adaptation) 技术

LoRA 的思想很简单,即在原始 Pretrained Weights 旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的 intrinsic rank 。训练的时候固定 Pretrained Weights 的参数,只训练降维矩阵 与升维矩阵 。而模型的输入输出维度不变,输出时将 与 Pretrained Weights 的参数叠加。用随机高斯分布初始化 ,用0矩阵初始化 ,保证训练的开始此旁路矩阵依然是 0 矩阵。

具体来看,假设预训练的矩阵为,它的更新可表示为:

其中秩。

深入理解LLaMA, Alpaca, ColossalChat 系列模型

LoRA与Transformer的结合也很简单,仅在QKV attention的计算中增加一个旁路,而不动MLP模块。基于大模型的内在低秩特性,增加旁路矩阵来模拟全模型参数微调,LoRA通过简单有效的方案来达成轻量微调的目的,可以将现在的各种大模型通过轻量微调变成各个不同领域的专业模型。

2.2 PEFT(Parameter-Efficient Fine-Tuning) 方法

随着模型变得越来越大,在消费级硬件上对模型进行全部参数的微调变得不可行。此外,为每个下游任务独立存储和部署微调模型变得非常昂贵,因为微调模型与原始预训练模型的大小相同。PEFT 方法旨在解决这两个问题,PEFT 方法仅微调少量 (额外) 模型参数,同时冻结预训练 LLM 的大部分参数,从而大大降低了计算和存储成本。

HuggingFace 开源的一个高效微调大模型的 PEFT 库,目前包含LoRA,Prefix Tuning,Prompt Tuning,P-Tuning 四种算法,下面简要介绍后三种:

  • Prefix Tuning
    Prefix Tuning 算法是根据 下游任务 "前缀指令文本" 的所有层的embeding表示,学习到的前缀指令文本向量可以挖掘大模型的潜力去引导模型完成特定任务。

深入理解LLaMA, Alpaca, ColossalChat 系列模型
  • P-Tuning
    P-Tuning 算法和 Prefix Tuning 的想法很相似,想通过微调"指令文本",让指令文本去挖掘大模型的潜力去完成特定的任务。但是 P-Tuning 只学习 "指令文本" 输入层embeding的的表示。为了增强 "指令文本"的连续性,采用了一个 MLP(LSTM) 的结果去encoding "指令文本"。从微调参数量来看只有 0.65% 比 Prefix Tuning 和 LoRA 这些在所有层都增加参数的方法要少。

深入理解LLaMA, Alpaca, ColossalChat 系列模型
  • Prompt Tuning
    Prompt Tuning 算法和 P-Tuning 很像,且更简单,就是是根据 下游任务 "指令文本" 输入层embeding的的表示。Prompt Tuning 没有增加任何的层,直接使用微调指令文本(prompt) 的embeding向量。

深入理解LLaMA, Alpaca, ColossalChat 系列模型

2.3 使用 PEFT 训练 alpaca-lora

以下仅说明过程,完整代码见这里[6]

step 1. 模块的加载及初始化
import torch
import transformers
from datasets import load_dataset
from peft import LoraConfig, get_peft_model, get_peft_model_state_dict, prepare_model_for_int8_training, set_peft_model_state_dict,
from transformers import LlamaForCausalLM, LlamaTokenizer 

model = LlamaForCausalLM.from_pretrained(base_model, load_in_8bit=True, torch_dtype=torch.float16, device_map=device_map,)
tokenizer = LlamaTokenizer.from_pretrained(base_model)
model = prepare_model_for_int8_training(model)

config = LoraConfig(
    r=lora_r,
    lora_alpha=lora_alpha,
    target_modules=lora_target_modules,
    lora_dropout=lora_dropout,
    bias="none",
    task_type="CAUSAL_LM",
)
model = get_peft_model(model, config)
step 2. 准备data 和 trainer 并进行训练
data = load_dataset(data_path)
trainer = transformers.Trainer(
    model=model,
    train_dataset=train_data,
    eval_dataset=val_data,
    args=transformers.TrainingArguments(
        per_device_train_batch_size=micro_batch_size,
        gradient_accumulation_steps=gradient_accumulation_steps,
        warmup_steps=100,
        num_train_epochs=num_epochs,
        learning_rate=learning_rate,
        fp16=True,
        logging_steps=10,
        optim="adamw_torch",
        evaluation_strategy="steps" if val_set_size > 0 else "no",
        save_strategy="steps",
        eval_steps=200 if val_set_size > 0 else None,
        save_steps=200,
        output_dir=output_dir,
        save_total_limit=3,
        load_best_model_at_end=True if val_set_size > 0 else False,
        ddp_find_unused_parameters=False if ddp else None,
        group_by_length=group_by_length,
        report_to="wandb" if use_wandb else None,
        run_name=wandb_run_name if use_wandb else None,
    ),
    data_collator=transformers.DataCollatorForSeq2Seq(
        tokenizer, pad_to_multiple_of=8, return_tensors="pt", padding=True
    ),
)

trainer.train(resume_from_checkpoint=resume_from_checkpoint)

2.4 更多类似模型

Baize (白泽)

  • 论文:https://arxiv.org/pdf/2304.01196.pdf

  • demo: Baize Lora 7B - a Hugging Face Space by project-baize

  • repo: https://github.com/project-baize/baize

Luotuo (骆驼,Chinese)

  • repo: https://github.com/LC1332/Luotuo-Chinese-LLM

Koala (考拉)

  • blog: Koala: A Dialogue Model for Academic Research

  • demo: FastChat

  • repo: https://github.com/young-geng/EasyLM

三、ColossalChat:深入体验 RLHF 在大模型中的功能

ColossalChat[7] 是第一个基于LLaMA预训练模型开源完整RLHF pipline实现,包括有监督数据收集、有监督微调、奖励模型训练和强化学习微调。只需要不到100亿个参数,就可以在大型语言模型的基础上通过RLHF微调达到中英文双语水平,达到与ChatGPT和GPT-3.5相当的效果,并可以进行Demo测试。关于RLHF的原理,可参考

https://zhuanlan.zhihu.com/p/613315873

ColossalChat使用InstructionWild[8]双语数据集,包含约52K的英语和52K的汉语问答,数据集通过OpenAI API接口获得。该数据集适用于微调和RLHF训练。通过提供高质量的数据,ColossalChat可以实现更好的对话互动,也可以支持中文。

深入理解LLaMA, Alpaca, ColossalChat 系列模型
数据集的获取过程

3.1 监督指令微调

使用前面提到的数据集执行有监督指令微调,以微调模型。运行examples/train_sft.sh来启动有监督的指令微调。

torchrun --standalone --nproc_per_node=4 train_sft.py \
    --pretrain "/path/to/LLaMa-7B/" \
    --model 'llama' \
    --strategy colossalai_zero2 \
    --log_interval 10 \
    --save_path  /path/to/Coati-7B \
    --dataset /path/to/data.json \
    --batch_size 4 \
    --accimulation_steps 8 \
    --lr 2e-5 \
    --max_datasets_size 512 \
    --max_epochs 1 \

3.2 训练奖励模型

训练奖励模型,通过手动对同一提示的不同输出进行排序来分配相应的分数,然后有监督奖励模型的训练。

运行examples/train_rm.sh开始奖励模型训练。

torchrun --standalone --nproc_per_node=4 train_reward_model.py
    --pretrain "/path/to/LLaMa-7B/" \
    --model 'llama' \
    --strategy colossalai_zero2 \
    --loss_fn 'log_exp'\
    --save_path 'rmstatic.pt' \

3.3 人类反馈强化学习

在第一阶段的监督微调模型和第二阶段的奖励模型的基础上,使用强化学习算法进一步训练大型语言模型。该阶段是RLHF训练的核心部分,在强化学习中使用近端策略优化(PPO)算法来引入奖励信号,并生成更符合人类偏好的内容。

深入理解LLaMA, Alpaca, ColossalChat 系列模型

运行examples/train_prompts.sh,开始使用人类反馈训练PPO。

torchrun --standalone --nproc_per_node=4 train_prompts.py \
         --pretrain "/path/to/LLaMa-7B/" \
         --model 'llama' \
         --strategy colossalai_zero2 \
         --prompt_path /path/to/your/prompt_dataset \
         --pretrain_dataset /path/to/your/pretrain_dataset \
         --rm_pretrain /your/pretrain/rm/defination \
         --rm_path /your/rm/model/path

进NLP群—>加入NLP交流群(备注nips/emnlp/nlpcc进入对应投稿群)

持续发布自然语言处理NLP每日优质论文解读、相关一手资料、AI算法岗位等最新信息。

加入星球,你将获得:

1. 每日更新3-5篇最新最优质的的论文速读

2. 最新入门和进阶学习资料

4. 每日1-3个NLP、搜广推、CV等AI岗位招聘信息

参考资料

[1]

SiLUActivation: "https://github.com/huggingface/transformers/blob/main/src/transformers/activations.py#L140"

[2]

RoPE: "https://nn.labml.ai/transformers/rope/index.html"

[3]

Alpaca: "https://github.com/tatsu-lab/stanford_alpaca"

[4]

self-instruct: "https://github.com/yizhongw/self-instruct"

[5]

alpace-lora: "https://github.com/tloen/alpaca-lora"

[6]

alpaca-lora: "https://github.com/tloen/alpaca-lora/blob/main/finetune.py"

[7]

ColossalChat: "https://github.com/hpcaitech/ColossalAI/tree/main/applications/Chat"

[8]

InstructionWild: "https://github.com/XueFuzhao/InstructionWild/tree/main/data"文章来源地址https://www.toymoban.com/news/detail-417037.html

到了这里,关于深入理解LLaMA, Alpaca, ColossalChat 系列模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【NLP】Llama & Alpaca大模型

      🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】 ​​  🖍foreword

    2024年02月09日
    浏览(32)
  • LLM:LLaMA模型和微调的Alpaca模型

    简单了解[LeCun狂赞:600刀GPT-3.5平替! 斯坦福70亿参数「羊驼」爆火,LLaMA杀疯了] 论文原文:https://arxiv.org/abs/2302.13971v1 模型就是用的transformer的decoder,模型设计的不同点在于: 1 Position Embedding :RoPE旋转位置编码rotary-embedding 删除了绝对位置嵌入,而是在网络的每一层添加了

    2024年02月10日
    浏览(36)
  • Llama 及 中文Alpaca模型部署测试

    环境: Xeon  E5-2680v4 16C 40G RAM WinServer 2019 Standard Edition Python 3.10 依赖库: accelerate==0.18.0 anyio==3.5.0 argon2-cffi==21.3.0 argon2-cffi-bindings==21.2.0 asttokens==2.0.5 attrs==22.1.0 Babel==2.11.0 backcall==0.2.0 beautifulsoup4==4.12.2 bleach==4.1.0 brotlipy==0.7.0 certifi==2022.12.7 cffi==1.15.1 chardet==5.1.0 charset-normalizer==3.1.

    2024年02月09日
    浏览(42)
  • 大模型入门(一)—— LLaMa/Alpaca/Vicuna

    LLaMa模型是Meta开源的大模型,模型参数从7B到65B不等,LLaMa-7B在大多数基准测试上超过了GPT3-173B,而LLaMa-65B和Chinchilla-70B、PaLM-540B相比也极具竞争力。相比于ChatGPT或者GPT4来说,LLaMa可能效果上还有差距,但相比Closed AI,至少LLaMa论文和模型都开源出来了,目前hugging face已集成了

    2024年02月09日
    浏览(77)
  • LLaMA模型微调版本:斯坦福 Alpaca 详解

    项目代码:https://github.com/tatsu-lab/stanford_alpaca 博客介绍:https://crfm.stanford.edu/2023/03/13/alpaca.html Alpaca 是 LLaMA-7B 的微调版本,使用Self-instruct[2]方式借用text-davinct-003构建了52K的数据,同时在其构建策略上做了一些修改。 性能上作者对Alpaca进行了评估,与openai的text-davinct-003模型在

    2024年02月16日
    浏览(29)
  • [NLP]使用Alpaca-Lora基于llama模型进行微调教程

    Stanford Alpaca 是在 LLaMA 整个模型上微调,即对预训练模型中的所有参数都进行微调(full fine-tuning)。但该方法对于硬件成本要求仍然偏高且训练低效。 [NLP]理解大型语言模型高效微调(PEFT) 因此, Alpaca-Lora 则是利用 Lora 技术,在冻结原模型 LLaMA 参数的情况下,通过往模型中加

    2024年02月15日
    浏览(42)
  • 中文大模型 Chinese-LLaMA-Alpaca-2 开源且可以商用

    “  Meta 开源 LLAMA2 后,国内出现了不少以此为基座模型训练的中文模型,这次我们来看看其中一个不错的中文模型:Chinese-LLaMA-Alpaca-2 。 ” 01 — 目前在开源大模型中,比较有名的是Meta的LLAMA模型系列和清华的ChatGLM模型。 特别是在中文领域上,ChatGLM模型经过中文问答和对

    2024年02月06日
    浏览(35)
  • 大模型微调踩坑记录 - 基于Alpaca-LLaMa+Lora

    为了使用开放权重的LLM(大语言模型),基于自己的训练集,微调模型,会涉及到如下一些技术要点: 配置运行环境 下载、加载基础模型 收集语料、微调训练 检验训练效果 在实施过程中,遇到不少困难,因此写下这篇文档,做为记录。 (1) 问题描述 在huggingface的模型库中,大

    2024年02月09日
    浏览(33)
  • 【个人笔记本】本地化部署详细流程 LLaMA中文模型:Chinese-LLaMA-Alpaca-2

    不推荐小白,环境配置比较复杂 下载原始模型:Chinese-LLaMA-Alpaca-2 linux部署llamacpp环境 使用llamacpp将Chinese-LLaMA-Alpaca-2模型转换为gguf模型 windows部署Text generation web UI 环境 使用Text generation web UI 加载模型并进行对话 笔记本环境: 操作系统:win11 CPU:AMD R7535HS GPU:笔记本4060显卡

    2024年02月08日
    浏览(46)
  • 【类ChatGPT】中文LLaMA-2、Alpaca-2 二代羊驼大模型体验

    Meta发布的一代LLaMA已经掀起了一股开源大模型热潮,也有很多相关工作不断涌现。最近Meta全新发布了Llama-2,效果更上一层楼。而且最重要的是模型可以相对随意分发了,不像一代一样,meta不让开发者发布基于llama模型训练出来的权重(原版当然更不可以)。 既然有了Llama-

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包