LLMs开源模型们的分布式训练和量化

news2024/10/7 8:24:42

前一篇博文整理了:

  • LLMs开源模型们和数据集简介

这篇博文主要整理一下目前流行的训练方法和量化。


在这里插入图片描述
(图自Towards a Unified View of Parameter-Efficient Transfer Learning)

Tuning Strategies

使通用LLMs适应下游任务的最常见方法是微调所有模型参数或微调尾层参数(Freeze)。然而这会导致每个任务都有一份单独的微调模型参数,训练成本高。

  • Adapter。冻结原有参数,添加adapter层用于微调。adapter层一般先向下投影,然后非线性激活函数,再使用向上投影,最后接残差连接。在Transformer中,一个放在MHA之后,一个在FFN之后。新增的参数量大致占原有模型的 0.5%-8%。
    h = h + f ( h W d o w n ) W u p h=h+f(hW_{down})W_{up} h=h+f(hWdown)Wup

  • P-Tuning。soft-prompt方法。P-tuning v1将learnable prompts插入input embedding中,导致可训练的参数被句子的长度限制,使得任务不通用和规模不通用,而在P-tuning v2中,prompts加在序列前端,并且每一层都加。
    [图片]

  • LoRA。原参数不变,仅训练额外增加的低秩参数以近似权重更新(即W0被冻结,A和B可训练,其中B初始化为0)。当“秩值”远小于原始参数维度时,新增的低秩矩阵参数量将很小。
    h = W 0 x + Δ W x = W 0 x + B A x h=W_0x+ \Delta W x=W_0x+BA x h=W0x+ΔWx=W0x+BAx
    当进行部署时,以显式的计算和存储低秩矩阵 ,并正常执行推理即可。当需要转换至另一个下游任务,可以通过减去低秩矩阵来恢复W0,然后添加其他的低秩矩阵。

  • BitFit 只对预训练模型中的 bias 向量进行微调,diff-pruning学习一个稀疏的参数更新向量等等。

Optimization

怎么以更低内存和时间训练大模型?

  • 存储:将大模型参数和数据全部塞到单卡GPT的内存中进行训练很难。–>分布式并行和混合精度训练
  • 计算:大模型参数的所有计算操作可能会导致长训练时间和慢推理时间。–>模型量化

Parallelism

  • Data Parallelism。数据并行,复制多份模型,每个副本被放置在不同GPU上,并输入数据分片。然后模型并行完成forward和backward,在每个训练step结束时同步所有模型副本,即聚合梯度 + 下发梯度的AllReduce过程。
  • Tensor Parallelism。张量并行,将矩阵乘法进行分块,从而将大矩阵拆分为更小的矩阵,这样就能把不同的矩阵放置在不同的GPU上。这种方式不把整个激活张量或者梯度张量放在单个GPU上,而是把这个张量的碎片放在单个GPU上。
  • Pipeline Parallelism。流水线并行,其通过将模型的不同层放置在不同的GPU上,从而将单个大模型分拆至多张卡上,也称为垂直并行。为了提高利用率,引入块 (chunks)概念,即定义同一管级中按顺序输入数据块。例如,GPU0 在 chunk 0、1、2 和 3 (F0,0、F0,1、F0,2、F0,3) 上执行相同的前向路径,然后等待,等其他 GPU 完成工作后,GPU0 会再次开始工作,为块 3、2、1 和 0 (B0,3、B0,2、B0,1、B0,0) 执行后向路径。这与DeepSpeed的梯度累积 (gradient accumulation steps,GAS)类似。

当PP+DP结合时,如果batch size 1024 ,4卡,那么将拆分为 4 x 256,如果块或GAS的数量为 32,则最终得到的 micro batch size 为 8,即每个管级一次处理一个 micro batch。也称micro-batches (MBS) 。
当DP+PP+TP结合成3D Parallelism时:
在这里插入图片描述

实践中,广泛使用 Megatron-DeepSpeed (基于Megatron-Deepspeed的GPT-3 训练(Under Construction))进行训练,其中核心是ZeRO来优化DP的储存(类似FSDP)。

ZeRO

DP需要复制多份模型,然后AllReduce。主要存储三类数据,分别是模型参数P,模型梯度G、优化器参数O,即OPG状态,这些备份在每个GPU上都需要存储,存在冗余。当模型变大时,很容易爆显存。

  • 参数只在做forward和backward时才用到
  • gradients只在最后做AllReduce和updates时才用到
  • Adam的optimizer states只在最终做update时才用到

但是实际上每个GPU上可以只存储部分必需的数据,需要其他数据的时候可以去其他GPU上做检索,即以通信时间换显存空间。
[图片]
Φ \Phi Φ是模型参数W,K指parameter,momentum和variance占用字节数4+4+4,混合精度下p和g存2+2)

  • forward。对W做一次All-Gather,取回分布在别的GPU上的W,得到一份完整的W。forward做完,立刻把不是自己维护的W抛弃。
  • backward。对W做一次All-Gather,取回完整的W。backward做完,立刻把不是自己维护的W抛弃。
  • gradients。对于完整的梯度G,要G做一次Reduce-Scatter,把其他GPT上的某块梯度进行聚合加总 。聚合后,再立刻把不是自己维护的G抛弃。
  • Adam。用自己维护的O和G,更新部分参数W即可。但由于只维护部分W,因此无需其他AllReduce操作。

