《多GPU大模型训练与微调手册》

在这里插入图片描述

全参数微调

Lora微调

PTuning微调

多GPU微调预备知识

1. 参数数据类型 torch.dtype

在这里插入图片描述

1.1 半精度 half-precision
  • torch.float16:fp16 就是 float16,1个 sign(符号位),5个 exponent bits(指数位),10个 mantissa bits(小数位)

  • torch.bfloat16:bf 16 就是 brain float16,1个 :符号位,8个exponent bits(指数位),7个mantissa bits(小数位)

  • 区别:bf16 牺牲了精度(小数位),实现了比 fp16 更大的范围(多了三个指数位)。

1.2 全精度 single-precision
  • torch.float32:fp 32 就是 float32,1个 sign(符号位),8个 exponent bits(指数位),23个 mantissa bits(小数位)

2. 显卡环境

2.1 参数量与显存换算

例如,实验室是单机多卡:8卡A6000(40G)服务器 320G显存

① CUDA_VISIBLE_DEVICES 控制显卡可见性

通过CUDA_VISIBLE_DEVICES环境变量 控制哪些GPU可以被torch调用:

  • 代码控制
# 必须置于 import torch 之前,准确地说在 torch.cuda 的调用之前
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3,4,5,6,7'
import torch
torch.cuda.device_count()
# 8
  • 命令行控制
CUDA_VISIBLE_DEVICES=0,1 python train.py
② 推理换算
  • 模型加载
    (1)目前模型的参数绝大多数都是float32类型, 每个参数占用 4 个字节。所以一个粗略的计算方法就是,每10亿个参数(1 billion=10亿),占用4G显存 (实际应该是10^9 * 4 / 1024 / 1024 / 1024 = 3.725G,为了方便可以记为4G),即 1B Params= 4G VRAM。比如LLaMA的参数量为7000559616个Params,那么全精度加载这个模型参数需要的显存为:7000559616 * 4 /1024/1024/1024 = 26.08G
    (2)显存不够,可以用半精度fp16/bf16来加载,这样每个参数只占2个字节,所需显存就降为一半,只需要13.04G。
    (3)如果显存还不够,可以采用int8的精度,显存再降一半,仅需6.5G,但是模型效果会更差一些。
    (4)如果显存还是不够,int4精度显存再降一半,仅需3.26G。int4就是最低精度了,再往下模型推理效果就很难保证了。
    在这里插入图片描述

  • 模型推理:注意上面只是加载模型到显存,模型运算时的一些临时变量也需要申请空间,比如你beam search的时候。所以真正做推理的时候记得留一些Buffer,不然就容易OOM。如果显存还不够,就只能采用Memery Offload的技术,把部分显存的内容给挪到内存,但是这样会显著降低推理速度。

③ 训练换算

模型训练的时候显存使用包括如下几部分:

  1. 模型权重,计算方法和推理一样。
  2. 优化器:(1)如果你采用AdamW,每个参数需要占用8个字节,因为需要维护两个状态。也就说优化器使用显存是全精度(float32)模型权重的2倍。(2)如果采用bitsandbytes优化的AdamW,每个参数需要占用2个字节,也就是全精度(float32)模型权重的一半。(3)如果采用SGD,则优化器占用显存和全精度模型权重一样。
  3. 梯度:梯度占用显存和全精度(float32)模型权重一样。
  4. 计算图内部变量:有时候也叫Forward Activations。

如果模型想要训练,只看前3部分,需要的显存是至少推理的3-4倍。7B的全精度模型加载需要78G ~ 104G。 然后计算图内部变量这一部分只能在运行时候观测了,可以两个不同的batch的占用显存的差值大概估算出来。

优化的思路也就有了,目前市面上主流的一些计算加速的框架如DeepSpeed, Megatron等都在降低显存方面做了很多优化工作,比如量化,模型切分,混合精度计算,Memory Offload等等。

2.2 分布式架构

