https://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ%3D%3D&chksm=970c2143a07ba855562ca86bfa19b78a26fe2670cac7876feee49748dcaf5ea9b20a9d371c13&idx=1&mid=2247485845&scene=21&sn=b4ea4f518bfdf4a812fb8e00fbfe4845#wechat_redirect

原文在这里

                <section style="font-size: 16px;white-space: normal;caret-color: rgb(0, 0, 0);color: rgb(0, 0, 0);box-sizing: border-box;" data-mpa-powered-by="yiban.io"><section style="box-sizing: border-box;font-size: 16px;"><section style="text-align: center;margin-top: 10px;margin-right: 0%;margin-left: 0%;box-sizing: border-box;" powered-by="xiumi.us"><section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 15%;box-shadow: rgb(0, 0, 0) 0px 0px 0px;border-width: 0px;height: auto;box-sizing: border-box;"><img data-ratio="1" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/5fknb41ib9qFMeJWjsOibhRL3JquicibH6eAEnfE6Uy594RBwRyG7BH4yfWWKtibajVDbxxfG5DzqkvlJUvhzwCCvRQ/640?wx_fmt=jpeg" data-type="jpeg" data-w="1080" style="vertical-align: middle; box-sizing: border-box; width: 100% !important; height: auto !important; visibility: visible !important;" _width="100%" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/5fknb41ib9qFMeJWjsOibhRL3JquicibH6eAEnfE6Uy594RBwRyG7BH4yfWWKtibajVDbxxfG5DzqkvlJUvhzwCCvRQ/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></section></section><section style="text-align: center;margin-right: 0%;margin-bottom: 15px;margin-left: 0%;box-sizing: border-box;" powered-by="xiumi.us"><section style="display: inline-block;width: 80%;vertical-align: top;box-shadow: rgb(181, 180, 180) 2.82843px 2.82843px 5px;border-style: solid;border-width: 1px;border-radius: 0px;border-color: rgb(62, 62, 62);padding: 8px;box-sizing: border-box;"><section style="margin-right: 0%;margin-left: 0%;box-sizing: border-box;" powered-by="xiumi.us"><section style="font-size: 14px;box-sizing: border-box;"><p style="box-sizing: border-box;">一只小狐狸带你解锁&nbsp;<strong style="box-sizing: border-box;">炼丹术&amp;NLP&nbsp;</strong>秘籍</p></section></section></section></section></section><p style="text-align: left;"><span style="text-align: left;color: rgb(89, 89, 89);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif;letter-spacing: 0px;"><br></span></p><p style="text-align: left;"><span style="text-align: left;color: rgb(89, 89, 89);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif;letter-spacing: 0px;">前阵子微软开源了DeepSpeed训练框架,从测试效果来看有10倍的速度提升,而且对内存进行了各种优化,最大可以训练100B(illion)参数的模型。</span><span style="text-align: left;color: rgb(89, 89, 89);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif;letter-spacing: 0px;">同时发布了这个框架训练出的17B模型 Turing-NLG,处于目前壕赛事的顶端。</span><br></p></section><section data-tool="mdnice编辑器" data-website="https://www.mdnice.com"><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.562962962962963" data-type="jpeg" data-w="1080" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2arAEmuqRCtMNic0LKkL8t7PKldzzrI4QUc7vpwKCxxIWnN1jiaI2NTdcQ/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2arAEmuqRCtMNic0LKkL8t7PKldzzrI4QUc7vpwKCxxIWnN1jiaI2NTdcQ/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">训100B的模型就先别想了(狗头),先把110M的BERT-base训好上线吧。本文主要介绍模型训练中速度和内存的优化策略,针对以下几种情况:</section><ol style="" class="list-paddingleft-2"><li><section style="box-sizing: border-box;line-height: 26px;color: rgb(1, 1, 1);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 14px;">我明天就要答辩了,今天必须把这十个实验跑完</span></section></li><li><section style="box-sizing: border-box;line-height: 26px;color: rgb(1, 1, 1);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 14px;">我的模型有些大,好不容易放到一张卡上,训完一亿样本之前我就可以领N+1了</span></section></li><li><section style="box-sizing: border-box;line-height: 26px;color: rgb(1, 1, 1);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 14px;">我想出了一个绝妙的T6模型,却加载不进12GB的卡里,又拿不到今年的best paper了</span></section></li></ol><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">(以上纯属虚构,如有雷同请赶紧看下文)</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">现实总是残酷的,其实限制大模型训练只有两个因素:<strong style="color: rgb(71, 193, 168);">时间和空间(=GPU=钱)</strong>,根据不同情况可以使用的方案大致如下:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.5760869565217391" data-type="jpeg" data-w="1472" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2afLoOzUg7zbI3gzsVibgjaFUlDZSGuKuREWmwVXficpMk9kUxbjns99fg/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2afLoOzUg7zbI3gzsVibgjaFUlDZSGuKuREWmwVXficpMk9kUxbjns99fg/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><h3 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 20px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 18px;">1. 梯度累加 Gradient Accumulation</span></h3><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">如果只有单卡,且可以加载模型,但batch受限的话可以使用梯度累加,进行N次前向后反向更新一次参数,相当于扩大了N倍的batch size。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">正常的训练代码是这样的:</section><pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><section style="overflow-x: auto;padding: 16px;color: rgb(51, 51, 51);background: rgb(248, 248, 248);display: -webkit-box;font-family: &quot;Operator Mono&quot;, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;margin-top: 5px;margin-bottom: 5px;text-align: left;">for i, (inputs, labels) in enumerate(training_set):<br>  loss = model(inputs, labels)              # 计算loss<br>  optimizer.zero_grad()                                    # 清空梯度<br>  loss.backward()                           # 反向计算梯度<br>  optimizer.step()                          # 更新参数<br></section></pre><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">加入梯度累加后:</section><pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><section style="overflow-x: auto;padding: 16px;color: rgb(51, 51, 51);background: rgb(248, 248, 248);display: -webkit-box;font-family: &quot;Operator Mono&quot;, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;margin-top: 5px;margin-bottom: 5px;text-align: left;">for i, (inputs, labels) in enumerate(training_set):<br>  loss = model(inputs, labels)                    # 计算loss<br>  loss = loss / accumulation_steps                # Normalize our loss (if averaged)<br>  loss.backward()                                 # 反向计算梯度,累加到之前梯度上<br>  if (i+1) % accumulation_steps == 0:<br>      optimizer.step()                            # 更新参数<br>      model.zero_grad()                           # 清空梯度<br></section></pre><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">要注意的是,batch扩大后,如果想保持样本权重相等,<strong style="color: rgb(71, 193, 168);">学习率也要线性扩大或者适当调整</strong>。另外<strong style="color: rgb(71, 193, 168);">batchnorm也会受到影响</strong>,小batch下的均值和方差肯定不如大batch的精准,可以调整BN中的momentum参数解决[2]。</section><h3 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 20px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 18px;">2. 梯度检查点 Gradient Checkpointing</span></h3><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">如果只有一张卡,又想训大模型,可以尝试压缩模型所占显存。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">梯度检查点是一种以时间换空间的方法,通过减少保存的激活值压缩模型占用空间,但是在计算梯度时必须从新计算没有存储的激活值。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">细节可以参考陈天奇的Training Deep Nets with Sublinear Memory Cost[3]。</section><section style="text-align: left;margin-top: 5px;margin-bottom: 5px;"><img class="rich_pages  __bg_gif" data-ratio="0.22365988909426987" data-type="gif" data-w="541" data-src="https://mmbiz.qpic.cn/mmbiz_gif/y3eXggUiaulLcBuc6aEJibEvjmmBgq7a4YTdUKsfiaia1WKlZ36LZcLqA6EiarWwOSELXC8LskoP3tHIa85nOfMpr8w/640?wx_fmt=gif" style="width: 541px !important; height: auto !important; visibility: visible !important;" _width="541px" src="https://mmbiz.qpic.cn/mmbiz_gif/y3eXggUiaulLcBuc6aEJibEvjmmBgq7a4YTdUKsfiaia1WKlZ36LZcLqA6EiarWwOSELXC8LskoP3tHIa85nOfMpr8w/640?wx_fmt=gif&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1" data-order="0" data-fail="0"></section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><figcaption style="margin-top: 5px;text-align: center;color: rgb(136, 136, 136);font-size: 14px;"></figcaption></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">注:第一行节点是前向,第二行是反向</section><h3 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 20px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 18px;">3. 混合精度训练 Mixed Precision Training</span></h3><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">混合精度训练在单卡和多卡情况下都可以使用,通过cuda计算中的half2类型提升运算效率。<strong style="color: rgb(71, 193, 168);">一个half2类型中会存储两个FP16的浮点数,在进行基本运算时可以同时进行,因此FP16的期望速度是FP32的两倍</strong>。举个Gelu的FP16优化栗子:</section><pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><section style="overflow-x: auto;padding: 16px;color: rgb(51, 51, 51);background: rgb(248, 248, 248);display: -webkit-box;font-family: &quot;Operator Mono&quot;, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;">//FP32的gelu运算</span><span style="line-height: 26px;"><span style="font-weight: bold;line-height: 26px;">float</span> <span style="color: rgb(153, 0, 0);font-weight: bold;line-height: 26px;">gelu</span><span style="line-height: 26px;">(<span style="font-weight: bold;line-height: 26px;">float</span> x)</span><br></span>{<br>  <span style="font-weight: bold;line-height: 26px;">float</span> cdf = <span style="color: rgb(0, 128, 128);line-height: 26px;">0.5f</span> * (<span style="color: rgb(0, 128, 128);line-height: 26px;">1.0f</span> + tanhf((<span style="color: rgb(0, 128, 128);line-height: 26px;">0.7978845608028654f</span> * (x + <span style="color: rgb(0, 128, 128);line-height: 26px;">0.044715f</span> * x * x * x))));<br>  <span style="font-weight: bold;line-height: 26px;">return</span> x * cdf;<br>}<br><span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;">//FP16的gelu运算</span><span style="line-height: 26px;">half2 <span style="color: rgb(153, 0, 0);font-weight: bold;line-height: 26px;">gelu</span><span style="line-height: 26px;">(half2 val)</span><br></span>{<br>  half2 val_pow3 = __hmul2(val, __hmul2(val, val)); <span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;">//同时计算两个x*x*x</span><br>  float2 tmp_pow = __half22float2(val_pow3);<br>  float2 cdf =  __half22float2(val);<br><span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;">  //由于tanhf不支持half2类型,只能分开算</span><br>  cdf.x = <span style="color: rgb(0, 128, 128);line-height: 26px;">0.5f</span> * (<span style="color: rgb(0, 128, 128);line-height: 26px;">1.0f</span> + tanhf((<span style="color: rgb(0, 128, 128);line-height: 26px;">0.7978845608028654f</span> * (cdf.x + <span style="color: rgb(0, 128, 128);line-height: 26px;">0.044715f</span> * tmp_pow.x))));<br>  cdf.y = <span style="color: rgb(0, 128, 128);line-height: 26px;">0.5f</span> * (<span style="color: rgb(0, 128, 128);line-height: 26px;">1.0f</span> + tanhf((<span style="color: rgb(0, 128, 128);line-height: 26px;">0.7978845608028654f</span> * (cdf.y + <span style="color: rgb(0, 128, 128);line-height: 26px;">0.044715f</span> * tmp_pow.y))));<br>  <span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;">//同时计算两个x * cdf;</span><span style="font-weight: bold;line-height: 26px;">return</span> __hmul2(val, __float22half2_rn(cdf));<br>}<br></section></pre><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">混合精度训练[5]不是很难理解,但要注意以下几点:</section><ol style="" class="list-paddingleft-2"><li><section style="box-sizing: border-box;line-height: 26px;color: rgb(1, 1, 1);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 14px;">混合精度训练不是单纯地把FP32转成FP16去计算就可以了,只用FP16会造成80%的精度损失</span></section></li><li><section style="box-sizing: border-box;line-height: 26px;color: rgb(1, 1, 1);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 14px;">Loss scaling:由于梯度值都很小,用FP16会下溢,因此先用FP32存储loss并放大,使得梯度也得到放大,可以用FP16存储,更新时变成FP32再缩放</span></section></li><li><section style="box-sizing: border-box;line-height: 26px;color: rgb(1, 1, 1);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 14px;">在涉及到累加操作时,比如BatchNorm、Softmax,FP16会上溢,需要用FP32保存,一般使用GPU中TensorCore的FP16*FP16+FP32=FP32运算</span></section></li></ol><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><strong style="color: rgb(71, 193, 168);">整体流程:FP32权重 -&gt; FP16权重 -&gt; FP16计算前向 -&gt; FP32的loss,扩大 -&gt; 转为FP16 -&gt; FP16反向计算梯度 -&gt; 缩放为FP32的梯度更新权重</strong></section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.32850678733031674" data-type="jpeg" data-w="1105" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aDAWmS1bHbVVtQKRFN6X4m2eNzdcv28LLr4PPUhTgLZXJica9MU9zTbA/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aDAWmS1bHbVVtQKRFN6X4m2eNzdcv28LLr4PPUhTgLZXJica9MU9zTbA/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><br></section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">!!手工分割线:接下来就是壕赛道了!!</section><h3 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 20px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 18px;">4. 分布式训练 Distributed Training</span></h3><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">分布式训练就是多张卡并行训练,一般有以下两种情况:</section><ul style="" class="list-paddingleft-2"><li><section style="box-sizing: border-box;margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><section style="box-sizing: border-box;padding-top: 8px;padding-bottom: 8px;color: rgb(89, 89, 89);line-height: normal;margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 14px;">Multi-GPU:单机多卡,通过PCIE、NVlink、GPU Direct P2P来通信</span></section></section></li><li><section style="box-sizing: border-box;margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><section style="box-sizing: border-box;padding-top: 8px;padding-bottom: 8px;color: rgb(89, 89, 89);line-height: normal;margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 14px;">Multi-Node:多机多卡,通过Sockets (Ethernet) 或者InfiniBand with GPU Direct RDMA通信</span></section></section></li></ul><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.35064935064935066" data-type="jpeg" data-w="462" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aUXew41XC9wkX01Tiaibwul9ib3DI4wXt0d9icLeEkib2rSYmMMTibevNwic3Q/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aUXew41XC9wkX01Tiaibwul9ib3DI4wXt0d9icLeEkib2rSYmMMTibevNwic3Q/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">实践中可以使用英伟达的NCCL通信框架,多机通过IB(InfiniBand)可以接近机内的通信速度[6]。底层的东西就不多说了(我也不太懂),实际上对于炼丹师来说就是找运维爸爸提供帮助,并借助开源框架配置上服务器地址就行了。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><strong style="color: rgb(71, 193, 168);">并行训练有多种优化策略,主要目的就是减少计算中的参数同步(Sync)和数据传输。</strong></section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">目前32GB的卡最多能放1.3B参数的模型,塞得下的话可以使用数据并行的方式,否则可以把不同层放在不同机器上进行训练。两种方式的区别看下图[7]就明白啦:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.6499388004895961" data-type="jpeg" data-w="1634" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aFLtnECibYXhgnGkicDjDDiaicGE6xbYORK0IkyCdHJDtD7wzuGcsgQkqlA/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aFLtnECibYXhgnGkicDjDDiaicGE6xbYORK0IkyCdHJDtD7wzuGcsgQkqlA/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><h4 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 18px;margin-top: 5px;margin-bottom: 5px;text-align: left;">4.1 数据并行 Data Parallelism</h4><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">数据并行有两种方式[9]:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.39400428265524623" data-type="jpeg" data-w="1868" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a0u5UaTFZibm72F75qfdqaf7xsGfibYwibQCoebOiaWG1Rpm8FjY1YKnpBw/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a0u5UaTFZibm72F75qfdqaf7xsGfibYwibQCoebOiaWG1Rpm8FjY1YKnpBw/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><strong style="color: rgb(71, 193, 168);">Parameter Server</strong></section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">集群中有一个master和多个worker,master需要等待所有节点计算完毕统一计算梯度,在master上更新参数,之后把新的参数广播给worker。这种方式的主要瓶颈在master,因此也可以异步训练,即不等待其他节点,收到一个worker的梯度后就更新参数,但这样其他worker在旧参数上算完后的梯度会作用到新参数上,导致模型优化过头,陷入次优解。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><strong style="color: rgb(71, 193, 168);">Ring All-Reduce</strong></section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">集群中所有worker形成一个闭环,把数据分成K份,计算完一份就把累加好的梯度传给下家,同时接受上家的梯度,迭代到最后所有worker的梯度都是相等的,可以同步更新参数,比PS架构要高效,是目前的主流方式。下图[10]展示了Scatter Reduce和All Gather两个阶段:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.7511737089201878" data-type="jpeg" data-w="852" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a70ottBD6icd4grLib626zBe5cttcD5rpEXoqf1rT5hOu4T9ld18TZpNw/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a70ottBD6icd4grLib626zBe5cttcD5rpEXoqf1rT5hOu4T9ld18TZpNw/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"><section style="text-align: left;color: rgb(136, 136, 136);font-size: 14px;margin-top: 5px;margin-bottom: 5px;">preview</section></figure><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.7511737089201878" data-type="jpeg" data-w="852" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aicZKJ3a9DIcDrs23BOlDeyNAzhZQFlwROAAiamd5hX2FD4lqkKfQTdLg/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aicZKJ3a9DIcDrs23BOlDeyNAzhZQFlwROAAiamd5hX2FD4lqkKfQTdLg/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><h4 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 18px;margin-top: 5px;margin-bottom: 5px;text-align: left;">4.2 模型并行 Model Parallelism</h4><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">模型并行目前并不常见,一是因为大部分模型单卡都放得下,二是因为通讯开销比数据并行多,因为反向传播需要把loss对每层激活值的梯度都传回去,样本数量大的话激活值也有很多。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><strong style="color: rgb(71, 193, 168);">Pipelined Parallelism</strong></section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">Pipeline的并行方式就是把模型的不同层放到不同机器上,顺序地进行前向和反向计算。19年谷歌和微软先后放出了GPipe[11]和PipeDream[12]的论文和源码,给大家梳理一下他们的心路历程:</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">首先来看最naive的模型并行方式,实在是有些浪费生命:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.34859675036927623" data-type="jpeg" data-w="1354" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2at1ic4lC8Bt6nCvXmnSt75g7943S3AbHaWGJfIcd3gRTGm1n5Ra7Ep3g/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2at1ic4lC8Bt6nCvXmnSt75g7943S3AbHaWGJfIcd3gRTGm1n5Ra7Ep3g/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">注:反向需要计算对参数和激活值的偏导,所以耗时更长。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">所以谷歌GPipe提出了一个改进,其实就是把数据分片,像allreduce一样计算完一些就传给下个节点,最后<strong style="color: rgb(71, 193, 168);">同步</strong>更新参数,但这样看还是不能挽救我们的青春:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.31417624521072796" data-type="jpeg" data-w="1566" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aibu8uJ62uOVgNkRs5B94icsJwQwIsxeEew9XicvMC7h7ql2gdb23HYBoA/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aibu8uJ62uOVgNkRs5B94icsJwQwIsxeEew9XicvMC7h7ql2gdb23HYBoA/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">于是微软提出了PipeDream,其实就是<strong style="color: rgb(71, 193, 168);">把同步变为了小数据上的异步</strong>,计算完一个数据分片就立刻反向,反向完了就更新梯度,谁也别等谁,大家一起疯狂干起来:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.3203631647211414" data-type="jpeg" data-w="1542" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2ahP8rBzvLlFPudh3JicicjRXvpPIvTKicItFic8WWJlmWHwsuTQReMs53OA/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2ahP8rBzvLlFPudh3JicicjRXvpPIvTKicItFic8WWJlmWHwsuTQReMs53OA/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">但这样就有一个问题,就是大家越干越乱,比如worker1在计算5的前向时用的是1反向后的参数,但之后计算5反向的梯度时参数早就被2/3/4更新了。于是作者加入了<strong style="color: rgb(71, 193, 168);">Weight stashing</strong>机制,把每个数据对应的参数都存起来!这样worker1在5反向的时候就可以从百宝箱里拿出之前的参数,进行更新:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.34392265193370164" data-type="jpeg" data-w="1448" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2alolenxicbrKtTu0wBqnN8VfToclpvibrIevT6z2xfmMJjRQ8lVSliap9g/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2alolenxicbrKtTu0wBqnN8VfToclpvibrIevT6z2xfmMJjRQ8lVSliap9g/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">那问题又来了:worker1上5的前向是用1的参数,但worker3上是用3的,最后汇总的时候不就又乱了?于是作者又加入了<strong style="color: rgb(71, 193, 168);">Vertical Sync</strong>机制,强制所有worker在计算5的时候都用1的参数。这样在最后汇总模型的时候,就能拿到一致的参数了。但这样同步会导致很多计算作废,比如5更新时用的1的权重,但2/3/4的权重都白计算了,所以默认是不用Vertical Sync的,这样每层虽然不完全一致,但由于weight stashing,所有的参数都是有效的。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><strong style="color: rgb(71, 193, 168);">Tensor Slicing</strong></section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">神经网络可以看作一个复合函数,本质就是各个tensor之间的计算,我们定义好的CNN、RNN其实就是计算函数的集合。从这个角度来思考,<strong style="color: rgb(71, 193, 168);">模型并行其实就是把各个tensor计算分散到不同的机器上</strong>。这方面的研究有18年的FlexFLow和Mesh-TensorFlow,英伟达的威震天[13]也是使用这个策略。下面以Transformer为例说明一下如何拆分。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">Transformer主要有self-attention和FFN组成,对于FFN中的第一层Y=GLUE(XA)可以有两种拆分方式:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.54" data-type="jpeg" data-w="2000" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a1c07YEXdDEltUWPEkqVQsDO70JC32usGjL1fVGVVSIHKUJepowP0EA/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a1c07YEXdDEltUWPEkqVQsDO70JC32usGjL1fVGVVSIHKUJepowP0EA/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">可以看到,第一种需要在计算GLUE时同步,因此威震天通过第二种方式进行tensor切片,self-attention也采用类似的策略,这样只需要在前向时通过g聚合,反向时通过f聚合就可以了:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="1.0839002267573696" data-type="jpeg" data-w="882" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a6LNMnhMNpqAu37BsIEly0yvblUPDzdhpMPg96RhicTzhE7zyzYxUzZg/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a6LNMnhMNpqAu37BsIEly0yvblUPDzdhpMPg96RhicTzhE7zyzYxUzZg/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">剩下的Layernorm和dropout还是需要同步后计算:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.38045375218150085" data-type="jpeg" data-w="1146" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aVqOaAia9pfWwtMTMNAv3vUleLkPrKmWO5ZWOryibh3LhRKOS8Cm4upVw/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2aVqOaAia9pfWwtMTMNAv3vUleLkPrKmWO5ZWOryibh3LhRKOS8Cm4upVw/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">同时,作者也在vocab的维度对embedding进行了切分,并把最后的MLM预测和cross-entropy融合到一起,减少网络通信量(否则需要传输batch_size*seq_len *vocab_size个prob,改过后只传batch_size *seq_len个loss值)。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">随着模型越来越大,分布式训练甚至推理肯定是一个趋势,在工程上还有很多可以优化的点,不仅是上面介绍的分布式策略,还有网络通信优化、内存优化等。</section><h3 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 20px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 18px;">5. 加速优化器 LAMB</span></h3><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">上文提到的数据并行虽然可以接近线性地提升训练速度,但过大的Batch会降低模型精度和收敛速度(对数据的拟合变差)。因此谷歌在19年推出了LAMB[14]优化器,全称为<strong style="color: rgb(71, 193, 168);">Layer-wise Adaptive Moments optimizer for Batch training</strong>,针对大batch做了优化,在分布式训练的场景下可训65536/32768的样本,减少迭代次数,从而缩短训练时间,感受一下金钱的味道:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.4912023460410557" data-type="jpeg" data-w="1364" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a1PbMnNJ3NwTnMb7Emk0s2jNGyGWRJHGXkkJTvD9BUFzW7laarOZTicw/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2a1PbMnNJ3NwTnMb7Emk0s2jNGyGWRJHGXkkJTvD9BUFzW7laarOZTicw/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">LAMB主要是综合了Adam和LARS(Layerwise Adaptive Rate Scaling),对学习率进行调整。上文提到当batch变大时学习率也需要变大,这样会导致收敛不稳定,LARS通过给LR乘上权重与梯度的norm比值来解决这个问题[15]:</section><section style="text-align: left;overflow: auto;margin-top: 5px;margin-bottom: 5px;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -1563.2 7351 2627" aria-hidden="true" style="-webkit-overflow-scrolling: touch;vertical-align: -2.407ex;width: 16.631ex;height: 5.943ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="3BB" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z"></path></g><g data-mml-node="mi" transform="translate(583, -150) scale(0.707)"><path data-c="6C" d="M117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59Z"></path></g></g><g data-mml-node="mo" transform="translate(1121.5, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(2177.3, 0)"><path data-c="3B7" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q156 442 175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336V326Q503 302 439 53Q381 -182 377 -189Q364 -216 332 -216Q319 -216 310 -208T299 -186Q299 -177 358 57L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mfrac" transform="translate(2674.3, 0)"><g data-mml-node="mrow" transform="translate(1366, 709.5)"><g data-mml-node="mo"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mo" transform="translate(278, 0)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="msup" transform="translate(556, 0)"><g data-mml-node="mi"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(572, 363) scale(0.707)"><path data-c="6C" d="M117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59Z"></path></g></g><g data-mml-node="mo" transform="translate(1388.7, 0)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mo" transform="translate(1666.7, 0)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g></g><g data-mml-node="mrow" transform="translate(220, -813.7)"><g data-mml-node="mo"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mo" transform="translate(278, 0)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mi" transform="translate(556, 0)"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(1389, 0)"><g data-mml-node="mi"><path data-c="4C" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z"></path></g><g data-mml-node="mo" transform="translate(681, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msup" transform="translate(1070, 0)"><g data-mml-node="mi"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(572, 363) scale(0.707)"><path data-c="6C" d="M117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59Z"></path></g></g><g data-mml-node="mo" transform="translate(1902.7, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><g data-mml-node="mo" transform="translate(3680.7, 0)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mo" transform="translate(3958.7, 0)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g></g><rect width="4436.7" height="60" x="120" y="220"></rect></g></g></g></svg></section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">这里的norm都是取一层的权重计算,所以是layerwise。可以这样理解上面的公式:刚开始训练时,权重比较小,而loss和梯度比较大,所以学习率开始较小,但随着权重变大&amp;梯度变小会慢慢warmup。当对一些样本拟合很好,loss接近0时,梯度变小,学习率又会增大,跳出局部最优,防止过拟合。</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">LAMB融合了这种layerwise的自适应思想:</section><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;"><img data-ratio="0.6851851851851852" data-type="jpeg" data-w="972" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2afYBviaZycLvv4MfRib3kKPqDqgEWBLkPqH2NDdJPT8mX74OkyzRfNicTg/640?wx_fmt=jpeg" style="display: block; margin-right: auto; margin-left: auto; width: 677px !important; height: auto !important; visibility: visible !important;" _width="677px" class="" src="https://mmbiz.qpic.cn/mmbiz_jpg/y3eXggUiaulIOYfhm4iaiaP0ibt6ucyWbu2afYBviaZycLvv4MfRib3kKPqDqgEWBLkPqH2NDdJPT8mX74OkyzRfNicTg/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" data-fail="0"></figure><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">图中的公式稍稍有改动,一个是给权重norm加了映射,本质都是起scale的作用;另一个是梯度公式中加了weight decay,也就是目标函数中的L2正则化。</section><h3 data-tool="mdnice编辑器" style="font-weight: bold;font-size: 20px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;"><span style="font-size: 18px;">总结</span></h3><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">本文介绍了从速度和内存去优化模型训练的几种方式,实践中各种都是可以混合起来的,比如混合精度+数据并行、数据并行+模型并行、数据并行+梯度检查点等。DeepSpeed里基本涵盖了本文所讲的策略,用pytorch的同学可以安排起来了~</section><section style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: rgb(89, 89, 89);margin-top: 5px;margin-bottom: 5px;text-align: left;">最后,在介绍各种策略的时候,由于篇幅原因也有省略一些假设和最终效果,感兴趣的同学们可以深入研读参考资料里的内容~如果路过的大佬们发现哪里有错误烦请指出~<br><br></section><section style="box-sizing: border-box;font-size: 16px;"><section style="transform: rotate(0deg);-webkit-transform: rotate(0deg);-moz-transform: rotate(0deg);-o-transform: rotate(0deg);box-sizing: border-box;" powered-by="xiumi.us"><section style="margin-top: 10px;margin-bottom: 10px;padding-left: 4px;box-sizing: border-box;"><section style="display: inline-block;vertical-align: bottom;width: 100%;margin-bottom: 0.2em;box-sizing: border-box;"><section style="border-top: 1px solid rgb(249, 110, 87);width: 90%;box-sizing: border-box;height: 1px;line-height: 0;"><br></section><section style="width: 8px;height: 8px;margin-top: -4px;margin-right: -4px;border-radius: 100%;background-color: rgb(249, 110, 87);box-sizing: border-box;line-height: 0;"><br></section></section><section style="text-align: right;margin-top: -1.5em;box-sizing: border-box;"><section style="width: 2em;height: 2em;line-height: 2em;display: inline-block;vertical-align: top;border-radius: 100%;background-color: rgb(250, 187, 187);text-align: center;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="box-sizing: border-box;">可</p></section><section style="width: 2em;height: 2em;line-height: 2em;display: inline-block;vertical-align: top;border-radius: 100%;background-color: rgb(250, 187, 187);text-align: center;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="box-sizing: border-box;">能</p></section><section style="width: 2em;height: 2em;line-height: 2em;display: inline-block;vertical-align: top;border-radius: 100%;background-color: rgb(250, 187, 187);text-align: center;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="box-sizing: border-box;">喜</p></section><section style="width: 2em;height: 2em;line-height: 2em;display: inline-block;vertical-align: top;border-radius: 100%;background-color: rgb(250, 187, 187);text-align: center;color: rgb(255, 255, 255);box-sizing: border-box;"><p style="box-sizing: border-box;">欢</p></section></section></section></section></section><ul class="list-paddingleft-2" style=""><li><p style="max-width: 100%;min-height: 1em;overflow-wrap: break-word !important;box-sizing: border-box !important;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&amp;mid=2247485842&amp;idx=1&amp;sn=cc24542d51e17533781d5c60bd693cec&amp;chksm=970c2144a07ba852979cc39d1be332109046a7e8e28fa61d4efc5be052461f4a3ce3dc083809&amp;scene=21#wechat_redirect" textvalue="详解医学顶刊《柳叶刀》最新发表新型冠状病毒研究论文" data-itemshowtype="0" tab="innerlink" data-linktype="2" hasload="1"><span style="max-width: 100%;color: rgb(112, 177, 231);-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;font-size: 15px;overflow-wrap: break-word !important;box-sizing: border-box !important;">如何让BERT拥有视觉感知能力?两种方式将视频信息注入BERT</span></a></p></li><li><p style="max-width: 100%;min-height: 1em;text-align: left;overflow-wrap: break-word !important;box-sizing: border-box !important;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&amp;mid=2247485278&amp;idx=1&amp;sn=d1a13149b7cd8b60694c716ca8580cff&amp;chksm=970c2f88a07ba69e1b20bc0666be615a07c18f96182f1b27f93aef082f61751f7a373d4b902e&amp;scene=21#wechat_redirect" textvalue="深度神经网络为何会有灾难性遗忘?如何进行有效的持续学习?" data-itemshowtype="0" tab="innerlink" data-linktype="2" hasload="1"><span style="max-width: 100%;color: rgb(112, 177, 231);-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;font-size: 15px;overflow-wrap: break-word !important;box-sizing: border-box !important;">模型训练太慢?显存不够用?这个算法让你的GPU老树开新花</span><span style="max-width: 100%;color: rgb(112, 177, 231);-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;font-size: 15px;overflow-wrap: break-word !important;box-sizing: border-box !important;"></span></a></p></li><li><p style="max-width: 100%;min-height: 1em;text-align: left;overflow-wrap: break-word !important;box-sizing: border-box !important;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&amp;mid=2247485019&amp;idx=1&amp;sn=4b2d8f8f5bcb58437b262f87f8c4e393&amp;chksm=970c2e8da07ba79be4d264f66509295755ebc9d286a0bbb24326b9d4b14ea3bce41966482477&amp;scene=21#wechat_redirect" textvalue="万万没想到,我的炼丹炉玩坏了" data-itemshowtype="0" tab="innerlink" style="text-align: left;white-space: normal;" data-linktype="2" hasload="1"><span style="color: rgb(112, 177, 231);-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;font-size: 15px;">训练效率低?GPU利用率上不去?快来看看别人家的tricks吧~</span></a><br></p></li><li><p style="max-width: 100%;min-height: 1em;text-align: left;overflow-wrap: break-word !important;box-sizing: border-box !important;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&amp;mid=2247485051&amp;idx=1&amp;sn=c3380421fbdf63debf16512e2915f242&amp;chksm=970c2eada07ba7bb8fa16a99d8a64536568cb18551346484e0a4d828b3cb831238c7ddadab8d&amp;scene=21#wechat_redirect" textvalue="模型训练太慢?显存不够用?混合精度训练了解一下" data-itemshowtype="0" tab="innerlink" data-linktype="2" hasload="1"><span style="max-width: 100%;color: rgb(112, 177, 231);font-size: 15px;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;text-indent: 29.3333px;overflow-wrap: break-word !important;box-sizing: border-box !important;">如何打造高质量的NLP数据集</span><span style="max-width: 100%;color: rgb(112, 177, 231);font-size: 15px;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;text-indent: 29.3333px;overflow-wrap: break-word !important;box-sizing: border-box !important;"></span></a></p></li><li><p style="max-width: 100%;min-height: 1em;text-align: left;overflow-wrap: break-word !important;box-sizing: border-box !important;"><a target="_blank" href="http://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&amp;mid=2247485371&amp;idx=1&amp;sn=7e1e738b79d78320010ef993daa4a003&amp;chksm=970c2f6da07ba67b061d0c33342e98f4c389f9b60b0b43b4e0df4b42c4ab2a3b19936a3f2e6c&amp;scene=21#wechat_redirect" textvalue="如何与GPU服务器优雅交互" data-itemshowtype="0" tab="innerlink" data-linktype="2" style="max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;" hasload="1"><span style="max-width: 100%;color: rgb(112, 177, 231);-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;font-size: 15px;overflow-wrap: break-word !important;box-sizing: border-box !important;">万万没想到,我的炼丹炉玩坏了</span></a></p></li></ul><p style="max-width: 100%;min-height: 1em;text-align: left;overflow-wrap: break-word !important;box-sizing: border-box !important;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif;"></span><br></p><section mpa-from-tpl="t" style="white-space: normal;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif;font-size: 16px;text-align: left;color: rgb(62, 62, 62);"><section data-role="outer" mpa-from-tpl="t"><section style="margin-top: 5px;margin-bottom: 5px;"><section mpa-from-tpl="t" style="display: flex;justify-content: center;align-items: center;"><section mpa-from-tpl="t" style="width: 2.5em;transform: rotate(0deg);"><img data-ratio="1.1428571428571428" data-src="https://mmbiz.qpic.cn/mmbiz_png/5fknb41ib9qEkpef92EuDauK6TMoQeqAxH91oa4b26nj87mpBln2hy8HnCicjx53EQ9OtXsuiciaux9tN6445rcdJA/640?wx_fmt=png" data-type="png" data-w="63" data-width="100%" style="display: block; width: 40px !important; height: auto !important; visibility: visible !important;" _width="40px" src="https://mmbiz.qpic.cn/mmbiz_png/5fknb41ib9qEkpef92EuDauK6TMoQeqAxH91oa4b26nj87mpBln2hy8HnCicjx53EQ9OtXsuiciaux9tN6445rcdJA/640?wx_fmt=png&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" crossorigin="anonymous" class="" data-fail="0"></section><section mpa-from-tpl="t" style="margin-left: -8px;padding-bottom: 2px;border-bottom: 1px solid rgb(232, 193, 49);"><section data-brushtype="text" mpa-from-tpl="t" style="margin-top: 15px;padding-bottom: 5px;color: rgb(102, 102, 102);letter-spacing: 1.5px;border-bottom: 1px solid rgb(232, 193, 49);">参考文献</section></section></section></section></section></section><section style="line-height: normal;"><span style="font-size: 13px;color: rgb(136, 136, 136);"></span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[1]&nbsp;微软Turing-NLG:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://www.microsoft.com/en-us/research/blog/turing-nlg-a-17-billion-parameter-language-model-by-microsoft/</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[2]&nbsp;梯度累加:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://www.zhihu.com/question/303070254/answer/573037166</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[3]&nbsp;陈天奇 Training Deep Nets with Sublinear Memory Cost:&nbsp;</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://www.zhihu.com/question/274635237/answer/755102181</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[4]&nbsp;高开远 Reformer解读:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://zhuanlan.zhihu.com/p/104935987</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[5]&nbsp;混合精度训练:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://zhuanlan.zhihu.com/p/84219777</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[6]&nbsp;英伟达NCCL:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://www.zhihu.com/question/63219175/answer/206697974</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[7]&nbsp;数据并行与模型并行:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://www.zhihu.com/question/53851014/answer/158794752</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[8]&nbsp;分布式之数据并行:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://zhuanlan.zhihu.com/p/68615246</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[9] AllReduce:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://zhuanlan.zhihu.com/p/100012827</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[10] AllReduce细节:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://zhuanlan.zhihu.com/p/56991108</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[11] GPipe:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://arxiv.org/pdf/1811.06965.pdf</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[12] PipeDream:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://arxiv.org/pdf/1806.03377.pdf</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[13] Megatron-LM:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://arxiv.org/abs/1909.08053</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[14] LAMB:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://arxiv.org/abs/1904.00962v3</span></section><section style="line-height: normal;text-align: left;"><span style="font-size: 13px;color: rgb(136, 136, 136);">[15] LAMB解读:</span><span style="font-size: 13px;color: rgb(136, 136, 136);">https://towardsdatascience.com/an-intuitive-understanding-of-the-lamb-optimizer-46f8c0ae4866</span></section><p style="text-align: left;"><br></p><section style="box-sizing: border-box;"><section style="transform: rotate(0deg);box-sizing: border-box;" powered-by="xiumi.us"><section style="box-sizing: border-box;"><section style="font-size: 16px;display: inline-block;vertical-align: top;width: 35%;background-image: url(&quot;https://mmbiz.qpic.cn/mmbiz_gif/5fknb41ib9qFlRb7zLrDsRgynkVacVczeqjMaehuwhf9qfIIoHmD6Inc9AUr47H7ibEFQV5nPKG0vNIhqMqGDdnw/640?wx_fmt=gif&quot;);background-position: 50% 50%;background-repeat: no-repeat;background-size: 100%;background-attachment: scroll;box-sizing: border-box;"><section style="text-align: center;margin: 20px 0%;box-sizing: border-box;" powered-by="xiumi.us"><section style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 70%;box-sizing: border-box;"><img data-ratio="1" data-src="https://mmbiz.qpic.cn/mmbiz_jpg/5fknb41ib9qFlRb7zLrDsRgynkVacVczeCDBtLvvLxImY5pWPdFUnDpXdBZGRAuRQtmQlewdzic6OBJwhZIr6D7Q/640?wx_fmt=jpeg" data-type="jpeg" data-w="258" style="vertical-align: middle; box-sizing: border-box; width: 165px !important; height: 165px !important;" _width="100%" class="img_loading" src="https://img-blog.csdnimg.cn/2022010611153455606.gif" crossorigin="anonymous"></section></section></section><section style="display: inline-block;vertical-align: top;width: 65%;box-sizing: border-box;"><section style="font-size: 13px;margin: 20px 0% 8px;box-sizing: border-box;" powered-by="xiumi.us"><section style="display: inline-block;height: 2em;padding: 0.3em 0.5em;vertical-align: top;background-color: rgb(249, 178, 166);color: rgb(255, 255, 255);box-sizing: border-box;"><p style="box-sizing: border-box;">夕小瑶的卖萌屋</p></section><section style="width: 0.5em;display: inline-block;height: 2em;vertical-align: top;border-bottom: 1em solid rgb(249, 178, 166);border-top: 1em solid rgb(249, 178, 166);border-right: 1em solid transparent !important;box-sizing: border-box;"><section style="line-height: 0;color: rgba(0, 0, 0, 0);width: 0px;"><svg viewBox="0 0 1 1" style="vertical-align:top;"><text>_</text></svg></section></section></section><section style="box-sizing: border-box;" powered-by="xiumi.us"><p style="font-size: 14px;white-space: normal;box-sizing: border-box;"><span style="font-size: 13px;">关注&amp;星标小夕,带你解锁炼丹秘籍</span></p><p style="white-space: normal;box-sizing: border-box;"><span style="font-size: 13px;">订阅号主页下方<strong>「撩一下」</strong>有惊喜哦</span></p></section></section></section></section></section></section></div>