因此,ZeRO 有三个不同级别,分别对应不同程度的分割:

  • ZeRO-1:分割Optimizer States。
  • ZeRO-2:分割Optimizer States与Gradients。
  • ZeRO-3:分割Optimizer States、Gradients与Parameters。

Mixed Precision Training

虽然希望参数越精准越好,但fp32来表示每个参数的计算开销很大,于是混合精度训练尝试引入fp16。但是fp16表值范围比fp32要狭窄很多,有以下问题:

  • 全fp16会损失80%的精度。
  • 很多累加操作如梯度累积、softmax容易上溢。–>累加用fp32,余下的操作则fp16。
  • 训练后期梯度变小而下溢出。–>保存权重的副本(仅在前向和反向时使用fp16)、Loss Scaling。
    [图片]

但在很多大模型的report中,都显示出fp16在训练中的不稳定。因此它们都不约而同的选择了bf16!它与fp16大小相同,但表值范围和fp32一样。虽然精度更差,但是在结合权重副本的情况下,可以当作是随机梯度下降的一点点折损,再等待下一次迭代。
在这里插入图片描述

其他优化

  • Gradient Accumulation。梯度累积,解决内存不足而无法训练大Batch Size,做法是累加N个mini-bacth之后,用累积的梯度进行更新,以达到和N*mini-batch一样的效果。
  • Activation Checkpointing。只保留每层的输入和输出,丢弃中间结果,反向传递过程时再重新计算。
  • Fused Kernels。最小化数据传输。GPU 主要写显存或读显存,并执行计算。当 GPU 忙于读写数据时, GPU 的计算单元就会空闲,因此核融合将多个操作的组合成一个GPU操作,中间结果留在寄存器而不是放回显存。
    c = torch.add (a, b) #从显存读a,b,核函数计算,写回显存
    e = torch.max ([c,d]) #从显存读c,d,核函数计算,写回显存
    两个核函数融合后,只执行融合内核,从而c不会写到显存,这降低了GPU空闲。Megatron-LM提供了几个定制化融合CUDA核,如LayerNorm、缩放、掩码和softmax操作的各种组合等等。
  • 硬件故障问题。对于长时间的训练,几乎每周有1-2个GPU故障,使用备份节点+每3h存一次checkpoint。

Quantization

量化是一种常见的模型压缩技术,核心思想是将模型参数从高精度转换为低精度,降低对推理内存的需求,从而可以使大模型在消费级显卡上运行。INT8量化是最流行的训练后量化方法,如下图所示。

  • 对称量化symmetry和非对称量化asymmetric。
    [图片]

  • Outlier问题。
    [图片]

  • LLM.int8。自适应混合精度量化方法。分区域设置量化分辨率,并消除异常值对模型量化带来的负面影响。
    [图片]

  • INT4 量化。GLM-130B在INT4 量化级别下最低只需 6GB 显存,单卡可推理,同时精度损失没有很大。
    [图片]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/569371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电气器件系列三十七:多路温度测试仪、温度巡检仪

巡检仪适用于多点测量显示及控制,集多台仪表功能于一体,一般可巡检1~64路测量信号,可巡回检测和显示多路信号,与各类传感器、变送器配合使用,现已开发出八路巡检仪\十六路巡检仪\24路巡检仪-64路可对多路温度、压力、液…

项目总结 车牌识别

代码贴:OpenCV实战5 车牌号识别_opencv车牌字符识别_爱钓鱼的歪猴的博客-CSDN博客 目录 1、效果 2、代码思路 0、准备车配字符模板图片以及字符文件 1、对整图进行预处理 得到突出车牌的cany边缘图 2、车牌字体联通在一起,形成一个区域 3、筛选出车…

【华为OD机试】太阳能板最大面积【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条), 再在支柱的中间部分固定太阳能板。 但航天器不同位置的支柱长度不同,太阳…

URLConnection(一)

文章目录 1. 简介2. 打开URLConnection3. 读取服务器的数据4. 读取首部5. 获取任意首部字段 1. 简介 URLConnection是一个抽象类,表示指向URL指定资源的活动连接。URLConnection有两个不同但相关的用途。首先,与URL类相比,它对服务器&#x…

chatgpt赋能python:简介:什么是PythonShapiro?

简介:什么是Python Shapiro? Python Shapiro是一种用来进行正态性检验的工具,也就是说,它可以帮助我们检验一个给定的数据集是否符合正态分布的要求。它是从R语言中的Shapiro-Wilk测试方法改编而来的。 如何使用Python Shapiro&…

继瑞吉外卖后的又一个项目——SpringBoot+Vue的前后端博客系统

文章目录 博客系统项目介绍前言项目演示前台演示后台演示 组织结构后端组织结构前端组织结构 技术选型前端技术后端技术架构图系统架构图业务架构图 模块介绍前端模块后端模块 环境搭建开发工具开发环境项目运行 未完待续结语 博客系统项目介绍 前言 本项目已开源在Gitee 后端…

