[学习笔记]刘知远团队大模型技术与交叉应用L5-BMSystem

为什么需要BMTrain?
PLM越来越大。为了使训练更高效和廉价。我们有必要
1.分析GPU的显存去哪了?
2.理解GPU间的合作模式是如何的?

在这里插入图片描述

显存都去了哪里?

CPU vs GPU

CPU适合复杂逻辑运算。GPU适合大量重复的数值运算。

在这里插入图片描述

显存成分

1.前向传播时,模型参数
2.反向传播时,模型梯度
3.中间过程的计算
4.优化器

在这里插入图片描述

GPU间的合作模式

数据并行-Data Parallel

参数服务器的参数会被复制到所有显卡上
数据切成三份,分别给每张显卡
最后聚合后的梯度传回参数服务器
PS:实际上参数服务器在0号显卡上
在这里插入图片描述

广播算子

在这里插入图片描述

规约

在这里插入图片描述

All Reduce

规约的结果广播
在这里插入图片描述

Reduce Scatter

在这里插入图片描述

All Gather

在这里插入图片描述

分布式数据并行

这样就不需要要参数服务器。
在这里插入图片描述
使用数据并行,使模型中间结果量降低了
在这里插入图片描述

模型并行-Model Parallel

一张GPU可能无法放下模型所以的参数和梯度和优化器。

由于矩阵乘法可以进行分解。将大矩阵切成小矩阵。
在这里插入图片描述
但是这样要保证每张GPU上的数据是一样的。
梯度需要拼接,所以需要All gather算子。
在这里插入图片描述
中间结果没有减少。但是模型参数和梯度和优化器参数减少了。
在这里插入图片描述

ZeRO Redundancy Optimizer

是基于数据并行的架构。

在这里插入图片描述

Zero阶段1

每张显卡更新一部分模型参数。
最后拼接每部分得到的模型参数。
在这里插入图片描述

Zero阶段2

继续优化。
阶段1需要在反向传播获得梯度后,进行reduce scatter。

由于优化器只需要用到gradient*。所以中间的gradient可以从显存中移除。
移除的时机是在进行反向传播的过程中。
在这里插入图片描述

Zero阶段3

继续优化。
前面数据并行并没有解决模型参数存储在GPU上的问题。
为此,前向传播过程中需要进行All Gather操作。
用完所有参数时,就进行释放。
PS:Zero3相比Zero2是用时间换空间的方法。
在这里插入图片描述

比较

在这里插入图片描述

流水线并行-Pipeline Parallel

模型不同的层分到不同的GPU。
弊端是:1号显卡工作时,后面的显卡处于空闲状态。
有一些方法是优化以解决资源浪费问题的。
在这里插入图片描述

优化技术

混合精度训练

FP16的数值表示范围更小,但是计算更快。
一般FP32。但是有时候也可以从FP32转到FP16。
将入梯度乘以学习率小于FP16的最小范围,那么可能产生下溢。它对参数的更新就会被忽略。
所以需要把参数更新量表示为FP32。
在这里插入图片描述
具体上,在混合精度训练中,为了加速前向和反向传播,会使用FP16的梯度。然后更新参数量用FP32进行累计。最后参数用FP16。
在这里插入图片描述

Offloading

优化器的参数可以放在CPU中。
通过把一张显卡绑定在多张CPU上,可以将每张CPU上的计算量降低。能够让CPU不会成为模型训练的瓶颈。
在这里插入图片描述

Overlapping

GPU中,memory操作一般是异步的。先给memory发送请求,然后进行其他计算,完了之后对memory请求进行接受。

在这里插入图片描述

Checkpointing

为了支持反向传播,需要保存中间结果。
通过设置检查点,只保留每个transformer层的输入。反向传播时,进行重计算,临时每个大层所有线性层的输入。
过了一层,就可以将检查点和临时重计算的中间结果从显存中扔掉。
在这里插入图片描述

BMTrain-使用介绍

表现:高效,便宜
在这里插入图片描述
使用时只需要进行简单替换。

BMCook

背景介绍