显卡不够时,如何训练大型网络相关推荐

  1. keras用cpu加速_在训练某些网络时,Keras(Tensorflow后端)在GPU上比在CPU上慢CPU

    我很难理解GPU和CPU速度与小尺寸网络(CPU有时更快)相似的原因,而GPU更快更大尺寸的网络.问题底部的代码在i7-6700k上以103.7s运行,但是当使用tensorflow-gpu时,代码运 ...

  2. ubuntu18.04安装Nvidia显卡驱动后黑屏及网络、蓝牙驱动消失的解决方案

    ubuntu18.04安装Nvidia显卡驱动后黑屏及网络.蓝牙驱动消失的解决方案 文章目录 ubuntu18.04安装Nvidia显卡驱动后黑屏及网络.蓝牙驱动消失的解决方案 1.问题描述 2.解决 ...

  3. [2G显卡]使用darknet/YOLO训练自己的数据

    本文主要针对用显存较小的电脑上训练自己的YOLO数据,在clone了最新的darknet后结果只能跑得动yolov2,使用的是yolo.cfg与yolo.weights做的初始测试.随后修改配置文件, ...

  4. 蚂蚁金服AAAI收录论文曝光,动态网络剪枝方法、无语预训练的网络剪枝技术有重大突破...

    来源 | 蚂蚁金服 责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 一年一度在人工智能方向的顶级会议之一AAAI 2020于2月7日至12日在美国纽约举行,旨在汇集世界各地 ...

  5. 卷积神经网络:VGG16 是基于大量真实图像的 ImageNet 图像库预训练的网络

    卷积神经网络:VGG16 是基于大量真实图像的 ImageNet 图像库预训练的网络 图片输入->卷积->填充(Padding)->池化(pooling)->平坦(Flatte ...

  6. 浅谈大型网络入侵检测建设

    博文作者:xti9er[TSRC] 发布日期:2013-07-10 阅读次数:7063 博文内容: 一.前言 伊朗2010年被报出核工厂遭受"超级工厂"(Stuxnet)病毒攻击, ...

  7. 锐捷交换机批量加入vlan_大型网络中如何创建vlan? 不同vlan间如何互通?

    交换机的配置一直是弱电人的难点,尤其是在大型网络中,前面我们曾提到关于华为.h3c.锐捷等品牌交换机基本配置,本期我们将通过一个大型网络的实际案例,来详细了解清楚交换机的vlan创建以及不同vlan间 ...

  8. MTCNN-tensorflow源码解析之训练PNet网络-train_PNet.py

    tfrecords文件存放在文件 "../../DATA/imglists/PNet/train_PNet_landmark.tfrecord_shuffle中,接下来用它来训练PNet网络 ...

  9. 大型网络之---公司内部局域网

    网络拓扑 大型网络之-公司内部局域网 -----------------------------------点击下面看大图---------------------------------- 网络拓扑 ...

最新文章

  1. PMP-【第12章 项目采购管理】-2021-2-17(252页-274页)
  2. 【转:SAP学习篇】Fiori 的基本架构
  3. 学习记录(一)之h5_canvas
  4. 数字电影打包内容(Packaging)
  5. [js] 写一个方法判断数组内元素是否全部相同
  6. 计算机图形学与几何造型导论_计算机图形学导论
  7. 每日一题丨2020.05.27
  8. 分解cad图纸的蜂鸟工具_知道这些CAD统计技巧,让你计算事半功倍!
  9. gxworks2使用指令手册_三菱 GX 三菱 GX Works2操作手册(智能功能功能模块操作篇)...
  10. JAVA调用K3Cloud WebApi接口
  11. python编写函数模拟内置函数sorted_Python 内置函数sorted()在高级用法
  12. 嫦娥五号顺利升空,NASA、欧洲航天局回应
  13. PR值计算公式带来的思考
  14. 笔算开2次方根、3次方根详细教程
  15. 电脑配置jdk环境变量_苹果电脑配置环境变量
  16. 【python教程入门学习】Python 集成开发环境(IDE): VS Code
  17. 数学运算符和运算符的优先级
  18. 这28条知乎神回复,句句都射在我的膝盖
  19. CWE-416: Use After Free(释放后使用)
  20. 【BOOST C++字串专题11】Boost.Spirit(二)

热门文章

  1. 利用dom4j将实体类转换为对应的xml报文
  2. Docker入门六部曲——服务
  3. 消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法
  4. 2022-2028年中国氟橡胶产业竞争现状及发展前景分析报告
  5. 加解密基础——(对称加密、非对称加密和混合加密)
  6. leetcode 567. Permutation in String 字符串的排列 滑动窗口法
  7. LeetCode简单题之将整数转换为两个无零整数的和
  8. LeetCode中等题之删除链表的中间节点
  9. 可以控制到多低(功率)?
  10. CUDA 8混合精度编程