0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用单卡高效微调bloom-7b1,效果惊艳

深度学习自然语言处理 来源:YeungNLP 2023-06-08 15:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在文章Firefly(流萤): 中文对话式大语言模型、中文对话式大语言模型Firefly-2b6开源,使用210万训练数据中,我们介绍了关于Firefly(流萤)模型的工作。对大模型进行全量参数微调需要大量GPU资源,所以我们通过对Bloom进行词表裁剪,在4*32G的显卡上,勉强训练起了2.6B的firefly模型。

在本文中,我们将介绍QLoRA,由华盛顿大学提出的一种高效微调大模型的方法,可在单张A100上对LLaMA-65B进行微调。在论文中,作者的实验表明使用QLoRA微调的LLaMA-65B,可达到ChatGPT性能水平的99.3%(由GPT-4进行评价),并且QLoRA的性能可以逼近全量参数微调。作者做了丰富的实验证明这一结论

6605d310-0575-11ee-8a94-dac502259ad0.png

在本文中我们将对QLoRA的基本原理进行介绍,并且在Firefly项目中进行实践。我们在bloom-7b1的基础上,使用QLoRA进行中文指令微调,获得firefly-7b1-qlora-v0.1模型,具有不错的效果,生成效果见第三章。QLoRA确实是一种高效训练、效果优秀、值得尝试和深入研究的方法

论文地址:

https://arxiv.org/pdf/2305.14314.pdf

项目代码:

https://github.com/yangjianxin1/Firefly

模型权重:

https://huggingface.co/YeungNLP/firefly-7b1-qlora-v0.1

01

QLoRA简介

本章节主要对LoRA与QLoRA进行介绍,如读者已了解本章节的内容,可直接跳过,阅读项目实践部分。

LoRA简介

在介绍QLoRA之前,简单回顾一下LoRA。LoRA的本质是在原模型的基础上插入若干新的参数,称之为adapter。在训练时,冻结原始模型的参数,只更新adapter的参数。对于不同的基座模型,adapter的参数量一般为几百万~几千万。

6611c670-0575-11ee-8a94-dac502259ad0.png

LoRA的优势在于能够使用较少的GPU资源,在下游任务中对大模型进行微调。在开源社区中,开发者们使用LoRA对Stable Diffusion进行微调,取得了非常不错的效果。随着ChatGPT的火爆,也涌现出了许多使用LoRA对LLM进行指令微调的工作。

此前,我们也实践过使用LoRA对LLM进行指令微调,虽然未进行定量分析,但主观感受LoRA比全量微调还是有一定的差距。实践下来,我们发现LoRA微调中存在以下三个痛点:

  1. 参数空间小:LoRA中参与训练的参数量较少,解空间较小,效果相比全量微调有一定的差距。

  2. 微调大模型成本高:对于上百亿参数量的模型,LoRA微调的成本还是很高。

  3. 精度损失:针对第二点,可以采用int8或int4量化,进一步对模型基座的参数进行压缩。但是又会引发精度损失的问题,降低模型性能。

QLoRA简介

接下来便引入今天的主角QLoRA。整篇论文读下来,我们认为QLoRA中比较重要的几个做法如下:

  1. 4-bit NormalFloat:提出一种理论最优的4-bit的量化数据类型,优于当前普遍使用的FP4与Int4。

  2. Double Quantization:相比于当前的模型量化方法,更加节省显存空间。每个参数平均节省0.37bit,对于65B的LLaMA模型,大约能节省3GB显存空间。

  3. Paged Optimizers:使用NVIDIA统一内存来避免在处理小批量的长序列时出现的梯度检查点内存峰值。

  4. 增加Adapter4-bit的NormalFloat与Double Quantization,节省了很多空间,但带来了性能损失,作者通过插入更多adapter来弥补这种性能损失。在LoRA中,一般会选择在query和value的全连接层处插入adapter。而QLoRA则在所有全连接层处都插入了adapter,增加了训练参数,弥补精度带来的性能损失

