在初创公司以至VC齐在纵情囤积GPU的狂热年代,干一件事比囤GPU更有价值——搞理会怎么高效地使用它们。
在NLP模子检修中,存在着好多不透明的“隐性学问”,若是你没在谷歌、微软、Meta等头部大厂干过,那你基本不大可能搞明晰其中的门说念。直到Eleuther AI的出现。
四月,Eleuther AI团队发布博文《Transformers Math 101》,先容怎么期骗简便算式猜想大模子的算力资本,大大抛弃了该界限的信息不合称,在圈内圈外开阔传播,成为该界限最具泰斗性的博文之一。公式如下:
C = τT ≈ 6PD
其中:C暗示Transformer需要的狡计量,单元是FLOP;P暗示Transformer模子包含的参数量;D暗示检修数据限度,以Token数量为单元;τ暗示糊涂量,单元为FLOP 暗示检修期间;
该公式的旨趣如下:
C=Cforward+Cbackward:暗示检修流程中的前后向传播; Cforward ≈ 2PD:前向传播狡计资本约等于两倍的参数量乘以数据限度;Cbackrward ≈ 4PD:反向传播狡计资本约等于四倍的参数量乘以数据限度;
C是一个量化狡计资本的单元,往往用FLOP暗示,亦可用一些新的单元来暗示,如FLOP/s-s:暗示每秒浮点运算数/秒;PetaFLOP/s-days:暗示实质情况下每秒浮点运算数/天。
8月17日,Eleuther AI首席工程师、《Transformers Math 101》的主要作家Quentin Anthony博士,同风险投资公司Decibel Partners 的合资东说念主兼首席技艺官Alessio、Latent Space主持东说念主Swyx进行了一场深度交流,
两边围绕Transformer模子算力评估、混杂精度检修、3D并行、INT8量化、漫步式挑战等NLP前沿话题张开了深度辩论,著作干货很足,信托对想了解Transformer资本、大模子优化技艺等方面的一又友一定大有裨益。

