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

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

3天内不再提示

有哪些省内存的大语言模型训练/微调/推理方法?

智能感知与物联网技术研究所 来源:智能感知与物联网技术研 2023-04-10 11:41 次阅读

大模型(LLMs)现在是 NLP 领域的最主流方法之一了。

这个趋势带来的主要问题之一,就是大模型的训练/微调/推理需要的内存也越来越多。

举例来说,即使 RTX 3090 有着 24GB 的 RAM,是除了 A100 之外显存最大的显卡。但使用一块 RTX 3090 依然无法 fp32 精度训练最小号的 LLaMA-6B。

本文总结一些 Memory-Efficient 的 LLMs 的训练/微调/推理方法,包括:

● fp16

●int8

LoRA

●Gradient checkpointing

●Torch FSDP

CPU offloading

估算模型所需的RAM

首先,我们需要了解如何根据参数量估计模型大致所需的 RAM,这在实践中有很重要的参考意义。我们需要通过估算设置 batch_size,设置模型精度,选择微调方法和参数分布方法等。

接下来,我们用LLaMA-6B模型为例估算其大致需要的内存。

首先考虑精度对所需内存的影响:

●fp32 精度,一个参数需要 32 bits, 4 bytes. ●fp16 精度,一个参数需要 16 bits, 2 bytes. ●int8 精度,一个参数需要 8 bits, 1 byte.

其次,考虑模型需要的 RAM 大致分三个部分:

●模型参数 ●梯度 ●优化器参数

模型参数:等于参数量*每个参数所需内存。

对于 fp32,LLaMA-6B 需要 6B*4 bytes = 24GB内存

对于 int8,LLaMA-6B 需要 6B*1 byte = 6GB

梯度:同上,等于参数量*每个梯度参数所需内存。

优化器参数:不同的优化器所储存的参数量不同。

对于常用的 AdamW 来说,需要储存两倍的模型参数(用来储存一阶和二阶momentum)。

fp32 的 LLaMA-6B,AdamW 需要 6B*8 bytes = 48 GB

int8 的 LLaMA-6B,AdamW 需要 6B*2 bytes = 12 GB

除此之外,CUDA kernel也会占据一些 RAM,大概 1.3GB 左右,查看方式如下。

c4f8bafc-d6f1-11ed-bfe3-dac502259ad0.png

综上,int8 精度的 LLaMA-6B 模型部分大致需要 6GB+6GB+12GB+1.3GB = 25.3GB 左右。

再根据LLaMA的架构(hidden_size = 4096, intermediate_size =11008, num_hidden_layers = 32, context_length = 2048)计算中间变量内存。

每个 instance 需要:

c5034a94-d6f1-11ed-bfe3-dac502259ad0.png

所以一张 A100(80GB RAM)大概可以在 int8 精度;batch_size = 50 的设定下进行全参数训练。

查看消费级显卡的内存和算力:

2023 GPU Benchmark and Graphics Card Comparison Chart

https://www.gpucheck.com/gpu-benchmark-graphics-card-comparison-chart

Fp16-mixed precision

c512e8aa-d6f1-11ed-bfe3-dac502259ad0.png

混合精度训练的大致思路是在 forward pass 和 gradient computation 的时候使用 fp16 来加速,但是在更新参数时使用 fp32。

用 torch 实现:

CUDA Automatic Mixed Precision examples

https://pytorch.org/docs/stable/notes/amp_examples.html

torch fp16 推理:直接使用 model.half() 将模型转换为fp16.

c52cbdca-d6f1-11ed-bfe3-dac502259ad0.png

使用 Huggingface Transformers:在 TrainingArguments 里声明 fp16=True

https://huggingface.co/docs/transformers/perf_train_gpu_one#fp16-training

Int8-bitsandbytes

Int8 是个很极端的数据类型,它最多只能表示 - 128~127 的数字,并且完全没有精度。

为了在训练和 inference 中使用这个数据类型,bitsandbytes 使用了两个方法最大程度地降低了其带来的误差:

1. vector-wise quantization

2. mixed precision decompasition

Huggingface 在这篇文章中用动图解释了 quantization 的实现:

https://huggingface.co/blog/hf-bitsandbytes-integration

论文:

LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scalehttps://arxiv.org/abs/2208.07339

借助 Huggingface PEFT,使用 int8 训练 opt-6.5B 的完整流程:

https://github.com/huggingface/peft/blob/main/examples/int8_training/Finetune_opt_bnb_peft.ipynb

LoRA

Low-Rank Adaptation 是微调 LLMs 最常用的省内存方法之一。

c54e2406-d6f1-11ed-bfe3-dac502259ad0.png

LoRA 发现再微调 LLMs 时,更新矩阵(update matrix)往往特别 sparse,也就是说 update matrix 是低秩矩阵。LoRA 的作者根据这一特点将 update matrix reparametrize 为两个低秩矩阵的积积 。 其中,,A 和 B 的秩为 r,且 。 如此一来,A+B 的参数量将大大小于 . LoRA 的论文: https://arxiv.org/pdf/2106.09685.pdf

借助 Huggingface PEFT 框架,使用 LoRA 微调 mt0: https://github.com/huggingface/peft/blob/main/examples/conditional_generation/peft_lora_seq2seq.ipynb

Gradient Checkpointing

在 torch 中使用 - 把 model 用一个 customize 的 function 包装一下即可,详见:

Explore Gradient-Checkpointing in PyTorch

https://qywu.github.io/2019/05/22/explore-gradient-checkpointing.html 在 Huggingface Transformers 中使用: https://huggingface.co/docs/transformers/v4.27.2/en/perf_train_gpu_one#gradient-checkpointing

Torch FSDP+CPU offload

Fully Sharded Data Paralle(FSDP)和 DeepSpeed 类似,均通过 ZeRO 等分布优化算法,减少内存的占用量。其将模型参数,梯度和优化器状态分布至多个 GPU 上,而非像 DDP 一样,在每个 GPU 上保留完整副本。 CPU offload 则允许在一个 back propagation 中,将参数动态地从 GPU -> CPU, CPU -> GPU 进行转移,从而节省 GPU 内存。 Huggingface 这篇博文解释了 ZeRO 的大致实现方法: https://huggingface.co/blog/zero-deepspeed-fairscale

借助 torch 实现 FSDP,只需要将 model 用 FSDPwarp 一下;同样,cpu_offload 也只需要一行代码: https://pytorch.org/blog/introducing-pytorch-fully-sharded-data-parallel-api/

在这个可以查看 FSDP 支持的模型: https://pytorch.org/docs/stable/fsdp.html

在 Huggingface Transformers 中使用 Torch FSDP: https://huggingface.co/docs/transformers/v4.27.2/en/main_classes/trainer#transformers.Trainin

根据某些 issue,shard_grad_op(只分布保存 optimizer states 和 gradients)模式可能比 fully_shard 更稳定: https://github.com/tatsu-lab/stanford_alpaca/issues/32

审核编辑 :李倩

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

    关注

    8

    文章

    1332

    浏览量

    113936
  • 参数
    +关注

    关注

    11

    文章

    1446

    浏览量

    31683
  • 语言模型
    +关注

    关注

    0

    文章

    465

    浏览量

    10169

原文标题:有哪些省内存的大语言模型训练/微调/推理方法?

