返回 2026-07-10
🤖 AI / ML

poppy 训练盒,第 1 部分:起步poppy the training box, part 1: the beginnings

gilesthomas.com·2026-07-09

作者计划搭建一台专门用于本地 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 是我的日常主力机。如果它正在跑训练任务,那么由于 CPU 和 GPU 都处于忙碌状态,所有操作都会变得有点卡顿。
  • 虽然我不常玩游戏,但连续好几天连玩游戏这个选项都被排除掉,还是挺让人心烦的。
  • 当 GPU 忙于训练任务时,我无法并行进行其他实验——比如,去探索下一步该做什么。
  • 与上述所有问题相关的是:我之前做训练任务设定的两天时限,是因为这是我愿意让 perry 被占用的最长时间。尝试更长时间的训练一定会非常有意思!

    我还有一些更长远的计划;组装一台多 GPU 机器会很有趣——不仅是为了在本地拥有更强的算力,也是为了在开始花钱租用昂贵的机器之前,能够测试更大规模的云端多 GPU 训练任务。每小时 15.92 美元的机器租金不算多,但积少成多,尤其是当你还在调试并行问题时消耗着这些钱。

    最后,我一直对在 PC 中组装定制水冷系统很感兴趣。我从 1995 年左右就开始自己组装电脑了,但一直没顾上尝试这方面。听起来很有趣!

    尽管有所有这些未来的计划,这仍是一篇相当普通的装机贴——讲我如何改造一台旧 PC,插上一块从 eBay 买的二手 RTX 3090,测试了所有部件,意外地训练了 11 天的 LLM,还差点把 CPU 给烤了。

    随着时间的推移,我预计会发布更多——也更有趣的——装机细节。就把这篇当作是确立一个基准吧。

    poppy

    在我搬到里斯本之前,我们在这里有一处度假屋。我们过来的时候,我会带上我的笔记本电脑,但这总是有些令人不满意——用于工作的 CPU 性能有限,用于偶尔打游戏的 GPU 也有限。

    在新冠疫情期间,我们开始在度假屋住更长的时间——这成了一个无法忽视的大麻烦。所以在 2020 年,我组装了一台小尺寸 PC,并给它起名叫 poppy。当时的限制条件是:

  • 足够小,能装进随身行李包。我在伦敦组装这台机器,希望能轻松把它带到葡萄牙,并且如果我想的话,也能把它带回来。
  • 足够便携,能在公寓里快速移动。在度假屋里,餐厅就是我的书房,所以我希望能平时把 poppy 放在那里,但在有客人来吃饭时能把它挪走。
  • 性能足够强大,能运行我玩的游戏——当时我是《刺客信条:奥德赛》的忠实粉丝,这款游戏不需要旗舰级显卡,但也绝非轻量级。
  • 和所有 SFF PC 一样,组装过程有点繁琐。你可以在 PCPartPicker 上看到配件清单和装机笔记,简而言之,它的配置如下:

  • 一颗 AMD Ryzen 5 3600 3.6GHz 6 核 CPU
  • 一个 Noctua NH-L9a-AM4 CPU 散热器
  • 一块 Gigabyte X570 I AORUS PRO WIFI Mini ITX 主板
  • 32 GiB Corsair Vengeance DDR4 内存
  • 2 块 Samsung 970 Evo 500 GB NVMe SSD
  • 一块 Zotac GTX 1660 Super 6 GiB GPU
  • 一个 Lian Li PC-TU100 Mini ITX 机箱
  • 一个 Corsair SF450 450W SFF 电源
  • 它看起来是这样的:

    (天哪,我都忘了我们那个餐厅的壁纸有多么……鲜艳。)

    作为参照——那个机箱比两罐叠在一起的易拉罐可乐稍微高一点。所以,相当小。

    当我们全职搬到里斯本时,我把 perry 从伦敦带了过来,虽然他后来升级过几次(包括在2023年底加了一块 RTX 3090),但他一直是我日常使用的主力机。所以 poppy 就坐在书房的角落里,伤心地吃灰 :-(

    是时候让她重见天日了。初步计划:让她在一个新的、更大的机箱里运行起来,并配一个可能带得动三张显卡的电源。

    让她在新机箱里运行起来

    起初,我发现她开不了机:快速检查后发现问题出在电源上。我以前在 SFF 电源上遇到过问题,考虑到计划本来就是给她换个新电源,我就直接买了一个,顺便还买了一个新的、更大的机箱——具体来说:

  • 一块 ASRock Phantom Gaming PG-1600G 1600W 电源,电力绝对管够——一块 RTX 3090 满载功耗大约在 370W 左右,所以即使有一两张 GPU 出现功耗峰值,它也应该能毫无压力地带动三张显卡外加一个 CPU。
  • 一个 Fractal Design North XL 机箱。perry 已经在一个 North 机箱里了(不是 XL 版本),我很喜欢这款机箱;如果我要往里面塞更多 GPU,XL 版本看起来是个不错的选择,而且它有充足的空间用于水冷。
  • 几天后,零件到了。这是全家福:

    左边是 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:

  • 词表大小:50257——这是固定的,因为我使用的是 GPT-2 分词器。
  • 上下文长度:从 1024 降到 512
  • 嵌入维度:从 768 降到 512
  • 注意力头数:从 12 降到 8
  • 层数:从 12 降到 8
  • QKV 偏置:无(与 GPT-2 不同,但与我本地最好的模型相同)。
  • 我用 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 灯效给拆了!

    我们总是心怀希望。

  • 此外,还有那种“专业又专业”的小模型味道。 ↩
  • 需要完整排版与评论请前往来源站点阅读。