以下为全文内容,全球enjoy~ ✌️
(由ChatGPT翻译,经略微修改)
目次:● 发文动机
● GPU并非越多越好
● 猜想GPT-3检修的狡计量
● AMD GPU:可用,但效劳不高
● 模子精度(FP32、FP16、BF16等)对内存的影响
● 深度学习模子量化的公正
● 怎么狡计优化器的内存使用
● 检修内存的各个组成部分
● 并行检修
● 高等3D并行技艺
● 异构集群漫步的挑战
01 发文动机Quentin:
聊到撰写《Transformer Math 101》一文的动机,就不得不提到我时常会在深度学习检修界限看到一些推特帖子,比如Hugging Face的Stas Bekman,他会发布一些推文,说什么他们刚刚发现了一个神奇数字,一切齐变得快了20%等等。
他们绝顶欣忭,但实质上并不信得过了解发生了什么。对咱们来说,咱们时常发现好多东说念主可能了解AI检修或推理的表面或基应许趣,但莫得东说念主信得过了解像在我方的机器上怎么正确运行漫步在两个GPU上的推理之类的细节。
而咱们,在Eleuther里面蕴蓄了好多札记,并在工程师之间分享,咱们认为,这可能会匡助好多其他东说念主。
这可能不允洽写论文,但对于博客著作或技艺呈报来说,这可能照实能够从已有的硬件中挤出更多性能。
因此,咱们在Eleuther有好多教养,咱们试图以一种大公司们不会选用的边幅将其与东说念主们分享。
Swyx:
是的,这是很少有东说念主会信得过干的事情。领先,写下来需要额外的责任。其次,这是一种买卖微妙,因此很少有东说念主这样作念。
因此,往往了解这些内容的独一方法即是实质在大型模子实验室中责任。而你们,作念了好多稀零的事情。我独一能意想的其他另一个情况是Facebook的OPT。还有什么雷同的技俩,不错分享交流教养,但不是细致的研究学问呢?
Quentin:
我会说是Bloom。比如Hugging Face的Bloom技俩在大科学界限等方面,这种绽放进度绝顶高。
我合计,OPT和Bloom的级别疏导,以至更详确。
除此除外,我想微软有一个有计划他们的Turing NLG的文档。他们的著作读起来绝顶无为,也照实谈到了责任中的一些挑战。除了OPT, Bloom和咱们,我想不出其他的了。这是一个新事物。
Swyx:
贫乏的是,你们正追求富足好的教养法例。我认为,好多东说念主试图追求精准,但过于精照实质上并不有匡助。
Quentin:
是的,你会在博客著作中看到一些雷同表述。你知说念,咱们不会进一步详确辩论每个小的内存部分,鼠腹鸡肠的话可能需要额外的一个月。然而,得到富足好的休止对东说念主们仍然有匡助。
02 最少GPU数量,是最好有筹画Alessio:
聊回您在《Transformer Math 101》一文中给出的猜想方程,这里的中枢方程式不是狡计资本,而是滚动Transformer模子所需的狡计,梗概等于τ乘以T,其中τ是糊涂量,单元为FLOPT暗示检修期间,然后T是耗尽的期间。
我认为东说念主们不错很容易地联想这一丝。基本上是你有若干个GPU,你让它们运行多万古间。
之前在Chinchilla论文和OpenAI的限度定律中,有雷同的内容,你在博文中也提到了这一丝。
咫尺,东说念主们在构建模子时应该怎么有计划这个问题?当他们驱动有计划检修我方的基于Transformer 的模子时,他们应该从那里找到这个方程?
Quentin:
东说念主们往往从数据集驱动,你有一些数据集,然后你想在基于此检修一个模子。
让咱们驱动平定想考,一驱动,从6PD的角度来看,每个参数梗概有6个令牌与之对应。因此,这决定了我的模子大小,以此为Chinchilla Optimal。
从其时起,咱们发现为了取得细密的质地模子,需要更多的令牌,可能会提升20个。
但从系统的角度来看,你们应该有计划的下一个问题是,这个模子需要多万古间来检修?我应该有什么样的预算?
假定我需要一些云实例,执续一段期间,每个实例齐有一个附加的价钱。这即是糊涂量的用武之地。
咫尺,你有了这个模子,这个参数数量,你应该将它映射到一个Transformer架构,并在该模子类型的软件栈上基准测试你的糊涂量,接着你不错在单个GPU上竣事每秒的FLOPS。
然后把柄并行性有筹画(我信托咱们会详确辩论的,举例数据并行性或张量并行性等),这个FLOPS数将怎么膨大到不同数量的GPU?
从这里,你将得到一个期间。进而,得到了期间,就能算出资本。
这些齐是你不错使用这个公式得到的买卖谜底。这即是为什么咱们将其分红了T和糊涂量术语,以便你不错解出其中之一,往往是取得糊涂量、期间,从期间算出资本。简而言之,这即是谜底。
Alessio:
我细心到另一件事,你提到一些这些定律,只在1个小时内使用1000 GPU的资本与1个GPU运行1000小时的资本疏导才诞生。
有计划咫尺咱们缺少多数GPU的实质情况,在这方面,对于东说念主们怎么优先有计划这一丝,你有什么想法吗?
Quentin:我会说,领先应该找出刚好能容纳你的模子的最小GPU数量。
若是您在检修一个绝顶大的模子,内存瓶颈是你最大的问题。若是只在检修一个小模子,那没东说念主会真贵。
大多数东说念主关怀的模子,齐需要分拨到多个GPU上。因此,找到允洽你的模子的一个实例的最小gpu数量,然后狡计需要多万古间。若是是期间合理,那么你完成了。若是期间太长,那么你就需要驱动有计划使用多个模子实例。
我老是合计,东说念主们应该聘用最极少量的GPU。你领有的GPU数量越多,出现问题的可能性就越大。
是以我会说,唯有找出什么期间对你来说是合理的,然后将gpu的数量与之匹配,而不需更多。
东说念主们往往会变得盘算,他们会说,若是我有两倍的GPU,我不错在半个期间内完成这项责任。但事实上,最终可能花了三倍期间,因为每天齐会出现各式问题。其时,可能需要糟糕地在午夜期间起床,加班加点抢修你的模子。
Swyx:
你们会不会有一个雷同的开源框架,来匡助gpu线性膨大?照旧说,这样想过于简便化了?
Quentin:
Mosaic和咱们齐有一种不错表面上细密膨大的软件堆栈配置,一会我会详确辩论。
Mosaic完全基于优化器分片。它基于ZeRO。因此,你完全将模子优化器、参数和梯度漫步在整个不同的GPU上。你的团聚内存即是参数数量除以GPU数量。优化器和其他内容亦然一样。
而咱们在Eleuther使用了Megatron DeepSpeed的库,会愈加复杂。因此,效劳可能会更高,但也更容易出现故障。
在这两种情况下,回到实质情况,通过增多更多的GPU应该能够取得线性加快。但问题是会出现硬件故障。
若是有太多的GPU,你可能会有问题,举例亏损会溢出,或者一个GPU挂掉,你就可能碰到软件问题、同步问题等。
这即是我为什么说,实质上你应该中式你领有的最小GPU数量,因为这些情况更容易调试。
Alessio:
另一件事情是,电脑就像在前向和后向传递,前向是2PD,后向是4PD。为什么两者之间的比率是如斯?你能解释一下吗?为什么是两倍的数量?
Quentin:
简便来说,对于前向传播,您仅仅在移动,您正在通过该层上前传播输入。
而在后向传播中,你要作念的事情比这更复杂一些。你正在作念反向传播。我认为我无法富足直不雅地解释它,需要数字上进一步深远探讨。
Swyx:
实质上,反向传播的速率很低。老诚说,这是我心爱深度学习数学的最基本的原因之一,与大学微积分中遭受的其他数值方法比拟,深度学习的数学令东说念主惊诧地高效。
Alessio:
我认为另一件事是,事情听起来很简便,你知说念,当东说念主们在Twitter上说,哦,20是最优的比率,然后即是,好吧,为什么是阿谁数字呢?
谜底往往要困宝贵多,就像咱们咫尺看到的。是以我认为这是一个很好的提醒,数字听起来简便,就像整个最好和最受迎接的数学方程一样,绝顶优雅。不外,显着,背后的证据并不那么容易。
02 猜想GPT-3检修的狡计量Swyx:
我想略略测试一下这个方程。咱们不错从GPT-3的角度或GPT-NeoX的角度来作念。你有实质浮点运算和表面浮点运算之间的分歧。
好多时候,当东说念主们呈报检修一个模子所需的浮点运算量时,就像咱们刚刚在Lama 2中看到的那样,估算的数值即是浮点运算量。
比如,GPT-3需要3.14 x 10的23次浮点运算。这是表面浮点运算。我想弄明晰一个数值是否经得起推敲。
我想知说念怎么作念到这一丝,因为我应该能够将这个方程代入其中,对吧?我知说念GPT-3是基于3000亿tokens进行检修的。
我知说念模子的参数大小是175。是不是唯有狡计一下6 x 175 x 300就行了?
Quentin:
表面浮点运算往往是把柄给定的硬件配置得出的,这是你瞻望硬件不错竣事的。
但问题在于,实质上,咱们往往会有一些闲置期间,举例恭候从GPU到CPU的数据传输,或者恭候跨不同GPU之间的同步。是以检修时候你会花掉好多稳定期间。
Swyx:
闻起来怎么样。(注:成果怎么?)
Quentin:
我不信服我是否有一个我方的"闻起来怎么样"的尺度,
坦荡说,也许我会查抄像在A100上生机的一些浮点运算量。
事实上,在某种进度上,对于给定的GPU类型,每个东说念主齐知说念不错生机若干浮点运算量。
举例,对于A100来说,这个数值梗概在100到180之间。对于较旧的GPU类型V100,这个数值可能在30到40之间。
东说念主们往往会把柄运行深度学习的内核来信服应该生机的浮点运算量。然后,将这个与东说念主们呈报的表面浮点运算量进行比较,看是否与你的预期相符。
03 A100 基线尺度:115+ TeraFLOPS/secAlessio:
在著作中,你提到对于A100来说,若是你的浮点运算量低于115 TeraFLOPS/秒,那么你的模子或硬件有问题。
你是怎么得出这个115的?是不是把柄实质不雅察和教养,你在以前的几个月里见到的平均水平?你是怎么得出这些数字的?
Quentin:
对于这个数字,基本上,咱们比较了好多不同的框架。就像我之前提到的,Mosaic有他们我方的框架,咱们也有我方的框架。它们齐有我方的浮点运总共数器。
咱们看到,在许多不同的硬件配置上,若是你正确调理配置,你应该在险些整个情况下齐能得到提升115的浮点运算量。
是以,若是某个数值低于115,那么你的软件信服有问题。但这实质上即是比较不同的软件堆栈和硬件系统。
04 AMD GPU:可用,但效劳不高Alessio:
不同的GPU有什么不同吗?
上周,咱们邀请了George Hotz,他谈到了AMD显卡,以及表面上他们的浮点运算要比一些Nvidia显卡好得多,但实质上,CUDA运行时会弥补这一差距。
东说念主们应该怎么有计划这一丝?你知说念,像A100的浮点运算量达到115 TeraFLOPS。我是否应该坚执使用它?
Quentin:
这波及到开采者的期间,哪个更烦闷,归根结底,AMD和Rockham的软件堆栈还有很长的路要走。
我会说,大多数东西齐不错在那里运行,但效劳不高,而且你可能会遭受以前莫得遭受过的奇怪乖张。
聘用使用Nvidia和PyTorch的软件堆栈的一个贫乏优点是,有千千万万个GitHub问题与你靠近的疏导问题,而且,以开源边幅快速科罚这些问题,这可能是咫尺聘用Nvidia软件堆栈的最大上风。
AMD的硬件与Nvidia绝顶,但软件不太一样,而且他们在开源界限的势头还莫得完全发展起来。
举例,像Flash Attention这样的功能在更多Nvidia GPU类型上的应用要比在AMD上的应用要多。恭候这些最新的功能在AMD上竣事,对好多东说念主来说是一个拦阻,但它正在发展壮大。
我咫尺正在AMD上运行好多实验,因为它依然投入了政府实验室的超等狡计机。是以好多实验咫尺齐在那里进行,而且我瞻望它会在几年内赶上来。
05 模子精度(FP32、FP16、BF16等)对内存的影响(注:一般情况下,狡计机在进行浮点运算时所选用的是FP32(单精度),其中8位用于存储整数部分,23位存储极少部分,因此其不错存储高精度浮点数。
因此,在显存优化场景下,阵一火浮点运算的精度不错缩小存储量。)
Alessio:
让咱们略略谈谈内存需求。是以你之前略略提到过这个问题,在这之前,咱们在播客上也谈到了FlashAttention,内存速率是咱们的主要关注点之一,但此次咱们受制于实质的内存大小,即是VRAM自身,稀零是在模子权重、参数、优化器状态等方面。咱们不错次第辩论一下,有好多内容需要涵盖,但有时咱们不错从模子权重驱动。
以前,咱们在以前的许多辩论中时常波及的一个主题即是精度和量化,这显着是内存的主要身分之一。
你在著作中提到,大多数Transformer齐是混杂精度,如FP16加FP32或BF16 FP32,它们不错进行更动,而且不错进行高达INT8的量化,而不会对性能形成太大的影响。也许,咱们不错解释一下一些数学和不同精度之间的字节参数比率?
Quentin:
当我驱动入行深度学习时,一切齐是FP32。每个参数需要32位,即4个字节。事情绝顶简便。你不需要进行任何亏损缩放。
但问题是,一朝NVIDIA切换到了V100并引入了Tensor中枢,FP32就弗成提供太多的浮点运算。Tensor中枢在FP16精度下施行整个狡计。
因此,若是你在FP32下进行操作,你实质上猝然了整个这些。是以一朝硬件迁徙到V100,软件就会切换到混杂精度,如APEX和AMP等。混杂精度的一个让东说念主出东说念主意料的部分是,实质上在检修时你需要更多的内存,因为你需要一个FP16版块的权重副本和一个FP32版块的权重副本。
FP16是在Tensor中枢上进行实质狡计的场所。因此,你可能得到的糊涂量可能是FP32的两倍。然后在每个法子中,使用FP16更新FP32的副本,两者齐需要存储在内存中。
问题在于,FP16绝顶精准,但动态范围不太大,
因此,若是从浮点的角度来看,你有一个绝顶大的余数,但莫得太多的指数。是以BF16将更多的位数从余数移到指数中。也即是说,你有更大的范围和较低的精度。
这抛弃了许多不踏实性问题和亏损缩放等问题,对于任何老到调试的东说念主来说,齐知说念它有何等不踏实,尤其是在大限度检修中。而BF16则减少了好多这种问题,但只在A100上受救济。是以你看到了硬件和软件之间的往复变化。
每次NVIDIA引入一些新的Tensor中枢或BF16救济之类的功能,软件就会适并吞驱动救济它,然后检修适合。然后你咫尺提到了Ind8等。
咫尺,咱们看到一些模子依然在FP16、FP32或其他方式下检修,然后咫尺你想将该模子尽可能地量化为像Ind8这样的更小的暗示,同期又保执最小的损结怨精度。
实质上,咱们发现,由于深度学习是一个如斯具有立时性的问题,许多这些临了的精度位实质上并不贫乏,我认为这种情况将会执续下去。
06 深度学习模子量化的公正Alessio:
具体一丝,当你有一个FP32时,在推理时每个参数需要四个字节的内存来加载它。若是你有一个量化成八位的模子,你只需要一个字节来暗示每个参数。举例,在一个80GB VRAM的A100上,你不错放下700亿个参数的八位模子,而你无法放下一个FP32模子,因为你需要梗概280GB的内存。这会有多大影响?
你刚刚提到刚驱动时齐是FP32,若是有一个带有1TB VRAM的GPU,东说念主们会只将内存加载为FP32权重吗,照旧他们仍然会但愿将它们量化以使其愈加高效?是的。
Quentin:
我认为,即使你有无尽的VRAM,你仍然会想要一个量化模子,仅仅一个更大的经过量化的模子。
因为正如我刚刚提到的,在临了,深度学习口舌常立时的,好多时候,你可能领有寰宇上整个的精度,然而当你仍然绝顶依赖输入时,这些精度实质上是没故酷爱的。你在很猛进度上依赖于输入的细小变化,也许更多的检修数据样本会愈加贫乏。
在深度学习中,总体上,这些细小的精度并不是很贫乏的,贫乏的是举座的画面。阿谁神经元实质上在说什么?而不是它可能在想什么细小的细节。我还想提到,即使你领有A100,实质模子的大小要比你提到的要小得多。
这是因为KV缓存。是以KV缓存在推理流程中,只在推理流程中起作用,联想一下,若是你在写一段话,你想要在写下一个词之前记取之前写过的每一个单词。
是以什么是自转头言语建模?它即是填充下一个词、下一个标志。若是我说"the dog went to the",然后我需要写下一个词,我可能会写"park"之类的。在我写下一个词之前,我的挂牵会被撤废,然后我必须再行阅读整个这个词句子。
这即是莫得KV缓存的情况。KV缓存则是说,在推理流程中,记取我之前生成的整个内容,以及我之前生成内容的整个高下文。然而KV缓存的内存支拨往往与模子的内存支拨绝顶,或在某些情况下以至更大,稀零是在高下文很长的情况下。
我认为具体的狡计公式大致是,哦,是雷同于两倍的层数乘以头数乘以每个头的维度,然后有两个这样的部分,一个是K,一个是V。简要来说,能够即是这样。
Alessio:
我知说念,这是Transformer中的数学办法,不外,对于RNNs,也有一些真义的场所,比如隔离跟着序列长度增多而增多的KV缓存,而是使用固定的序传记递。
我知说念,东说念主们正在研究这些方面的内容。
Quentin:
我参与过的一篇论文叫作念RWKV,我提出东说念主们阅读。它回话了这个果真的问题。那么,如安在不增多Transformer所需的二次细心力支拨的情况下取得Transformer质地?这是真义的,我提出东说念主们阅读这篇论文原文。
Swyx:
咱们实质上依然和RWKV的中枢成员进行了一次未发布的访谈,他们称之为软细心力或轻量级细心力。我健忘他们具体叫什么了,然而不错近似地暗示,使其线性化而不是二次方的方法。这很棒。
Quentin:
RWKV的东说念主员时常出咫尺Eleuther。
他们与咱们密切合营。我的孝敬是,咱们整个这些对于RNNs的实验是由不同的东说念主完成的,这些实验与Transformer的关系以及咱们怎么将其滚动为一篇论文,以便东说念主们毋庸阅读一年前的Discord日记就能领会发生了什么。
07 怎么狡计优化器的内存使用Swyx:
很棒,咫尺,我想咱们可能要花更多期间在优化器状态和Atom优化器上。当你处理这些优化器时,你的想法是什么?在处理这些优化器时,东说念主们应该记取什么?
Quentin:
我认为,Atom优化器在其界限内是出色的。这是一个比较平常的问题,是以让我想一想。你有权重的副本,然后你有你的动量和方差。
用直不雅的预言来解释一下动量:比如说,你在一个峡谷,你想要到达底部。
若是你仅仅进行基本的立时梯度下落,那么每一步齐会是疏导大小的。而若是你使用带有动量项的Atom,那么你的步幅应该会缓缓变大,因为你不错看到,一般的趋势是咱们正在连忙地向下前进。然而,由于Atom中有整个这些额外的项,你需要更多的内存来存储它。
举例,与SGD比拟,往往需要三倍的内存。若是你在你的优化器状态中耗尽了整个这些内存,那么,你怎么将它漫步到GPU上?
你会发现,在给定的GPU上,实质上比起裸狡计、原始的狡计能力,你更多地受限于并行性。这归结为在将模子分割成需要在许多GPU上分割之前,你能够将若干模子放在单个GPU上。
然后,你会发现耗尽的期间更多地用于它们相互通讯,而不是实质取得阐明。是以,咱们在博文中耗尽了好多期间来辩论怎么漫步你的模子?整个这些不同的漫步政策是什么样的?哪些政策更灵验?有计划到好多内存齐耗尽在了优化器上,你怎么灵验地漫步这个优化器?
好多东说念主在褒贬并行性时,他们褒贬的是模子并行性,即参数自身。实质上,在检修时,绝顶大一部分的内存实质上是耗尽在优化器状态上的。是以你想要深远探讨其中的哪个部分吗?你想要深远探讨零、分片优化器之类的吗?
Alessio:
Quentin,你在博文中提到"Atom是神奇的",实质上,即使对于像你这样与底层很接近的东说念主,有若干内容是实质上的"神奇",有一些东西对你来说仅仅教义?有一些事情是你实质上在有计划在日常责任中进行矫正的吗?
Quentin:
是以我是一个系统工程师,好多这些事情对我来说是神奇的,Atom对我来说是神奇的。
我认为,这即是一个深度学习模子的检修边幅。这即是下一步的狡计边幅。然后我说,好的,怎么使其变得更快?
我会说我会望望怎么通过使用第二阶优化器来矫正它。因为有好多对于这方面的研究,因为它们很难漫步。
然而对我来说,中枢的孝敬老是来自于其他东说念主依然进行了一些深度学习的优化,我需要使其运行得更快。是以我实质上无法褒贬为什么Atom产生了,除非像我刚刚提到的,使用动量的一些简便直不雅的东西。
对我来说,Atom所占用的内存比SGD要多三倍,这一丝很贫乏。整个这些内存齐需要找个场所存放,它需要灵验地漫步。
Alessio:
是以,当你把整个这些加在沿途时,使用普通的Adam优化器,每个参数需要12字节。
然后,你仍然需要在内存中保存模子参数,就像你提到的那样,需要同期保存FB32、FB16混杂量化的两份副本,因此有不同的精度级别。是以每个参数需要6字节,对吧?
Quentin:
再追念一下,大多数东说念主认为模子会变得很大,是以需要纯正的模子并行处理,比如张量并行处理。
但实质上,若是咱们使用FB16,模子每个参数只需要2字节。而优化器自身需要每个参数4字节的模子状态、4字节的动量、4字节的方差。是以更贫乏的是怎么高效地分割优化器以及怎么高效地存储它。
像"bits and bytes"中的8位Adam优化器,每个参数的优化器状态只需要1字节,而不是4字节之类的。这会比将纯FB16模子权分量化到int8之类的边幅,更灵验地缩小模子检修所需的内存支拨。
因此,对于检修来说,优化器内存占用绝顶贫乏,在大多数情况下最为贫乏。
Alessio:
在咱们深远辩论Zero之前,让咱们先总结一下稍后会对参数、优化器状态和梯度进行分片处理。不错简要谈一下这个问题,然后咱们不错辩论如安在GPU上高效地加载它们。
Quentin:
所谓的参数,是参数的FP32副本。
咱们在优化器辩论中将它们包括在内。有些东说念主不这样作念,但仅仅为了明晰起见,优化器状态每个参数需要12字节,其中有四个字节是用于FP32的权重副本。
四个字节是用于动量。我依然解释过为什么存储动量很贫乏,但这亦然每个参数。你需要存储该参数畴昔的前进标的以及它在以前的前进标的。
你还需要知说念,咱们知说念它往哪走,然而在这个峡谷上会有凹下。
是以咱们需要存储它的方差。这些凹下的频率是若干?咱们应该更关注动量吗?照旧这个参数在到处跳来跳去?这些齐是优化器需要存储的贫乏谜底,它是每个参数的。
是以这三个术语齐是针对每个参数的。咱们还包括了一些竞争性的位和字节,举例SGD,以裸露把柄优化器的不同,你不错存储整个或不存储这些,并以不同的暗示边幅存储。08 检修内存的各个组成部分(模子内存、优化器内存、梯度内存、激活内存)Alessio:
我正在查抄总检修内存。您实质上有模子内存、优化器内存、梯度内存和激活内存。我认为,这是咱们辩论的临了一个问题。
是以也许简要塞向东说念主们先容一下,,譬如说行径内存再狡计、查验点等。
Quentin:
在激活查验点之前,可能会变得复杂,你有模子参数,就像我之前提到的一样,它们也曾是FP32。咫尺可能是BF16,或者若是是较旧的GPU,则可能是FP16。然后有优化器。那是许多内存所在的场所。
往往情况下,这是权重的高精度副本,往往是FP32。是以每个参数需要4字节,然后你还有一些可选项,就像咱们刚刚辩论过的,比如动量或方差,或者把柄你的优化器而定的其他内容。
接着是梯度,梯度是在模子前向传递后得到的梯度更新。这将是你低精度权重的副本,若是你使用FP16或BF16,每个参数需要两个字节。
整个这些齐是固定的。这个支拨在检修期间不会消逝。在反向传播梯度后,梯度可能会被撤废,但优化器状态和模子状态不会消逝。
内存支拨将一直存在。动态的是激活再狡计和激活内存。因此,有些东说念主会遭受这样的问题,模子在检修时加载得很好。但当你实质运行第一次迭代,或者运行某个畴昔的迭代之类的时候,你会俄顷发现内存不及。这是因为你及时狡计的这些激活。
Alessio:
再狡计是在什么时候发生的?它是如安在再行狡计和存储之间作念出决策的?
Quentin:
有好多不同的方法,但我会说有几种主要的方法。
领先,是一个绝顶简便的有筹画。你再行狡计整个的东西。你狡计出的每一个激活齐会被使用或肃清,直到休止。是以在这种情况下,你绝顶关怀内存,但对狡计关怀不大。也许这会是一种情况,你必须在许多不同的GPU上漫步,而且你的通讯速率绝顶低。
然后可能是聘用性再狡计。在聘用性再狡计中,Megatron有一篇很好的论文,我认为咱们博客著作中的图表亦然从那里来的。在这种情况下,你为每个激活作念出加权决策。
对于绝顶大的激活张量,你决定,从内存角度来看,是将其保存更烦闷,照旧从狡计角度来看,再行狡计更烦闷?这是Megatron实施的智能有筹画。
他们使用了许多不同的启发式方法。在这里可能莫得必要提到超长的方程式,但若是你对聘用性再狡计感意思意思,你应该去阅读那篇论文。然后大多数东说念主使用的是一个绝顶愚蠢的有筹画,包括NeoX,即是不使用整个这些启发式方法,而是仅仅说,若是我的张量大于X,我就肃清它。然后将X配置为某个固定的数字,即是这样。
对于许厚情况来说,这富足了。
Swyx:
为什么富足呢?
Quentin:
你不但愿存储提升X大小的张量。有些提升了这个休止,有些莫得。你不想挤压。
你更关怀的是让某些张量尽可能地接近实质启发式方法,而不是实质狡计启发式代码,因为你不想花期间编写那些启发式代码。
Swyx:
好的。我想这照实为咱们带来了内存数学的一次大不雅。在咱们投入漫步式处理、Zero等细节之前,还有什么高脉络的重心吗?
Quentin:
我想能够即是这样了。
我要说的是,对于检修和推断来说,情况会大不疏导。东说念主们频频说,BF16是最好的。关联词,更正确的看法是,在检修期间,精度会愈加贫乏。
因此,在检修中,BF16会比在推断中使用更久一些,因为在推断中,模子依然基本成型,它实足不需要一些精度的临了几位,因此,对于推断来说,更容易将精度降至int8,而不是检修。
是以,你在检修中学到的整个东西齐必须在推断中再行学习,反之亦然。
Swyx:
还有第三类情况。你谈到了检修与推断之间的分歧。这第三类情况与微联合可能的参数高效微调方法有计划。
竣事微调的朴素方法仅仅进行更多的检修。但我不知说念你是否对微调有什么直观,是否值得在这里插入。有什么直观吗?若是你要编写微调的数学公式,会包含什么内容?
Quentin:
我认为,对于微调还有好多问题莫得得到解答。
举例,咱们知说念检修的缩放划定。有些东说念主依然作念了对于微调的缩放划定。但依然在一个界限检修过的模子怎么转念到另一个界限进行微调,就微调大小而言,咱们不明晰。
对于微调数据集,每个参数应该有若干个标志?也许我是无知的,但我合计对于模子如安在原始检修数据聚合莫得的新能力进行微调或领会的问题,信服会包含在畴昔对于微调的博客著作中。
此外,数据集转念、学习率转念亦然咱们博客感意思意思的内容之一。
09 并行检修Alessio:
您在这里领先提到的是ZeRO,它专注于分片优化器。也许不错给东说念主们解释一下怎么领会它。
Quentin:
ZeRO围绕两个通讯操作张开。第一个是scatter。东说念主们应该看一下咱们有的ZeRO图表。
在我褒贬这个问题时,论文中有一个包含参数、梯度和优化器状态的图表。每个GPU将取得我方等量的切片。
若是咱们进行...有ZeRO的不同阶段,但让咱们领先假定它是优化器状态、梯度和参数的等量切片。
在这种情况下,那将是零三,第三阶段。咱们通过scatter竣事这一丝。scatter的狡计是,每个GPU分拨1/休止的GPU数量,加上切片的偏移量,切片被分拨给该GPU。咫尺,整个的GPU齐有一个格外的切片,按照其排行要领。
在每个检修法子中,该GPU将恭候整个其他切片进行通讯,以便咱们咫尺在该GPU上领有整个这个词数据。一朝咱们有了整个这个词数据,咱们对其进行正向传递。
然后,咱们使用gather将该正向传递分发给整个其他GPU。是以,它是scatter,具体来说是减少scatter,然后是对整个其他GPU的gather。况且您每一步齐这样作念。因此,它的重心是您正在将这些状态分片到不同的GPU上。
通过不同的阶段,您将在图表中看到,优化器状态占据了最大的比例,这是因为我之前提到的。咱们包括FP32副本并进行原子操作。是以咱们需要每个参数的4个字节,用于动量和方差。然后,零阶段一,这是最常见的一个,仅为优化器。
零阶段二是优化器加梯度。零阶段三是优化器梯度和模子参数。但归根结底,整个这些齐是围绕着分片和往复团聚张开的。是以您从ZeRO中得到了好多通讯支拨。但其中的正面部分是您不错将其中大部分的移动与狡计重复。
Alessio:
怎么信服使用若干个GPU进行这种漫步是最好的?分片过多是否会形成太多的支拨?Quentin:
这更多地取决于您的互连是什么。延缓一步,整个这些GPU之间齐需要同步,而且这些同步往往是累积的。
因此,若是您在速率较慢的互连上使用过多的GPU,那么您最终会花更多的期间在同步上。在哪个GPU上耗尽更多期间同步的这个魔法数字会因您的互连和GPU内存的情况而异。每个GPU取得多小的切片呢?
举例,对于Summit,我弗成给出果真数字,但梗概在200亿参数傍边。咫尺您有200亿个参数,那么对于阿谁数量的GPU,梗概需要100到200个限度。
提升这个数量,您最终只会耗尽更多的期间在通讯上。实质的FLOPS跌破您事先设定的某个数值,将取决于您最终信服的最好聘用。
10 高等3D并行技艺(数据、张量、活水线)Alessio:
那么,对我来说,这部安分容比较难领会,是以我很欢乐您能解释一下3D并行。
Quentin:
好的,领先,让咱们来看一个绝顶基本的维度,即数据并行。
数据并行是您有一个模子的副本。为简便起见,假定一个副本刚巧允洽一个GPU。数据并行是,咫尺您有两个GPU,是以GPU一上有一个副本,GPU二上有一个副本。两者齐施行正向和反向传递,然后进行同步和平均梯度。然后这即是一个法子。对于3D并行来说,数据并行实质上是零。是以,您正在将优化器状态分片到整个不同的GPU上。
接下来,是张量并行。张量并行是将模子分割。举例,若是您有两个GPU,将模子在中间分开,每个GPU上的张量将在其上进行前向或后向操作。然后,仅在必要时,它会将该张量操作与另一个GPU同步。这比一些像活水线并行这样的维度要复杂一些。而在活水线并行中,假定您的模子有四个脉络,有四个GPU。您将一层放在每个GPU上,然后GPU一施行前向传递,然后将其激活的输动身送到GPU二。它施行前向传递,将激活发送到三,您仅仅在沿着一条线移动。那是一个朴素的有筹画,整个其他GPU在单个GPU施行其前向或后向传递时齐处于稳定状态。是以它被称为活水线并行,因为您将小批次分红了细小批次。
因此,GPU一将在细小批次一上施行前向传递,然后发送到GPU二。然后,在GPU二在第一个细小批次上运行时,GPU一正不才一个细小批次上责任。因此,您在每个细小批次的移动和狡计之间形成了活水线。但问题在于,您需要一个绝顶大的批次大小,以将其分红小批次和细小批次。因此,将这三者鸠集起来,您将得到一个3D网格,其中每个参数、优化器状态等齐映射到每个GPU上。这即是3D并行。
Alessio:进行此操作时是否需要整个GPU齐疏导?照旧也不错使用不匹配的GPU?
Quentin:有两件事情很贫乏。若是两种不同类型的GPU之间的VRAM有互异,那么您将受到VRAM较少的GPU的休止,因为它会耗尽内存。然后您弗成使用较大的GPU上剩余的部分。
据我所知,莫得像GPU单个GPU感知的内存支拨有筹画来科罚这个问题。第二个问题是,假定整个GPU的VRAM齐疏导,但其中一半速率很慢。问题在于,我之前提到的同步操作会让您受限。因此,在这种情况下,您的移动速率将与您最慢或最小的GPU疏导。
在这两种情况下,您最终齐会转头到最慢或最小的GPU。因此,最好使用疏导的GPU。不异适用于CPU和互连。回到Eleuther检修的200亿参数模子,那是在COVID期间,由于收集交换机等供应短缺,他们构建的一个Frankenstein式的集群。因此,每个节点齐有一个不同的收集交换机。是以,您最终会以最慢交换机的速率运行,况且调理一切,使其不比最慢交换机差,这是一个实践寰宇中可能会遭受的问题。
11 异构集群漫步的挑战Alessio:
这项责任是否被开阔给与?在为这一集进行研究之前,我还不知说念这一丝。这是否仍然是东说念主们正在尝试和研究的界限?照旧每个东说念主齐对此有所了解,并在实质中运行?即是分片优化器和3D并行,将两者鸠集在沿途,选用这种网格政策。
Quentin:我会说,好多主要的基于GPT的模子齐使用了这种有筹画。咫尺好多东说念主更倾向于纯正的ZeRO有筹画。是以即是纯正的分片。
您只需对整个内容进行分片。因为这样绝顶容易,每个东说念主齐不错得到格外的切片。不再有活水线阶段的问题。不再有哪个张量应该放在哪个GPU上的问题。
相背,咱们平平分片,对等对待一切。这个问题比使用3D并行有筹画更容易调试、查验点,以及进行检修。我认为,3D并行给您最多的戒指权,亦然犯错的最多边幅。具体是聘用哪种取决于您是领有更多工程师照旧更多GPU。
Swyx:
这也不算太难,对吧?
您基本上依然抽象了需要记取的五六个不同的数字。若是需要达到这种戒指水平,您依然为每个东说念主提供了主要的戒指杠杆。这很好。实足的。
Quentin:
问题在于,比如说,好吧,GPT-4发布了。咫尺咱们有了VLLMs。
Swyx:
Virtual LLMs,就像Metro of Expert的东西吗?不,是视觉的。
Quentin:是以咫尺咱们有了多模态模子之类的东西。咱们怎么进行漫步?咱们将其分拨到活水线阶段吗?咱们仅仅将其分片吗?将张量分割并进行张量并行吗?
当您具有这种3D并行有筹画时,要改变模子并添加新功能变得有点困难。我说困难,我的酷爱是将其调理和修改为适合新功能会变得困难。
Alessio:
您还在这个界限进行着其他研究吗?您想要提一下吗?我知说念往往咱们会问的问题是,AI界限最真义的未科罚问题是什么?我很好奇,您是否仍然认为这些问题聚合在检修、推理、数学优化上,照旧还有其他界限需要全球关注?
Quentin:我认为在我研究的界限里,有两个问题是我认为东说念主们应该绝顶关怀的。
领先是多模态并行和RLHF。咱们越来越多地看到强化学习融入到检修轮回中。因此,怎么将某些模子或某些GPU用于推理,而某些GPU用于检修?就像我之前提到的,你需要再行学习整个内容,而且它们具有绝顶专有的挑战。
举例,在检修期间怎么分割一个KV缓存?这些齐是尚未得到充分研究的挑战。
在多模态方面,你可能有一个视觉变换器和一个文本变换器。怎么分割它们?你是否平平分拨?将它们放在不同的GPU上,照旧仅仅将一些视觉、一些文本参数放在一个GPU上?
然后,第二个问题是通讯往往是一个瓶颈。是以咱们褒贬了3D并行,但很厚情况下,比如张量并行,你弗成跨节点使用。你会在通讯中受到休止。
我要说的是,在通讯发生之前,你应该怎么对通讯进行压缩?是以在传递时压缩,你有一些需要传递的缓冲区。你不错用GPU内核进行压缩,然后将其发送到收集,再进行解压缩,雷同于这样。让东说念主们在通讯基础设施上耗尽更少的财富,而更多地用于GPU,这亦然东说念主们需要探索的界限。
本文开首:硬AI风险领导及免责要求 市集有风险,投资需严慎。本文不组成个东说念主投资提出,也未有计划到个别用户特殊的投资想法、财务景色或需要。用户应试虑本文中的任何意见、不雅点或论断是否稳健其特定景色。据此投资,职守鼎沸。