人工智能导论 第 4 章 · 第五节
课程 › 第 4 章 › 第五节 分布式训练数据并行模型并行三种并行对比三种资源FSDP浮点格式混合精度
第 4 章 深度学习新方法 · 第五节

分布式训练与混合精度

很多张显卡一起算,在合适的地方用短一点的数
本 节 知 识 点
  1. 32分布式训练:把任务拆开
  2. 33数据并行:分数据
  3. 34模型并行:切模型
  4. 35三种并行方式对比
  5. 36计算、通信与显存的平衡
  6. 37完全分片数据并行
  7. 38浮点数:位数怎么分
  8. 39自动混合精度训练
32
第 4 章 · 第五节

分布式训练:把任务拆开

一台机器放不下的训练任务,拆给很多台机器一起做。

第 32 页课件

关键术语

分布式训练Distributed Training
把一个庞大的训练任务分给由很多计算节点组成的集群,一起完成。
GPUGraphics Processing Unit
图形处理器,就是显卡上的芯片,擅长同时做大量简单的乘法和加法。
规模定律Scaling Law
模型越大、数据越多、算力越足,效果通常越好的经验规律。

重 点为什么非拆不可

前沿模型的参数量增长得很快,单张显卡的显存远远跟不上。模型一张卡放不下,训练一次也要算很久,只能让成百上千张卡分工合作。

33
第 4 章 · 第五节

数据并行:分数据

每张卡放一份完整模型,各算一部分数据,再把结果合起来。

第 33 页 数据并行(Data Parallelism)

4 张显卡一起训练一批 1024 张图

一批 1024 张图GPU 1完整模型 + 256 张GPU 2完整模型 + 256 张GPU 3完整模型 + 256 张GPU 4完整模型 + 256 张4 份梯度求平均4 张卡用同一个平均梯度更新参数
  1. 拆数据 一批 1024 张图平分成 4 份,每张卡拿 256 张。
  2. 各算各的 每张卡都有一份完整的模型,用自己那 256 张图算出一份梯度。
  3. 求平均 把 4 份梯度加起来再除以 4。
  4. 一起更新 4 张卡用同一个平均梯度更新参数,更新后 4 份模型仍然完全一样。

关键术语

数据并行Data Parallelism
常简称 DP,每张卡放完整模型,处理不同的数据。
批次Batch
每更新一次参数之前,模型要看的一组样本。

打个比方

四位老师分头批改同一场考试的卷子,每人手里都有一份完整的评分标准,各改一摞。改完碰个头,把各自发现的问题汇总起来,一起修改评分标准,保证四个人的标准始终一样。

随堂练习

用 8 张卡做数据并行,一批数据有 1024 张图,每张卡分到多少张?

  1. 1024
  2. 512
  3. 128
  4. 8
查看答案
答案 C。1024 ÷ 8 = 128。每张卡都放着完整的模型,只是分到的数据不同。
34
第 4 章 · 第五节

模型并行:切模型

模型大到一张卡放不下,就把模型本身切开。

第 34 页 模型并行:流水线并行与张量并行

两种切法

流水线并行:按层切GPU 1第 1、2 层GPU 2第 3、4 层GPU 3第 5、6 层GPU 4第 7、8 层张量并行:把一层切开这一层的输入GPU 1算左半边GPU 2算右半边同一层,一分为二拼成完整结果
流水线并行

把 8 层的模型按层切成 4 段,每张卡负责 2 层。数据从第 1 张卡流到第 4 张卡,像工厂的流水线。常用在不同机器之间。

张量并行

把一层里的一大块乘法和加法切成两半,两张卡同时算,再把结果拼起来。两张卡要频繁交换数据,通常放在同一台机器里,靠高速连线通信。

关键术语

流水线并行Pipeline Parallelism
把模型的不同层分给不同的卡。
张量并行Tensor Parallelism
把同一层内部的计算拆给不同的卡。张量就是一大块排成多维的数。

打个比方

流水线并行像汽车装配线,第一个工位装底盘,第二个工位装车身,车一辆接一辆往下传。张量并行像两个人合抬一张大桌子,必须同时用力,靠得很近,配合很紧。

35
第 4 章 · 第五节

三种并行方式对比

切什么不一样,卡与卡之间交换数据的频繁程度也不一样。

第 35 页 深度神经网络并行计算方法对比

切数据,切层,还是切一层的内部

数据并行流水线并行张量并行
切的是训练数据模型的层一层内部的计算
每张卡放完整的模型其中几层每层的一部分
多久交换一次低:每轮结束同步一次梯度中:相邻两段之间传中间结果高:每算一层都要交换
主要麻烦卡越多,同步梯度越费时有的卡要空等上一段通信太频繁,很难扩展到很多卡
三种方法可以一起用。训练大模型时,常常是一台机器里用张量并行,几台机器之间用流水线并行,再把这样的一组组机器用数据并行复制很多份。

关键术语

流水线气泡Pipeline Bubble
流水线刚开始和快结束时,有的卡没有活干只能空等,这段空闲就是气泡。
通信Communication
显卡之间传送数据。卡越多、传得越频繁,花的时间越多。

随堂练习

哪种并行方式要求每张卡都能放下完整的模型?

  1. 数据并行
  2. 流水线并行
  3. 张量并行
  4. 三种都要求
查看答案
答案 A。数据并行的每张卡都放一份完整模型,只是分到的数据不同。另外两种方式都是把模型切开,每张卡只放一部分。
36
第 4 章 · 第五节

计算、通信与显存的平衡

三种资源可以互相交换,省下一样,就要多花另一样。