文章出处:【微信号:tyutcsplab,微信公众号:智能感知与物联网技术研究所】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【大语言模型:原理与工程实践】揭开大语言模型的面纱

    Transformer架构,利用自注意力机制对文本进行编码,通过预训练监督微调和强化学习等阶段,不断提升性能,展现出强大的语言理解和生成能力。 大
    发表于 05-04 23:55

    【大语言模型:原理与工程实践】大语言模型的基础技术

    特定任务对模型进行微调。这种方法的成功不仅是自然语言处理发展的一个转折点,还为许多现实世界的应用场带来了前所未有的性能提升。从广为人知的GPT到BERT,预
    发表于 05-05 12:17

    【大语言模型:原理与工程实践】大语言模型的预训练

    语言模型的核心特点在于其庞大的参数量,这赋予了模型强大的学习容量,使其无需依赖微调即可适应各种下游任务,而更倾向于培养通用的处理能力。然而,随着学习容量的增加,对预
    发表于 05-07 17:10

    【大语言模型:原理与工程实践】大语言模型的评测

    在知识获取、逻辑推理、代码生成等方面的能力。这些评测基准包括语言建模能力、综合知识能力、数学计算能力、代码能力和垂直领域等多个维度。对于微调模型,对话能力的评测关注
    发表于 05-07 17:12

    【大语言模型:原理与工程实践】大语言模型的应用

    。 关于大语言模型是否具备与人类“系统2”相似的能力,存在广泛的争议。然而,随着模型参数量的增加和大规模预训练的实施,大语言
    发表于 05-07 17:21

    压缩模型会加速推理吗?

    位压缩和“无”配置下都运行了 115 毫秒,尽管精度有所下降。我认为将 float 网络参数压缩为 uint8_t 不仅可以节省内存,还可以加快推理速度。那么,压缩模型是否应该加速推理
    发表于 01-29 06:24

    关于语言模型和对抗训练的工作

    本文把对抗训练用到了预训练微调两个阶段,对抗训练方法是针对embedding space,通过最大化对抗损失、最小化
    的头像 发表于 11-02 15:26 1930次阅读
    关于<b class='flag-5'>语言</b><b class='flag-5'>模型</b>和对抗<b class='flag-5'>训练</b>的工作

    一种基于乱序语言模型的预训练模型-PERT

    由于乱序语言模型不使用[MASK]标记,减轻了预训练任务与微调任务之间的gap,并由于预测空间大小为输入序列长度,使得计算效率高于掩码语言
    的头像 发表于 05-10 15:01 1297次阅读

    微调前给预训练模型参数增加噪音提高效果的方法

    为了减轻上述问题,提出了NoisyTune方法,即,在finetune前加入给预训练模型的参数增加少量噪音,给原始模型增加一些扰动,从而提高预训练
    的头像 发表于 06-07 09:57 2207次阅读

    CogBERT:脑认知指导的预训练语言模型

    另一方面,从语言处理的角度来看,认知神经科学研究人类大脑中语言处理的生物和认知过程。研究人员专门设计了预训练模型来捕捉大脑如何表示语言的意
    的头像 发表于 11-03 15:07 832次阅读

    PyTorch教程16.7之自然语言推理微调BERT

    电子发烧友网站提供《PyTorch教程16.7之自然语言推理微调BERT.pdf》资料免费下载
    发表于 06-05 10:52 0次下载
    PyTorch教程16.7之自然<b class='flag-5'>语言</b><b class='flag-5'>推理</b>:<b class='flag-5'>微调</b>BERT

    从原理到代码理解语言模型训练推理,通俗易懂,快速修炼LLM

    要理解大语言模型(LLM),首先要理解它的本质,无论预训练微调还是在推理阶段,核心都是next token prediction,也就是以
    的头像 发表于 09-19 16:25 819次阅读
    从原理到代码理解<b class='flag-5'>语言</b><b class='flag-5'>模型</b><b class='flag-5'>训练</b>和<b class='flag-5'>推理</b>,通俗易懂,快速修炼LLM

    ChatGPT是一个好的因果推理器吗?

    因果推理能力对于许多自然语言处理(NLP)应用至关重要。最近的因果推理系统主要基于经过微调的预训练语言
    的头像 发表于 01-03 09:55 578次阅读
    ChatGPT是一个好的因果<b class='flag-5'>推理</b>器吗?

    四种微调模型方法介绍

    微调(Full Fine-tuning):全微调是指对整个预训练模型进行微调,包括所有的模型
    发表于 01-03 10:57 1.7w次阅读
    四种<b class='flag-5'>微调</b>大<b class='flag-5'>模型</b>的<b class='flag-5'>方法</b>介绍

    摩尔线程和滴普科技完成大模型训练推理适配

    近日,摩尔线程与滴普科技宣布了一项重要合作成果。摩尔线程的夸娥(KUAE)千卡智算集群与滴普科技的企业大模型Deepexi已完成训练推理适配,共同实现了700亿参数LLaMA2大语言
    的头像 发表于 05-30 10:14 192次阅读