通过上述优化,只需要41G显存即可微调LLaMA-65B模型。甚至可以直接使用一张1080Ti来微调LLaMA-13B,手中的旧卡又可以继续发挥余热了

66194030-0575-11ee-8a94-dac502259ad0.png

作者使用GPT4对各个模型进行评价,结果显示,使用QLoRA在OASST1数据集上微调得到的Guanaco-65B模型达到了ChatGPT的99.3%的性能。

66251cd4-0575-11ee-8a94-dac502259ad0.png

作者进一步采用了Elo等级分制度对各个模型进行评价,裁判为人类或者GPT-4。结果显示Guanaco-65B和Guanaco-33B均优于ChatGPT-3.5。

66320e80-0575-11ee-8a94-dac502259ad0.png

实验分析

QLoRA方法是否有用,其与全量参数微调的差距有多大?作者使用LLaMA-7B和Alpaca数据集进行了实验。下图结果表明,通过插入更多的adapter,能够弥补QLoRA量化带来的性能损失,复现全量参数微调的效果。

6645828a-0575-11ee-8a94-dac502259ad0.jpg

除此之外,作者还将QLoRA应用于RoBERTA和T5,评测其在GLUE和Super-NaturalInstructions数据集上的表现。从下表中可以看到,QLoRA+NF4+DQ基本上复现了BF16全量微调的实验指标。

下表中LoRA+BF16基本上也复现了BF16全量微调的实验指标,如果作者能加上LoRA+FP4或者LoRA+int4的实验结果,则可以更清晰地展现LoRA与QLoRA的性能差异。

664f34c4-0575-11ee-8a94-dac502259ad0.png

在指令微调阶段,数据质量和数据数量,哪一个更重要?作者使用三种不同的训练集,每个数据集分别使用5万、10万、15万的数据量进行训练。对于下表,纵向来看,随着数据量的增加,指标并没有明显的提升,说明数据量不是关键因素。横向来看,对于不同的数据集,指标差距甚大,说明数据质量更关键。

665dfd60-0575-11ee-8a94-dac502259ad0.png

值得一提的是,在论文中,作者仅使用了9千多条OASST1的数据训练得到Guanaco-65B,这进一步验证了,数据质量远比数量重要,模型的知识来源于预训练阶段。

模型的知识来源于预训练阶段,指令微调目的是和人类指令进行对齐在指令微调阶段,数据的质量与丰富度,远比数量更重要。这是最近一段时间,开源社区以及各个论文强调的一个结论,在我们的实践中也深有体会。

02

项目实践

在本项目中,我们使用bloom-7b1作为基座模型。数据集为moss-003-sft-no-tools,这是由MOSS项目开源的中文指令微调数据集,我们随机抽取了29万条作为训练数据,训练得到firefly-7b1-qlora-v0.1。

训练时,我们将多轮对话拼接成如下格式,然后进行tokenize。

<s>input1s>target1s>input2s>target2s>...

我们在一张32G显卡上使用QLoRA进行训练,在所有全连接层处都插入adapter,最终参与训练的参数量超过1亿,相当于一个bert-base的参数量。训练时只计算target部分的损失函

训练超参数如下所示:

max length 1024
lr_scheduler_type cosine
batch size 16
lr 2e-4
warmup step 3000
optimizer paged_adamw_32bit
training step 18万

模型的训练损失的变化趋势如下图所示:

66719d02-0575-11ee-8a94-dac502259ad0.png

firefly-7b1-qlora-v0.1的使用方式如下:

from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer, LlamaTokenizer, BitsAndBytesConfig
import torch


model_name = 'bigscience/bloom-7b1'
adapter_name = 'YeungNLP/firefly-7b1-qlora-v0.1'
device = 'cuda'
input_pattern = '{}'


model = AutoModelForCausalLM.from_pretrained(
    model_name,
    low_cpu_mem_usage=True,
    torch_dtype=torch.float16,
    device_map='auto'
)
model = PeftModel.from_pretrained(model, adapter_name)
model.eval()
model = model.to(device)
tokenizer = AutoTokenizer.from_pretrained(model_name)