第 36 页 进阶技巧:计算、通信、显存的平衡

每种技巧都在拿一样换另一样

计算显存通信多算一遍,少存一些先压缩,再传出去分开存,用时再取
技巧拿什么换什么怎么做
激活重算多花计算,省显存正向算出的中间结果不全存,反向要用时再算一遍
FSDP多花通信,省显存模型切碎分给各张卡保管,用到哪块临时取来
内存卸载多花搬运,省显存暂时用不上的数据搬到电脑的内存里放着
通信压缩多花计算,省通信数据先压缩或量化变小,再传给别的卡

关键术语

中间结果Activation
数据经过每一层后得到的结果,也叫激活值,反向算梯度时还要用。
FSDPFully Sharded Data Parallel
完全分片数据并行,下一页细讲。

打个比方

做一道很长的计算题,草稿纸不够用。可以把每一步的中间结果都记下来,多占纸。也可以只记关键几步,需要时再重算一遍,多花时间。显存像草稿纸,激活重算选的是后一种。

37
第 4 章 · 第五节

完全分片数据并行

模型切碎分给各张卡保管,用到哪块临时取哪块。

第 37 页 通信换显存:完全分片数据并行(FSDP)

10 亿个参数的模型,4 张卡一起训练

普通数据并行FSDP16卡116卡216卡316卡44卡14卡24卡34卡4柱子上的数:每张卡要放的显存(GB)四种颜色是 16 GB 分成的四片,虚线框是这张卡不再存放的部分
普通数据并行

每张卡都存一整份:参数、梯度、优化器要记的数,合计约 16 GB。四张卡存的内容一模一样。

FSDP

把这 16 GB 切成 4 片,每张卡只保管一片,约 4 GB。算到某一层时,临时把这一层的参数从别的卡取来,用完就放掉。

省下的显存可以用来训练更大的模型,代价是每算一层都要多一次卡与卡之间的传送,这就是用通信换显存。
按常用的混合精度训练方式,每个参数连同梯度和优化器状态约占 16 个字节,10 亿个参数就是约 16 GB。图中没有算上中间结果。

关键术语

完全分片数据并行Fully Sharded Data Parallel, FSDP
把参数、梯度和优化器状态都切片,平均分给所有显卡保管。
优化器状态Optimizer State
优化器为每个参数额外记下的几个数,比如最近几步梯度的平均,用来决定每一步走多远。

打个比方

一个车间四个工位,以前每个工位都配一整套工具,大部分时间闲着占地方。现在每个工位只放四分之一,要用别的工具就去隔壁借,用完马上还。地方省了,代价是多跑几趟。

38
第 4 章 · 第五节

浮点数:位数怎么分

指数位管能表示多大,尾数位管能分多细。

第 38 页 AI 常用浮点数精度格式

同样是记一个数,三种记法

FP3232 位FP1616 位BF1616 位符号:正负指数:管范围尾数:管精细
格式最大能表示把 100.7 存进去常用在
FP32约 3.4 × 10³⁸100.7存参数、更新参数
FP1665504100.6875混合精度训练、推理
BF16约 3.4 × 10³⁸100.5大模型训练的主流
FP16 超过 65504 就变成“无穷大”,这叫上溢。BF16 把位数挪给了指数,范围和 FP32 一样大,只是刻度粗一些,存 100.7 时差了 0.2,FP16 只差 0.0125。训练时的数忽大忽小,范围比精细更要紧。
还有更短的 FP8、FP4 等格式,主要用来让训练和推理更快。

关键术语

浮点数Floating Point, FP
计算机记小数的方式。FP32、FP16 就是 32 位和 16 位的浮点数。
BF16Brain Floating Point 16
谷歌大脑团队提出的 16 位格式,指数位和 FP32 一样多。

打个比方

指数位像尺子的长度,尾数位像尺子上的刻度。量一栋楼,宁可用刻度粗但足够长的尺子,也不要刻度很细却只有十厘米的尺子。

随堂练习

训练中算出了一个数 70000,用哪种格式存会上溢变成无穷大?

  1. FP32
  2. FP16
  3. BF16
  4. 三种都会
查看答案
答案 B。FP16 最大只能表示 65504,70000 超出了范围。FP32 和 BF16 都能表示到约 3.4 × 10³⁸。
39
第 4 章 · 第五节

自动混合精度训练

算的时候用 16 位,存参数和更新参数用 32 位。

第 39 页 自动混合精度(AMP)

一轮训练里,哪一步用哪种格式

① 复制把 FP32 的参数
复制成 FP16
→
② 正向、反向用 FP16 算,
又快又省显存
→
③ 转回来把算出的梯度
转成 FP32
→
④ 更新在 FP32 的参数上
做更新
参数 1.0 加上一次很小的改动 0.0001结果
用 FP32 记1.0001
用 FP16 记1.0,这次改动被抹掉了
每一步对参数的改动往往很小。如果更新也用 16 位,这些改动会被一次次抹掉,训练几千步模型也不动。所以更新参数这一步必须用 32 位。

关键术语

自动混合精度Automatic Mixed Precision, AMP
训练时自动在不同环节混用 FP32 和 FP16 或 BF16。

打个比方

记账时,平时的流水账写个大概,几十几百地记,快。月底结账用精确到分的总账本,慢一点但不能出错。

知道更多用 FP16 时的一个小技巧

FP16 表示不了特别小的数,比约 0.00000006 还小的梯度会直接变成 0,这叫下溢。常见的办法是先把损失乘上一个大数,比如 1024,算完梯度再除回去。

保山学院·人工智能教研室·曹鼎鼎