poppy 训练盒,第 1 部分:起步poppy the training box, part 1: the beginnings
作者计划搭建一台专门用于本地 LLM 训练的独立机器,此前一直使用配备 RTX 3090 的台式机 perry 进行训练。perry 已能完成有用的训练任务(如最近训练了一个 163M 参数的 GPT-2 small 风格 JAX LLM),但存在两个问题:perry 是日常主力机器,训练运行时会占用资源影响正常使用。本篇记录了专用训练机器 poppy 的搭建起步过程。
Giles Thomas
写下那篇我希望在自己刚开始学习某项技术时就能找到的文章……
归档
分类
友情链接
一段时间以来,我一直计划组装一台单独的机器用于本地 LLM 训练。直到现在,我都在使用我的台式机 perry。我装了一块 RTX 3090,可以完成一些有用的训练任务(最近一次是用 JAX 训练了一个 163M 参数的 GPT-2 small 风格的 LLM),但存在几个问题。
与上述所有问题相关的是:我之前做训练任务设定的两天时限,是因为这是我愿意让 perry 被占用的最长时间。尝试更长时间的训练一定会非常有意思!
我还有一些更长远的计划;组装一台多 GPU 机器会很有趣——不仅是为了在本地拥有更强的算力,也是为了在开始花钱租用昂贵的机器之前,能够测试更大规模的云端多 GPU 训练任务。每小时 15.92 美元的机器租金不算多,但积少成多,尤其是当你还在调试并行问题时消耗着这些钱。
最后,我一直对在 PC 中组装定制水冷系统很感兴趣。我从 1995 年左右就开始自己组装电脑了,但一直没顾上尝试这方面。听起来很有趣!
尽管有所有这些未来的计划,这仍是一篇相当普通的装机贴——讲我如何改造一台旧 PC,插上一块从 eBay 买的二手 RTX 3090,测试了所有部件,意外地训练了 11 天的 LLM,还差点把 CPU 给烤了。
随着时间的推移,我预计会发布更多——也更有趣的——装机细节。就把这篇当作是确立一个基准吧。
poppy
在我搬到里斯本之前,我们在这里有一处度假屋。我们过来的时候,我会带上我的笔记本电脑,但这总是有些令人不满意——用于工作的 CPU 性能有限,用于偶尔打游戏的 GPU 也有限。
在新冠疫情期间,我们开始在度假屋住更长的时间——这成了一个无法忽视的大麻烦。所以在 2020 年,我组装了一台小尺寸 PC,并给它起名叫 poppy。当时的限制条件是:
和所有 SFF PC 一样,组装过程有点繁琐。你可以在 PCPartPicker 上看到配件清单和装机笔记,简而言之,它的配置如下:
它看起来是这样的:
(天哪,我都忘了我们那个餐厅的壁纸有多么……鲜艳。)
作为参照——那个机箱比两罐叠在一起的易拉罐可乐稍微高一点。所以,相当小。
当我们全职搬到里斯本时,我把 perry 从伦敦带了过来,虽然他后来升级过几次(包括在2023年底加了一块 RTX 3090),但他一直是我日常使用的主力机。所以 poppy 就坐在书房的角落里,伤心地吃灰 :-(
是时候让她重见天日了。初步计划:让她在一个新的、更大的机箱里运行起来,并配一个可能带得动三张显卡的电源。
让她在新机箱里运行起来
起初,我发现她开不了机:快速检查后发现问题出在电源上。我以前在 SFF 电源上遇到过问题,考虑到计划本来就是给她换个新电源,我就直接买了一个,顺便还买了一个新的、更大的机箱——具体来说:
几天后,零件到了。这是全家福:
左边是 perry,中间是 poppy,坐在她的新机箱上面,右边是 Cornélia(戴着她的“耻辱之花”)。作为参照,Cornélia 是一只相当大的猫。(我知道这参照作用不大。)
是时候把旧主板和新电源装进新机箱了。这是装好后的样子:
在一个为标准 ATX 设计的机箱里,Mini-ITX 主板看起来小得像张邮票,有些滑稽。
我打开了她,幸运的是,一切正常!看来之前确实是电源的问题。
她原来的操作系统是三年多前的 Arch 版本,所以我清空了硬盘,用我的常规配置安装了最新版本,是时候做个快速测试了。
跑一次 LLM 训练,当然得是这样
最近做了这么多 LLM 训练相关工作的好处之一是,你有了一个现成的新硬件拷机测试 :-) 我还没有我的 JAX 训练代码,但我有 PyTorch 的。
现在,凭借她的 GTX 1660 Super GPU,poppy 显然无法像 perry 的 RTX 3090 那样训练同等规模的 LLM。我对模型和训练参数进行了一番调整,发现在这个配置下,我可以塞进一个精简版的 GPT-2 small:
我用 4 的微批次大小、16 步的梯度累积来训练它,其他所有超参数都与我在 perry 上的常规训练保持一致。训练 token 数量减少了——该模型有 76,933,120 个参数,所以我需要训练的 token 数量大约是参数量的 20 倍多一点——大约 1.5B,而不是我训练其他模型时用的 3.2B。
我启动了训练,出于好奇,我又在 perry 上用相同的配置启动了另一次训练,看看会发生什么。
perry 的训练过程很正常——GPU 满负荷运行,功耗 368W,大约 9 小时完成。这不到我平时训练时间的 1/4,这很合理,因为这类任务所需的时间与模型大小和 token 数量大致呈线性关系,而这两者都大约是平时的一半。
poppy 的情况更有趣一些。在 nvtop 中,GPU 使用率显示为 100%,但“有效”利用率为 53%。功耗与后者相符,在总功率 125W 中只占了 67W。我不太确定是什么原因造成的——显然某处存在瓶颈。不过考虑到我很快就要换掉这块卡,就不太值得深究了。
总之,这次运行花了 963,257 秒。也就是 267.57 小时,或者 11 天多一点。
哎哟。
比较有趣的是,这次训练不仅耗时更长(这是意料之中的),而且耗电量也更多。67W 运行 267.57 小时接近 18kWh,而 368W 运行 9 小时大约只有 3.3kWh。
买张 RTX 3090,拯救地球吧!
我决定运行平时的评估测试,以确认最终出来的结果是否正常。当被要求补全 "Every effort moves you" 时,perry 的模型回答:
Every effort moves you and your friends. The key is keeping you informed. But, you still need to be cautious about而 poppy 的模型回答:
Every effort moves you forward. Every week, you make adjustments to a certain level—just as soon as you leave your我觉得这些结果其实相当不错!而且看看我平时的 loss 测试,也证实了这些模型确实没那么糟;perry 的 loss 是 3.855702,poppy 的是 3.855981。这实际上比我之前在 perry 上钻进优化超参数的牛角尖之前得到的 3.943522 还要好。
所以,这是一次有趣的测试——当时我正和 ChatGPT 聊起这件事,它称其为“也许是个艺术项目”,我觉得这挺逗的,虽然有点故作风雅。
是时候做点更有用的事了。
一张 RTX 3090
现在要想从看起来靠谱的卖家那里以合理的价格买到一张 RTX 3090 还挺难的。但如果你想在本地训练模型,它仍然是性价比的甜点区,所以我在 eBay 上设置了提醒,最终在保加利亚冒出来一张。我买下了它,几天后,这东西到了:
实际上它比照片里看起来还要丑——丑得多。那些看起来有点像皱巴巴的铝箔的东西,其实是带有某种结晶纹理的白色塑料。这让我庆幸自己选了网孔侧板的机箱,而不是玻璃侧板的。
好吧,我买它又不是为了好看。我拆下旧的 GTX 1660,装上新卡,开机,然后:
哇,我的电脑里开起了迪斯科。真可爱。
测试,第一阶段
是时候开始另一次训练运行来看看它能不能正常工作了。这次,我进行了常规的 GPT-2 small 大小的训练,并使用了优化过的超参数。它跑了大约十分钟,然后 poppy 自己关机了。
看起来情况不妙。
我花了一些时间四处排查,试图弄清楚为什么我的新显卡坏了,然后碰巧把上面的视频发给一个朋友,并注意到了一些东西。
看看那个 Noctua 风扇——就是显卡上方、散热器支架后面那个你能看到的米色和棕色相间的风扇。它没有转。那是 CPU 散热风扇,只要机器开着,即使转得很慢,它也应该一直在转。
我把所有 PC 的基本指标都记录到一个中央 InfluxDB 实例中,所以我查了一下,结果是:
CPU 温度飙升到了大约 115°C!这可不好。显然是 CPU 触发了紧急过热保护而关机。
我起初以为在插上新 GPU 时肯定是不小心碰松了风扇线——这倒是有可能,尽管它们离得挺远——但拔下重新插紧后开机,风扇依然不转。而且在 BIOS 里也检测不到它。
接着我在 Grafana 里把时间范围拉大了一些;我只保留 30 天的指标数据,而距离我最初的烤机测试已经过去一个多月了,所以那段时间的数据已经没有了。但我确实看到了这些:
poppy 在那段时间一直处于空闲状态,CPU 平均温度超过了 70°C。测试前的温度下降是因为我在安装 GPU 时它有机会冷却下来。我花了大把时间配置 InfluxDB 监控系统,以便能获取所有设备的指标,我大概应该时不时地看一眼这些数据,因为风扇显然已经有一个月左右没转了。
好在亚马逊有次日达服务。我买了一个新的 Noctua NF-A9x14 PWM(祈祷问题出在风扇上,而不是主板上的插针),收到货后我就把它装上了。
测试,第二阶段
这一次,开机后风扇转了起来。呼。我让它空载运行了一个小时,CPU 温度稳定在 35.5°C。接着,我启动了一次标准的 LLM 训练,不过减少了 token 数量,使其刚好运行一个小时。
在此期间,CPU 温度上升到了有些烫手的 76°C——这不算理想,但别忘了,在风扇坏掉的时候,它空闲时就是这个温度。在 10% 的 CPU 使用率下就这么热似乎有点奇怪,但考虑到有一个核心在满载运行,倒也不算太离谱。毕竟散热器和风扇是为 SFF PC 设计的,这类机型通常运行温度会偏高一些。
GPU 温度也上升到了 70°C 并稳定下来,同时功耗稳定在 370W 中的约 368W,GPU 利用率为 100%。这尤其令人欣慰,因为 Nvidia 显卡默认在 83°C 左右就会降频,所以如果在满负荷下温度还能更低,说明风扇显然还有散热余量。
测试完成后,就该进行一次完整的训练运行来做烤机测试了。
我保证,总有一天我会做点不涉及训练 LLM 的事情
我启动了常规训练。CPU 和 GPU 温度稳定在了与一小时测试时相同的水平,这是个好兆头,接下来就只是等待的问题了……
……直到我看到了这个结果:
Training complete in 144,531.113 seconds
Tokens seen: 3,260,252,160
Throughput: 22,557 tokens/second
Final train loss: 3.530大约 40 个小时,这基本上是标准耗时——当然,这与我对 perry 的预期一致。冒烟测试:
Every effort moves you and your customers to the best possible extent.
Our expertise and expertise have led to our ability to当你的 LLM 试图向你推销东西时,你难道不觉得很有趣吗?1 但无论如何,测试集上的 loss 为 3.548880,这与在 perry 上进行相同训练的结果基本一致。
成功!
目前就先到这里
所以,现在 poppy 是一台配置妥当的训练机器——配备一块 RTX 3090,一个运行温度稍高但至少不会紧急关机的 CPU,以及一个有足够空间容纳更多 GPU 的机箱和电源。
我想下一步应该就是上水冷了。为了支持多块 GPU,我需要换一块新主板,可能还要换个新 CPU,所以我觉得没必要给 CPU 上水冷,尽管它温度偏高——我只会给它买个水冷头,而在不久的将来又得把它扔掉。
相反,我会给 GPU 买个水冷头,搭一个只给它散热的循环水路。谁知道呢——说不定我还能顺便把那些糟糕透顶的 RGB 灯效给拆了!
我们总是心怀希望。
需要完整排版与评论请前往来源站点阅读。