在这里插入图片描述
3种并行方式

  • 数据并行Data Paralleism:模型复制到不同GPU上,将数据切分后,分配到不同的GPU上。
  • 模型并行Model Paralleism:将模型切分后,分配到不同的GPU上。分为张量并行和流水线并行。
    • 张量并行Tensor Paralleism:对模型参数 tensor 切分,分配到不同的GPU进行计算,在参数更新的时候再进行同步。在这里插入图片描述
    • 流水线并行Pipeline Paralleism:对模型按层layer切分,分配到不同的GPU上进行计算。
      在这里插入图片描述
  • 混合并行Hybrid Paralleism:同时进行数据并行、张量并行、流水线并行。
    在这里插入图片描述

下面3个分布式框架都是基于 Pytorch 的并行框架:

  • DP(torch.nn.DataParallel)单机-单进程多线程进行实现的,它使用一个进程来计算模型权重,在每个batch处理期间将数据分发到每个GPU,每个GPU 分发到 batch_size/N 个数据,各个GPU的forward结果汇聚到master GPU上计算loss,计算梯度更新master GPU参数,将参数复制给其他GPU。(数据并行
  • DDP(torch.nn.DistributedDataParallel):可以单机/多机-多进程进行实现的,每个GPU对应的进程都有独立的优化器,执行自己的更新过程。每个进程都执行相同的任务,并且每个进程都与所有其他进程通信。进程(GPU)之间只传递梯度,这样网络通信就不再是瓶颈。(数据并行
  • FSDP(torch.distributed.fsdp.FullyShardedDataParallel):Pytorch最新的数据并行方案,在1.11版本引入的新特性,目的主要是用于训练大模型。我们都知道Pytorch DDP用起来简单方便,但是要求整个模型加载到一个GPU上,维护模型参数、梯度和优化器状态的每个 GPU 副本。FSDP则可以在数据并行的基础上,将模型参数和优化器分片分配到 GPU,这使得大模型的训练权重得以加载。(数据并行+模型并行

这些在前面的博客已经讲过:

  • 分布式并行训练(DP、DDP、DeepSpeed)
  • pytorch单精度、半精度、混合精度、单卡、多卡(DP / DDP)、FSDP、DeepSpeed模型训练
2.3 分布式工具

前面的分布式框架使用起来较为麻烦,因此分布式工具在底层对torch的分布式框架进行封装,实现更加方便的分布式训练和微调:

  • DerepSpeed(微软开发)
  • Accelerate(Huggingface开发)
① DerepSpeed—Zero

DerepSpeed的原理是基于微软的研究:Zero(零冗余优化),研究哪些部分是占用存储空间的,并对这些占用存储的数据进行优化。
在这里插入图片描述

存储空间的消耗 Memory Consumption主要包含两部分:

  • Model States(主):模型参数Parameters梯度Gradients优化器Optimizer_State
  • Residual States(次):前向传播激活值Activations临时缓存区Temporal Buffers内存碎片Unusable Fragmented Memory
    在这里插入图片描述

知道了什么东西会占存储,以及它们占了多大的存储之后,我们就可以来谈如何优化存储了。注意到,在整个训练中,有很多states并不会每时每刻都用到;因此提出了三种Zero优化方法:

  • Zero-DP优化Model States):作者采取三个方法优化内存,Pos、Pg、Pp。大体思路都是一样的,把每个模型的参数、梯度、优化器状态分别平均分给所有的gpu,当时计算需要用到其他gpu的内容时,通过GPU之间的通讯传输,以通讯换内存。其中前两个方法不增加通讯成本,第三个方法会增加GPU之间的通信成本。
    在这里插入图片描述

  • Zero-R优化Residual States):(1)激活函数:在前向传播计算完成激活函数之后,对把激活值丢弃,由于计算图还在,等到反向传播的时候,再次计算激活值,算力换内存。或者采取一个与cpu执行一个换入换出的操作。(2)临时缓冲区:模型训练过程中经常会创建一些大小不等的临时缓冲区,比如对梯度进行All Reduce啥的,解决办法就是预先创建一个固定的缓冲区,训练过程中不再动态创建,如果要创建临时数据,在固定缓冲区创建就好。(3)内存碎片:显存出现碎片的一大原因是时候gradient checkpointing后,不断地创建和销毁那些不保存的激活值,解决方法是预先分配一块连续的显存,将常驻显存的模型状态和checkpointed activation存在里面,剩余显存用于动态创建和销毁discarded activation复用了操作系统对内存的优化,不断内存整理。

  • 混合精度训练:对于模型,我们肯定希望其参数越精准越好,也即我们用fp32(单精度浮点数,存储占4byte)来表示参数W。但是在forward和backward的过程中,fp32的计算开销也是庞大的。那么能否在计算的过程中,引入fp16或bf16(半精度浮点数,存储占2byte),来减轻计算压力呢?于是,混合精度训练(float2hlaf)就产生了,它的步骤如下图:
    在这里插入图片描述

  1. get fp32:存储一份fp32的Model States:parameter,momentum和variance
  2. fp32-to-fp16:在forward开始之前,额外开辟一块存储空间,将fp32 parameter减半到fp16 parameter。
  3. fp16 computing:正常做forward和backward,在此之间产生的activation和gradients,都用fp16进行存储。
  4. update fp32 model states:用fp16 gradients去更新fp32下的model states。
  • Zero-OffloadGPU显存不够,CPU内存来凑。如下图,左边是正常的计算图,右侧是Zero-Offload的计算图。(⭕️表示state,正方形表示计算图,箭头表示数据流向、M表示模型参数,float2half表示32位转16位)其实就是forward和backward在GPU上计算参数更新在CPU上。因为CPU与GPU通信数据开销很大,所以CPU和GPU传播的是gradient16,这样保证传播数据量最小。
    在这里插入图片描述

  • Zero-InfinityGPU内存不够,SSD外存来凑
    在这里插入图片描述

②Accelerate—Huggingface

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数学几百年重大错误:将两异函数误为同一函数

黄小宁 因各实数都可是数轴上点的坐标所以数集A可形象化为数轴上的点集A,从而使x∈R变换为实数yxδ的几何意义可是:一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)运动到新的位置yxδ还在管道g内(设各点只作位置改变而没别的改变即变位前…

Ubuntu下载离线安装包

旧版Ubuntu下载地址 https://old-releases.ubuntu.com/releases/ 下载离线包 sudo apt-get --download-only -odir::cache/ncayu install net-tools下载snmp离线安装包 sudo apt-get --download-only -odir::cache/root/snmp install snmp snmpd snmp-mibs-downloadersudo a…

Linux下安装Foldseek并从蛋白质的PDB结构中获取 3Di Token 和 3Di Embedding

0. 说明: Foldseek 是由韩国国立首尔大学 (Seoul National University) 的 Martin Steinegger (MMseqs2 和 Linclust 的作者) 开发的一款用于快速地从大型蛋白质结构数据库中检索相似结构蛋白质的工具,可以用于计算两个蛋白之间的结构相似性&#xff0c…

TensorFlow实战教程(十九)-Keras搭建循环神经网络分类案例及RNN原理详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。这篇文章将详细讲解循环神经网络RNN的原理知识,并采用Keras实现手写数字识别的RNN分类案例及可视化呈现。基础性文…

多元函数奇偶性

多元函数奇偶性 多元函数的定义域 定义域根据函数的变量数不同,有不同的形式 一元函数 y f ( x ) yf(x) yf(x),定义域可以是数集二元函数 z f ( x , y ) zf(x,y) zf(x,y),定义域可以是一平面区域,是平面点集三元函数 v f ( x , y , z ) vf(x,y,z) vf(x,y,z),定义域是一块空…

基于骑手优化算法优化概率神经网络PNN的分类预测 - 附代码

基于骑手优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于骑手优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于骑手优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

spark内置数据类型

在用scala编写spark的时候,假如我现在需要将我spark读的数据源的字段,做一个类型转换,因 为需求中要拼接出sql的create table语句,需要每个字段的sql中的类型,那么就需要去和sparksql 中的内置数据类型去比对。 写s…

光伏、储能双层优化配置接入配电网研究(附带Matlab代码)

由于能源的日益匮乏,电力需求的不断增长等,配电网中分布式能源渗透率不断提高,且逐渐向主动配电网方向发展。此外,需求响应(demand response,DR)的加入对配电网的规划运行也带来了新的因素。因此,如何综合考…

Linux docker安装RStudio Server结合内网穿透实现公网访问内网服务

📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅cpolar 🌅 有航道的人,再渺小也不会迷途。 文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5…

flutter创建不同样式的按钮,背景色,边框,圆角,圆形,大小都可以设置

在ui设计中,可能按钮会有不同的样式需要你来写出来,所以按钮的不同样式,应该是最基础的功能,在这里我们赶紧学起来吧,web端可能展示有问题,需要优化,但是基本样式还是出来了 我是将所有的按钮放…

洛谷 P3252 [JLOI2012] 树

读题就读趋势了&#xff0c;还以为是每个深度都可以选一个&#xff0c;然后深度升序就可以了&#xff0c;以为是个按深度的01背包。 但是前面还说了是一条路径&#xff0c;路径是不能断开的。那就从每个点开始爆搜一次就好了。 看了一下范围n<1e5&#xff0c;n^2爆搜理论上…

智能座舱架构与芯片- (13) 软件篇 下

四、面向服务的智能座舱软件架构 4.1 面向信号的软件架构 随着汽车电子电气架构向中央计算-域控制器的方向演进&#xff0c;甚至向车云一体化的方向迈进&#xff0c;适用于汽车的软件平台也需要进行相应的进化。 在传统的观念中&#xff0c;座舱域即娱乐域&#xff0c;座舱软…

2023.11.22使用flask做一个简单的图片浏览器

2023.11.22使用flask做一个简单的图片浏览器 功能&#xff1a; 实现图片浏览&#xff08;翻页&#xff09;功能 程序页面&#xff1a; 程序架构&#xff1a; 注意&#xff1a;在flask中常会使用src“{{ url_for(‘static’, filename‘images/’ image) }}”&#xff0c…

4D毫米波雷达和3D雷达、激光雷达全面对比

众所周知&#xff0c;传统3D毫米波雷达存在如下性能缺陷&#xff1a; 1&#xff09;静止目标和地物杂波混在一起&#xff0c;难以区分&#xff1b; 2) 横穿车辆和行人多普勒为零或很低&#xff0c;难以检测&#xff1b; 3) 高处物体和地面目标不能区分&#xff0c;容易造成误刹…

基于SSM的进销存管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

ArcGIS如何处理并加载Excel中坐标数据?

做GIS行业的各位肯定免不了跟数据打交道&#xff0c;其中数据的处理说复杂也复杂&#xff0c;因为我们要花时间去做数据的转换及调整工作&#xff0c;那说简单也简单&#xff0c;因为我们有很多的工具可以使用&#xff0c;那么今天我就给大家带来处理Excel中的GIS数据中的其中一…

Windows to Go U盘系统制作(未测完成)

三、Windows U盘系统制作 1、下载windows镜像&#xff0c;并通过Windows To Go方式制作&#xff0c;具体选项参考下面截图 2、选择Windows版本 3、配置Windows 体验相关参数

基于SSM的网络财务管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

ArkTS基础知识

ArkTS基础知识 ArkUI开发框架 ArkTS声明式开发范式 装饰器&#xff1a; 用来装饰类&#xff0c;结构体&#xff0c;方法及变量。如&#xff1a; Entry&#xff1a;入口组件 Component &#xff1a;表示自定义组件 State 都是装饰器&#xff1a;组件中的状态变量&#xff0c;该…

[机缘参悟-119] :一个IT人的反思:反者道之动;弱者,道之用 VS 恒者恒强,弱者恒弱的马太效应

目录 前言&#xff1a; 一、道家的核心思想 二、恒者恒强&#xff0c;弱者恒弱的马太效应 三、马太效应与道家思想的统一 3.1 大多数的理解 3.2 个人的理解 四、矛盾的对立统一 前言&#xff1a; 马太效应和强弱互转的道家思想&#xff0c;都反应了自然规律和社会规律&…