在家搭建AI:一箱边角料
当下对软件开发者来说是个有意思的时代——在我看来,Transformer大语言模型是业内许久以来首个真正新颖且值得关注的技术突破。基于它打造的AI编码助手,已迅速成为程序员工作的核心工具,这种感觉就像从手工木工活切换到电动工具,好坏参半。
我这个人,只有能把一件技术产品拆了再在车库里装回去,才敢真正信任它。那种连接到别人控制的服务、用远程编码助手的模式,总让我心里发毛:风险实在太多了。你慢慢依赖上它,说不定哪天就被停用了。这项技术确实令人兴奋,但我不想连到某个大型AI数据中心——我想要的是每家每户都有一个迷你AI数据中心!眼下电脑配件有点供不应求(或者说,2010年代后期是供过于求?),为了控制成本,我只能用"电子垃圾"来攒机。
核心需求是一堆GPU。我需要能高速处理大量并行矩阵运算的设备,GPU正好符合要求。但如我所说,现在但凡设计来运行AI负载、或是公认擅长AI运算的设备,价格都高得离谱。
2022年,不少公司都在发力"云游戏"——玩家不用买昂贵的游戏PC或主机,直接在远程数据中心运行游戏。AMD当时把一款工作站GPU加了额外显存,去掉了所有视频输出接口,做成了一款叫"V620"的显卡。这款卡从未面向公众发售,所以你可能没听说过。AMD产能严重过剩,后来云游戏因为延迟问题(现在看是显而易见的原因)没做起来,这些卡就积压了。
V620并非为AI负载设计,而且AMD的软件支持一向口碑不佳,所以在eBay的二手服务器硬件商家那里,这些卡价格相当便宜。我买到的卡看起来几乎全新,估计根本没被用过,每张都带32GB高速显存。虽说大家都说它不适合我要用的场景,但真要让它跑起来能有多难呢?
对了,这些卡不带风扇。作为服务器显卡,它们依赖服务器上那种噪音极大的涡轮风扇散热,这事儿我们稍后再解决。
配件短缺之下,我又淘了些其他电子垃圾来搭建GPU阵列。主板是2017年的X299平台,来自别人淘汰的游戏主机,因为够老,在eBay上很便宜。我看中它的唯一原因是,它有四个间距合适的PCIe x16插槽,能并排插四块GPU。CPU是Intel酷睿i9-10900X,堪称Intel近20年最拉胯的产品:2019年发布时,它是Skylake架构的第四次刷新版,定价虚高还功耗惊人——当时Intel在处理器设计和制程工艺上都跟不上AMD锐龙系列。不过这对我来说反而是好事:现在它很便宜,而且能满足我的需求!
内存和SSD是从家里其他旧电脑上拆下来的。这当然算"作弊",要是现在买新的,价格肯定让人肉疼。但其实这套设备对内存和SSD的要求没那么高:所有运算都在GPU显存里完成,模型从磁盘加载完成后,内存和SSD基本就闲置了。就算没有旧零件可用,这部分也能选很便宜的产品。
要带动四块GPU加上Intel这款低能效CPU,得配个大功率电源。奇怪的是,eBay上1600W电源比1200W的还便宜。我不指望它一直满负载运行,但开机时所有设备同时启动,必须得有足够的功率余量。
我特意买了新机箱和风扇。说到风扇!这些数据中心显卡自带散热风扇,完全依赖服务器机柜的墙式风扇通风。网上能找到不少可3D打印的风扇导风罩模型,但如果要并排插四块卡,这些模型就不太适用了:要么用一个极小的40mm风扇,噪音超大;要么导风罩太突出,没法把卡并排安装。四块双插槽显卡并排宽度约160mm,我真正需要的是两个80mm服务器风扇,对着显卡散热器吹风。
于是我自己建模并打印了一个导风罩,能给两块卡装一个80mm风扇。显卡背面有个金属理线鳍片,用小螺丝固定着,我就用这些螺丝孔来安装导风罩。导风罩上留了电源接口的缺口,背面还有四个风扇安装孔。我用碳纤维ASA材料打印的,其实普通PLA料也完全够用。
我选了10000转的风扇,就为了保证风量,而且它们和低速风扇价格一样。噪音是真的大!我本来想让主板根据GPU温度调节风扇转速,但一开始没成功,所以调试初期只能戴着耳罩操作。
机箱一开始启动不了。我戴着耳罩在车库里折腾了一小时BIOS设置,才找到让主板识别四块显卡的正确参数(得在高级设置的两个子菜单里分别开启Resizable BAR和MMIO High Size,毕竟2017年没人会想到给这块主板插这么多显存)。差不多这时我才发现车库没装网线,于是晚上11点开始在墙上钻洞布线。
不管怎样,经过几次失败尝试后,机箱终于能启动了,我开始安装Ubuntu 24.04。戴着耳塞、风扇还没法调速的情况下,我编译了我最喜欢的推理服务器——出色的llama.cpp,并测试了Gemma4模型,它刚好能装在单块显卡里。之前用单GPU工作站时,这就是我最喜欢的本地模型,这次测试表现也不错:虽不如我之前用的RTX 3090快,但完全够用。接着我启动了这次装机的目标模型Deepseek V4 Flash,速度有点慢!目前我还不知道怎么提速(下一章再细说),只是想确认它能不能运行,结果是可以的。
再回到风扇的问题!我必须强调,这噪音真的太大了。满转速时,隔着家里的墙都能听见,但其实根本不需要这么高的转速。最初我打算用主板自带的风扇控制功能,但这块主板没法给不同风扇设置不同转速——显然Supermicro的主板常有这个问题。于是我自己做了个风扇控制器:我有一盒子关税战前从速卖通买的杂牌Arduino Nano克隆板,翻出十年前大学微控制器课上写的PWM电机控制代码,稍微改了改。
风扇控制器会从服务器获取转速百分比,服务器上需要一个脚本读取温度、相应调节风扇转速。这是台AI服务器,让它自己写风扇控制脚本似乎再合适不过。Deepseek V4 Flash完全能胜任,只要像用轻量AI模型做开发那样,给点指导和互动就行。过程中还发生了件趣事:我让它想办法让GPU升温来测试脚本,它开始写PyTorch矩阵乘法脚本,我告诉它"不用这么麻烦,你就在这些卡上运行,你本身就是这台电脑上llama.cpp实例里的模型,随便生成点内容就能让显卡负载上来",它好像经历了一场短暂的"存在主义危机",太可爱了!
控制器就放在一块实验面包板上,直接塞进了机箱里。我在面包板上贴了点电工胶带,防止它和机箱短路。
目前这套设备已经相当稳定,GPU也测试过了,接下来我要全力研究怎么让它提速——这部分我会在下一章讲。
昨天,这篇文章居然意外登上了Hacker News和Bluesky的热门榜。我正在写第二章,这里先回答几个读者问得比较多的问题。