模型并行:我们把大模型拆成碎片,拼起了普通人的记忆

凌晨两点二十,阿柚把第三罐无糖气泡水捏扁的时候,屏幕上的loss值终于卡在了那个该死的、跳了三天的12.7上。

卡炸了。

那种挫败感阿柚到现在都记得,作为当时团队里唯一负责模型训练的算法工程师,她熬了三个通宵,把所有能想到的prompt优化、参数微调的技巧都试遍了,70亿参数的记忆绘本模型,在训练到第47步的时候,直接弹出来个CUDA out of memory的报错,连个缓冲的余地都不给。

我们曾经把模型当整个揣在兜里跑

最开始我们总觉得,大模型的门槛就是显存大小,谁能塞下更大的模型,谁就能拿到更好的效果。那时候团队为了赶那个给独居老人做记忆绘本的公益项目,把整个公司能借到的A100都搬来了工位,8张卡堆在桌子上,散热风扇嗡嗡转的声音,盖过了整个办公区的键盘声。

没用。

70亿参数的模型,算上激活值、梯度、优化器状态,塞到单卡里需要快160G的显存,我们手里的A100只有80G,差了整整一倍。最轴的时候,阿柚甚至想过把模型量化到4位精度,结果量化之后的模型,连老人的脸都认不出来,画出来的人全是歪歪扭扭的,像小学低年级的美术作业。

单卡显存溢出报错的终端截图
单卡显存溢出报错的终端截图

说实话,那时候我们真的钻了牛角尖,总觉得要把整个模型完完整整塞到一张卡里,才算是”正经跑模型”,拆开来分给好多卡跑?那不是相当于把一个完整的人拆成胳膊腿,拼起来还是原来的人吗?我们当时甚至觉得这种方法太”投机取巧”,上不了台面。现在回头想,真是被自己的执念坑惨了,纯纯浪费了快半个月的时间。

拆模型的人,最先尝到了自由的甜头

打破这个执念的是隔壁组的老周。那天他叼着半根没点燃的烟(办公区不让抽烟,他就叼着过烟瘾)晃过来,扫了一眼我们屏幕上的报错,翻了个巨大的白眼,说你们是不是傻?模型并行是摆在教科书里的东西,你们愣是抱着单卡硬扛了半个月?

他给我们讲的逻辑特别简单,没有那些绕人的术语:就像你们做绘本,总不能让一个人既写文案又画插画又装订吧?把Transformer里的注意力层拆成八份,每张卡管八分之一的矩阵计算,算完了把结果拼到一起,不就完了?甚至不用管模型是怎么拆的,对最后输出的效果根本没影响。

我们当时半信半疑,花了整整一天时间把原来的单卡训练代码改成了张量并行的版本——就是把每一层的权重矩阵沿着维度切分,分给不同的GPU,卡和卡之间只需要同步最终的计算结果,不用传中间的所有数据。

大模型张量并行切分拓扑示意图
大模型张量并行切分拓扑示意图

训练重新跑起来的那天,我们所有人都盯着屏幕上的loss值。

它没有卡。它从12.7开始,一路往下掉,11.2,8.9,3.7,到第二天早上的时候,稳稳停在了0.83。

那种惊喜感,就像你背着一个几十斤的包爬了半小时的山,突然发现原来包是可以拆成两半,和朋友一人背一半的。之前要跑整整两周的训练任务,现在8张卡并行跑,36个小时就跑完了。上线那天,我们收到了第一个用户的反馈,是住在杭州拱宸桥边的张奶奶,她拿到的绘本里,画着她年轻时候在弄堂里晒蓝底白花被子的场景,连被子角上那个缝了三次的补丁都画得清清楚楚。

阿柚说她当时看着张奶奶发来的语音,差点在工位上哭出来。她之前总觉得大模型是离普通人很远的、堆在机房里的冷金属,直到语音里带着老人特有的、因为凑得太近手机有点含糊的笑意,说这画的就是我当年的被子啊,我孙女怎么把这个都告诉模型了。

拆到最后,我们也在被重新拼接

拆到最后,我们也在被重新拼接
拆到最后,我们也在被重新拼接

后来的事情就顺理成章了。我们开始做更大的模型,千亿级的,甚至现在在试的万亿级模型,早就不是简单的张量切分了。流水线并行把模型的不同层分到不同的机器上,像流水线一样,前一层算完的结果传到下一层;序列并行把几十万字的长文本拆成好多段,分给不同的卡算,哪怕是用户上传的几百G的家庭录像,也能拆成片段并行处理,最后拼出完整的记忆脉络。

不过话说回来,我们现在已经很少能摸到那些装着GPU的金属盒子了。所有的训练任务都调度在云控制台里,点几下鼠标,算力就从几千公里外的贵州机房、内蒙的风冷机房里飘过来,我们甚至不知道自己的模型到底被拆成了多少份,落在了多少张卡上。

上次阿柚和我聊天,说她最近总在想一个很奇怪的问题。我们拆模型的时候,把一个完整的神经网络拆成无数个碎片,分给不同的卡、不同的机房、甚至不同的城市,最后拼起来,还是那个能准确画出老人补丁被子的模型,没有任何损失。那我们自己的记忆呢?是不是也是这样?

你关于家的记忆,从来不是完整存在你脑子里的。它拆成了无数个碎片:有的存在妈妈每年给你寄的腊香肠的味道里,有的存在高中操场边的梧桐花落下来的触感里,有的存在你和朋友吵了架又和好的微信聊天记录里,有的存在旧相册里已经泛黄的毕业照上。你要把这些碎片从不同的地方找出来,拼到一起,才是那个完整的、属于你的”家”的感知。

那天我下班走在云谷的路边,旁边的机房散热风扇在嗡嗡转,风从那边吹过来,带着点金属被太阳晒过的温度。有人之前问过我,模型并行到底是什么?我没有讲那些复杂的通信延迟、All-Reduce操作、流水线气泡,就说,就是把一个很大的、你一个人扛不动的东西,拆成好多份,找好多朋友一起抬,最后拼起来,还是那个原来的东西,一点都不会少。

口袋里的手机弹出来消息,是张奶奶发的。说她最近又给模型喂了好多老弄堂的故事,等下次绘本更新,要给阿柚寄一包自己晒的梅干菜。

风又吹过来了。

作者|大讲堂

排版|大讲堂

审核|安然

免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:模型并行:我们把大模型拆成碎片,拼起了普通人的记忆
文章链接:https://www.lfdjt.com/info_23_25636.html