text = input('User:')
while True:
    text = input_pattern.format(text)
    input_ids = tokenizer(text, return_tensors="pt").input_ids
    input_ids = input_ids.to(device)
    outputs = model.generate(input_ids=input_ids, max_new_tokens=250, do_sample=True, top_p=0.75, temperature=0.35,
                             repetition_penalty=1.2, eos_token_id=tokenizer.eos_token_id)
    rets = tokenizer.batch_decode(outputs)
    output = rets[0].strip().replace(text, "").replace('', "")
    print("Firefly:{}".format(output))
    text = input('User:')

03

生成效果

下面的样例均firefly-7b1-qlora-v0.1模型所生成,未经修改,仅供参考。

多轮对话

对话示例1:

667e0056-0575-11ee-8a94-dac502259ad0.png

对话示例2:

6685fe96-0575-11ee-8a94-dac502259ad0.png

邮件生成

6692f588-0575-11ee-8a94-dac502259ad0.png

669e3b14-0575-11ee-8a94-dac502259ad0.png

66ad37c2-0575-11ee-8a94-dac502259ad0.png

商品文案生成

66ba38be-0575-11ee-8a94-dac502259ad0.png

66c1ebf4-0575-11ee-8a94-dac502259ad0.png

医疗问答

66c9ee30-0575-11ee-8a94-dac502259ad0.png

66d44b82-0575-11ee-8a94-dac502259ad0.png

创意性写作

66e73832-0575-11ee-8a94-dac502259ad0.png

66fbeb9c-0575-11ee-8a94-dac502259ad0.png

670acae0-0575-11ee-8a94-dac502259ad0.png

67168ce0-0575-11ee-8a94-dac502259ad0.png

672414f0-0575-11ee-8a94-dac502259ad0.png

其他例子

672ec27e-0575-11ee-8a94-dac502259ad0.png

6738be0a-0575-11ee-8a94-dac502259ad0.png

67452e10-0575-11ee-8a94-dac502259ad0.png

67578ea2-0575-11ee-8a94-dac502259ad0.png

04

结语

在本文中,我们介绍了QLoRA的基本原理,以及论文中一些比较重要的实验结论。并且使用QLoRA对bloom-7b1模型进行中文指令微调,获得了非常不错的效果。

firefly-7b1-qlora-v0.1的生成效果来看,虽然没有做定量的评测(对LLM做评测确实比较困难),但就生成效果来看,丝毫不逊色于全量微调的firefly-2b6-v2。

一些碎碎念:

  1. 论文中表明QLoRA能够媲美全量参数微调的效果,虽然可能需要更丰富、多角度的实验进行验证,但如果【增大基座模型的参数量+QLoRA】能够优于【全量微调较小的模型】,也是非常有意义的。

  2. 对基座模型进行量化压缩,通过增加adapter来弥补量化导致性能损失,是一个非常不错的idea,论文中的实验也证实了这一点。并且从我们的实践效果看来,确实惊艳,效果远胜LoRA。

  3. 最后,如果你手边的训练资源不足,QLoRA非常值得一试。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    28

    文章

    5099

    浏览量

    134453
  • 开源
    +关注

    关注

    3

    文章

    4031

    浏览量

    45566
  • 语言模型
    +关注

    关注

    0

    文章

    570

    浏览量

    11254

