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

1.1 LLaMA 概要与实践

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

与原始的 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 。

将 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 矩阵。

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

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表示,学习到的前缀指令文本向量可以挖掘大模型的潜力去引导模型完成特定任务。

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

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

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可以实现更好的对话互动,也可以支持中文。

数据集的获取过程

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)算法来引入奖励信号,并生成更符合人类偏好的内容。

运行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岗位招聘信息

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

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

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

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

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

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

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

InstructionWild: "https://github.com/XueFuzhao/InstructionWild/tree/main/data"

知乎:紫气东来https://zhuanlan.zhihu.com/p/618695885一、从 LLaMA 到 Alpaca:大模型的小训练1.1 LLaMA 概要与实践LLaMA(Large Language Model Meta AI) 是由 Meta AI 发布了一款全新的大型语言模型,共有7B、13B、33B、65B 四种版本,其模型参数如下表所示:与原始的 transformer De...
科研论文写作中,生成一个有吸引力的、准确的论文标题需要综合考虑多个因素,这是论文作者面临的一个重要挑战。生成一个论文标题的难点有: 1. 简洁但准确:一个好的论文标题应该简洁、精炼,但同时又能准确地反映出论文研究的重点和核心所在,这对于作者来说是一个巨大的挑战。 2. 独特但易于理解:论文题目应该是独特的,能够吸引读者的兴趣,但同时也要易于理解,避免过于笼统或过于繁琐深奥的词汇。 3. 体现研究的贡献:好的论文题目应该能够明确体现出研究的贡献,突出研究创新点,使读者对该研究的贡献显而易见。 4. 避免使用口头禅:一些常用的词汇、短语等可能被过多的使用,这样会使得论文的题目显得陈旧、无创新性,甚至会让人感到毫无意义。
多模态中文 LLaMA & Al pac a大语言 模型 .zip 基于Chinese- LLaMA - Al pac a的多模态 模型 Visu al CLA,具备多模态指理解和对话能力 提供了推理代码和基于Gradio/Text-Generation-WebUI的部署脚本 展示了 模型 在多模态指令理解任务上的效果,并开放了翻译的测试集 目前开源版本: Visu al CLA-7B-v0.1(测试版)
本文主要介绍了AttributeError: module transformers has no attribute LLaMA Tokenizer解决方案,希望能对使用 LLaMA 模型 的同学有所帮助。 1. 问题描述 2. 解决方案
部署和精调 llama 模型 通常涉及以下几个步骤: 1. 部署 模型 :首先,需要将 llama 模型 转换为可以在实际环境中使用的形式。这可能包括将 模型 转换为可执行文件、将 模型 封装为服务或API、创建用于 模型 推理的服务器或服务容器等。这样,其他系统或应用程序就能够与 模型 进行交互。 2. 数据准备:为了能够对 llama 模型 进行有效的推理,必须准备好相应的数据。这包括选择和准备用于训练和测试 模型 的数据集。数据集应该具有多样性和代表性,以便 模型 能够在不同情况下产生准确的预测。 3. 超参数调整:在 llama 模型 中,有一些超参数需要进行调整,以优化 模型 的性能。通过在训练过程中尝试不同的超参数组合,可以找到最佳的设置。常见的超参数包括学习率、正则化参数等。通过使用交叉验证等技术,可以评估和选取性能最好的超参数。 4. 性能评估:在完成 模型 的训练和调整后,需要对其进行性能评估。可以使用测试集或交叉验证等技术来评估 模型 的准确性、精确度、召回率等指标。根据评估结果,可以对 模型 进行进一步的优化和改进。 5. 模型 优化:一旦 模型 部署并且性能良好,则可以考虑进行进一步的优化。这可能包括 模型 压缩、剪枝、量化等技术,以减少 模型 的大小和计算复杂度,从而提高 模型 在嵌入式设备或边缘环境中的效率。 总之,部署和精调 llama 模型 需要将 模型 转换为可用形式、准备数据、调整超参数、评估性能和优化 模型 。这些步骤都是为了确保 模型 能够在实际应用中产生准确且高效的预测结果。