介绍大规模预训练模型压缩的相关技术。以及相关工具包BMCook。
下表是PLMs模型增长的趋势。
在这里插入图片描述

如何将大规模的计算量降下来,同时保留PLMs学习到的能力。
所以希望将大规模模型压缩。同时小模型基本上继承大模型的能力。
有效的方法可能包括:知识蒸馏;模型剪枝;模型量化;模型的专家化
在这里插入图片描述

知识蒸馏

假设:小模型只是去拟合大模型在输入空间的一个子空间的z映射。
teacher模型提供soft label,可能比直接提供金标准让student模型去学习,效果会更好。
在这里插入图片描述
第一篇关于PLMs的知识蒸馏的论文是PKD。
它的改进是student模型可以对teacher模型的中间层进行学习。

在这里插入图片描述
下面的工作进一步探索了老师模型中可以用做蒸馏计算的信号。

在这里插入图片描述

模型剪枝

剪枝可以分为非结构化剪枝和结构化剪枝。
研究发现,非结构化剪枝对计算的加速效果非常有限。
所以一般而言,对加速有用的是结构化剪枝:一次性将矩阵的一列或一行或一块删掉。
在这里插入图片描述

基于PLMs的剪枝工作和观察

对bert进行剪枝。
在这里插入图片描述

PLMs结构化剪枝的工作

注意力层剪枝。
在这里插入图片描述
在这里插入图片描述

层剪枝:随机dropout一些层
在这里插入图片描述

模型量化

神经网络并不需要很高的精度进行计算。所以考虑将浮点表示转化为定精度的表示。
这样可以把表示的位数和计算的位数降下来。
在这里插入图片描述

量化在研究方面的挑战

下图展示了不同的定精度表示对模型性能的影响。
在这里插入图片描述

其他模型压缩方法

参数共享-Weight Sharing

在这里插入图片描述

低秩分解-Low-rank Approximation

在这里插入图片描述

结构搜索-Architecture Search

在这里插入图片描述

BMCook-使用介绍

现在的PLMs是十分过参数化的。有一些方法被用于提高模型效率。
BMCook是一个工具包。它的目的是结合已有的有效的模型压缩方法,加速现有大规模模型。

在这里插入图片描述

BMInf

背景介绍

在部署大模型CPM2的demo时,遇到了一些问题:
1.对于单个应用的实力,就需要4块A100的GPU来推理。
2.单词请求需要10秒才能处理,即qps=0.1。
3.成本很高。4块A100一天费用为1200。
于是考虑能否在用户自己的电脑上把大模型跑起来。
市面上常见的GPU是GTX1060。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

面临的困难

1.大模型有很高的显存占用
2.大模型推理需要的算力要求很高。
在这里插入图片描述

深入理解Transformer

分析Transformer可以发现。模型推理过程中,大量时间在进行线性层运算。
在这里插入图片描述
所以要考虑如何优化线性运算。
在这里插入图片描述
考虑如何在允许一些精度损失的前提下,来优化整个线性层的运算效率。
在这里插入图片描述

量化-Quantization

将浮点数缩放到-127到127的范围内,这样就能用INT8来近似表示。
在这里插入图片描述
在这里插入图片描述
这种方法在模型尺寸小的时候还行,但是在Transformer上效果不好。原因可能是矩阵中有好几百万数字,只用一个缩放因子效果不好。因为相当于原本有好几万个值,但是直接变成只能是-127到127的值,表达能力下降。

更精细缩放

进行细粒度缩放,如行矩阵进行缩放。
在这里插入图片描述
优化后。
在这里插入图片描述

内存调度-Memory Scheduling

参考虚拟内存。将CPU也利用起来。
可以将暂时不用的参数放在CPU上。
在这里插入图片描述
在这里插入图片描述
实际测试发现:传输一层的时间往往超过计算一层需要的时间
所以考虑2层用于调度,其他n-2层固定
在这里插入图片描述
尽量扩大加载2层的间隔。

在这里插入图片描述
在这里插入图片描述

BMInf-使用介绍

表现

在这里插入图片描述

用法

在这里插入图片描述

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值