原文标题:QLoRA实战 | 使用单卡高效微调bloom-7b1,效果惊艳

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Vishay Sfernice TS7密封型表面贴装微调电位器技术解析

    Vishay/Sfernice TS7密封式单圈1/4”方形金属陶瓷微调电位器设计用于表面贴装应用,具有6.7mm x 7mm x 5mm的容积效率以及高性能和稳定性。这些TS
    的头像 发表于 11-12 10:48 305次阅读
    Vishay Sfernice TS<b class='flag-5'>7</b>密封型表面贴装<b class='flag-5'>微调</b>电位器技术解析

    ‌TPS7B4258-Q1 汽车级电压跟踪LDO稳压器技术文档总结

    TPS7B4258-Q1 是一款单片、集成、低压差 (LDO) 电压跟踪器。该器件采用 8 引脚 HSOIC 封装。TPS7B4258-Q1 旨在通过线束可靠地为非车载传感器供电,即使在恶劣的汽车
    的头像 发表于 09-25 10:29 410次阅读
    ‌TPS<b class='flag-5'>7B4258-Q1</b> 汽车级电压跟踪LDO稳压器技术文档总结

    TPS7B4255/TPS7B4255-Q1 LDO稳压器技术解析与应用指南

    Texas Instruments TPS7B4255/TPS7B4255-Q1低压差 (LDO) 稳压器具有高跟踪精度以及出色的负载和瞬态线路响应。该LDO稳压器具有集成保护特性,例如反向极性
    的头像 发表于 08-29 14:41 605次阅读
    TPS<b class='flag-5'>7B</b>4255/TPS<b class='flag-5'>7B4255-Q1</b> LDO稳压器技术解析与应用指南

    TPS7B4255EVM-062评估模块技术解析与应用指南

    Texas Instruments TPS7B4255EVM-062评估模块支持用户评估TPS7B4255-Q1线性稳压器,用于电路应用。TI TPS7B4255EVM-062评估模块包括
    的头像 发表于 08-13 14:32 694次阅读
    TPS<b class='flag-5'>7B</b>4255EVM-062评估模块技术解析与应用指南

    带增益的 RX 分集 FEM(B26、B8、B20、B1/4、B3 和 B7) skyworksinc

    电子发烧友网为你提供()带增益的 RX 分集 FEM(B26、B8、B20、B1/4、B3 和 B7
    发表于 06-27 18:31
    带增益的 RX 分集 FEM(<b class='flag-5'>B</b>26、<b class='flag-5'>B</b>8、<b class='flag-5'>B</b>20、<b class='flag-5'>B1</b>/4、<b class='flag-5'>B</b>3 和 <b class='flag-5'>B7</b>) skyworksinc

    明晚开播 |数据智能系列讲座第7期:面向高泛化能力的视觉感知系统空间建模与微调学习

    鹭岛论坛数据智能系列讲座第7期「面向高泛化能力的视觉感知系统空间建模与微调学习」明晚8点精彩开播期待与您云相聚,共襄学术盛宴!|直播信息报告题目面向高泛化能力的视觉感知系统空间建模与微调学习报告简介
    的头像 发表于 06-24 08:01 832次阅读
    明晚开播 |数据智能系列讲座第<b class='flag-5'>7</b>期:面向高泛化能力的视觉感知系统空间建模与<b class='flag-5'>微调</b>学习

    具有载波聚合的 RX 分集 FEM(B26、B8、B12/13、B2/25、B4 和 B7) skyworksinc

    电子发烧友网为你提供()具有载波聚合的 RX 分集 FEM(B26、B8、B12/13、B2/25、B4 和
    发表于 06-19 18:35
    具有载波聚合的 RX 分集 FEM(<b class='flag-5'>B</b>26、<b class='flag-5'>B</b>8、<b class='flag-5'>B</b>12/13、<b class='flag-5'>B</b>2/25、<b class='flag-5'>B</b>4 和 <b class='flag-5'>B7</b>) skyworksinc

    带增益的 RX 分集 FEM(B3、B39、B1B40、B41 和 B7) skyworksinc

    电子发烧友网为你提供()带增益的 RX 分集 FEM(B3、B39、B1B40、B41 和 B7
    发表于 06-19 18:30
    带增益的 RX 分集 FEM(<b class='flag-5'>B</b>3、<b class='flag-5'>B</b>39、<b class='flag-5'>B1</b>、<b class='flag-5'>B</b>40、<b class='flag-5'>B</b>41 和 <b class='flag-5'>B7</b>) skyworksinc

    中频 LNA 前端模块(B25、B3、B66、B7B41B) skyworksinc

    电子发烧友网为你提供()中频 LNA 前端模块(B25、B3、B66、B7B41B)相关产品参数、数据手册,更有中频 LNA 前端模块
    发表于 06-17 18:32
    中频 LNA 前端模块(<b class='flag-5'>B</b>25、<b class='flag-5'>B</b>3、<b class='flag-5'>B</b>66、<b class='flag-5'>B7</b> 和 <b class='flag-5'>B41B</b>) skyworksinc

    在阿里云PAI上快速部署NVIDIA Cosmos Reason-1模型

    NVIDIA 近期发布了 Cosmos Reason-17B 和 56B 两款多模态大语言模型 (MLLM),它们经过了“物理 AI 监督微调”和“物理 AI 强化学习”两个阶段
    的头像 发表于 06-04 13:43 685次阅读

    直播预约 |数据智能系列讲座第7期:面向高泛化能力的视觉感知系统空间建模与微调学习

    鹭岛论坛数据智能系列讲座第7期「面向高泛化能力的视觉感知系统空间建模与微调学习」6月25日(周三)20:00精彩开播期待与您云相聚,共襄学术盛宴!|直播信息报告题目面向高泛化能力的视觉感知系统空间
    的头像 发表于 05-29 10:04 467次阅读
    直播预约 |数据智能系列讲座第<b class='flag-5'>7</b>期:面向高泛化能力的视觉感知系统空间建模与<b class='flag-5'>微调</b>学习

    Sky5® NR MB/HB LNA 前端模块(B3、B39、B2/25、B34、B1B66、B40、B30、B41 和 B7) skyworksinc

    电子发烧友网为你提供()Sky5® NR MB/HB LNA 前端模块(B3、B39、B2/25、B34、B1
    发表于 05-07 18:35
    Sky5® NR MB/HB LNA 前端模块(<b class='flag-5'>B</b>3、<b class='flag-5'>B</b>39、<b class='flag-5'>B</b>2/25、<b class='flag-5'>B</b>34、<b class='flag-5'>B1</b>、<b class='flag-5'>B</b>66、<b class='flag-5'>B</b>40、<b class='flag-5'>B</b>30、<b class='flag-5'>B</b>41 和 <b class='flag-5'>B7</b>) skyworksinc

    具有载波聚合的 RX 分集 FEM(B26、B8、B20、B1/4、B3 和 B7) skyworksinc

    电子发烧友网为你提供()具有载波聚合的 RX 分集 FEM(B26、B8、B20、B1/4、B3 和 B
    发表于 04-11 15:26
    具有载波聚合的 RX 分集 FEM(<b class='flag-5'>B</b>26、<b class='flag-5'>B</b>8、<b class='flag-5'>B</b>20、<b class='flag-5'>B1</b>/4、<b class='flag-5'>B</b>3 和 <b class='flag-5'>B7</b>) skyworksinc

    沐曦加速DeepSeek满血版单卡C500异构推理

    近日,基于开源KTransformers架构的 CPU/GPU 异构推理能力,沐曦在曦云C500单卡GPU上成功实现DeepSeek-R1-671B满血版单并发解码吞吐16.5 tokens/s的优异成绩,相比社区官方数据提升20%以上。
    的头像 发表于 03-20 15:52 1887次阅读

    TPS7B69-Q1 汽车类 150mA、无电池 (40V)、高 PSRR、低 IQ、低压差稳压器数据手册

    TPS7B69xx-Q1 器件是一款低压差线性稳压器,专为高达 40V 的电压而设计 V~我~操作。轻负载时静态电流仅为 15μA(典型值), 该器件适用于备用微控制器系统,尤其是汽车
    的头像 发表于 03-04 10:19 788次阅读
    TPS<b class='flag-5'>7B69-Q1</b> 汽车类 150mA、无电池 (40V)、高 PSRR、低 IQ、低压差稳压器数据手册