谈谈linux网络编程中的应用层协议定制、Json序列化与反序列化那些事

linux【网络编程】之协议定制、序列化与反序列化 一、序列化与反序列化二、应用层协议如何定制三、网络通信中数据流动的本质四、网络版计算器编写4.1 业务流程4.2 核心代码 一、序列化与反序列化 由于socket api的接口,在读写数据的时候是以字符串的方式发送接收的…

电子科技大学编译原理复习笔记(三):控制结构

目录 前言 重点一览 语句级控制结构 单元级控制结构 四种单元级控制结构 本章小结 前言 本复习笔记基于张老师的课堂PPT,供自己期末复习与学弟学妹参考用。 重点一览 语句级控制结构 定义:用来构造各种语句执行顺序的机制 传统三种语句级控制结…

Hyperledger Fabric explorer区块链浏览器搭建

https://github.com/hyperledger-labs/blockchain-explorer 官方浏览器的github地址 根据文档,采用docker容器的方法搭建explorer。 首先创建explorer的项目, mkdir explorer根据官方提供的文件,需要创建的目录结构如下: 这是官…

【计算机网络复习之路】网络层(谢希仁第八版)万字详解 主打基础

专栏:计算机网络复习之路 目录: 一、网络层的几个重要概念 1.1 网络层提供的两种服务 1.2 网络层的两个层面 二、网际协议 IP 2.1 虚拟互连网络 2.2 IP地址 2.2.1 IP地址及其表示方法 2.2.2 分类的IP地址 2.2.3 无分类编址CIDR &#xff08…

【2023 · CANN训练营第一季】应用开发(初级)第四章——模型推理

AscendCL运行资源管理 申请运行管理资源时,需按顺序依次申请: Device、Context、Stream,然后根据实际需求调用aclrtGetRunMode接口获取软件栈的运行模型(当同一个应用既支持在Host运行,也支持在Device运行时,在编程时需要就需要根…

k8s进阶5——AppArmor、Seccomp、ImagePolicyWebhook

文章目录 一、AppArmor限制容器对资源访问1.1 实现步骤1.1.1 定义策略1.1.2 加载策略1.1.3 引用策略 2.2 案例 二、Seccomp 限制容器进程系统调用案例一:使用自定义策略案例二:使用容器运行时默认策略 三、动态准入控制Webhook3.1 ImagePolicyWebhook控制…

PowerPoint输出图片分辨率设置

最近想用ppt画几张图,但是输出的分辨率有点不够意思,然后就想着改一下输出分辨率,这里记录一下方便以后查阅。 PowerPoint输出图片分辨率设置

PS-调色

图片的储存格式 JPEG格式:日常作图存储格式、只有一个图层、通用图片格式、内存小画质高 RAW格式:CR2、CR3佳能、NEF尼康、ARW索尼、IIQ哈苏、RAF富士、RW2松下 PNG格式:图片透明格式、用于抠出来的素材用这个格式保存可以是透明底没有背景 …

Linux——操作系统详解

目录 一.操作系统的含义 1.操作系统是什么? 2.那么操作系统为什么要对软硬件资源进行管理呢?这样做的好处在哪里? 3.操作系统又是怎么进行管理的? 如何理解“先描述,再组织”? 二.总结: …

conda环境安装使用教程

conda,anaconda,miniconda傻傻分得清楚 Conda是一个开源的包管理系统和环境管理系统,可以用于安装、管理和卸载软件包以及创建和管理虚拟环境。Anaconda是一个基于Python的数据科学平台,包括Python解释器、Conda包管理器、Jupyte…

Linux:为xfs文件系统卷 设置磁盘配额

首先准备一个xfs文件系统的 卷 || 分区 可以是逻辑卷 ,也可以是普通卷,等等……但是他们的文件格式都要是xfs格式 我这里选择的是逻辑卷,普通卷也是一样的道理 开始前要有两个软件包需要安装 如果已安装直接看下一步 Linux:rpm…

一个人的旅行

说一下,两次的旅行。一次是三月底四月初,一次是四月底五月初。 我的第一站,帝都!!! 31号晚上八点半的高铁去北京,到达北京已经快十二点了。武局的G528次列车。 来到北京后,这是我第…

Android开发环境搭建[Java1.7+eclipse+sdk4.0](某高校物联网工程专业必看!)

Android开发环境搭建[Java1.7eclipsesdk4.0](某高校物联网工程专业必看!) 0. 前言1. 资料拷贝2. 配置环境变量2.1新建 Java_Home2.2 编辑Path情况1情况2 2.3 新建sdk环境变量 3. 验证安装3.1 验证java安装情况3.2 验证eclipse安装 4. 导入已有…

《OrangeS一个操作系统的实现》中printf无法打印数字问题

【问题现象】 《OrangeS一个操作系统的实现》 第9章 a目录下的代码编译运行后,所有printf打印数字的地方都有问题,如下图: HD size 始终为 0MB。 【问题分析】 通过断点,发现printf第61行: int printf(const char *…