组装一台多 GPU 工作站
或者说,其中的一波三折。
计划草案
最近得到了两张 Nvidia Tesla A2 的显卡。16Gi 的显存配合 CUDA 8.6 的能力,拿来跑一些本地小模型应该是没什么问题的。但是两张显卡如果要想都能用上,就需要换一张能够插两张显卡的主板:之前的家用工作站的两张主板都只有一个 PCI-E x16 的插槽。而之前搬离徐州的时候,我没有选择把整套服务器架构都寄到深圳,而是将他们都拆出来以零件的方式单独寄回。一方面是因为深圳的八平米是真的没法摆下这么一个庞然大物;另一方面是寄服务器,尤其是寄一套组装好的整机,比我想象得要复杂多得多得多。
所以,现在该在深圳重新构建一台工作站了。这可真不是一个省油的爱好。
构想很简单:找一个 PCI-E 插槽足够多的主板,全量迁移到那个主板上,然后视情况卖掉原来的主板。其中的依赖项目随过程动态解算即可。
事实证明规划还是得多做细审,不然很容易落入到局部可行但全局冲突的情况。
开始装机
如果要全量迁移,那么就需要找到至少提供 2 路 PCI-E x16 来接两张计算卡和 1 路 PCI-E x8 接阵列卡的主板;理想情况下还额外的需要一个 PCI-E x1 用于插一张 2.5Gbps 的网卡。
这种需求一般需要服务器主板来满足,而且通常最小需要到 EATX 形制。这就意味着目前最大只支持到 ATX 的机箱得跟着换掉。因为 NVIDIA Tesla A2 是 2U 高的卡,以及其他一众扩展卡都是不超过 2U 高的,我们自然可以选择 2U 的机箱。这样显卡和阵列卡就都可以借助机箱本身的风扇来散热,而不需要再额外地魔改风扇上去。
但是超微 X10DRG-Q 不是普通的 EATX 主板。当我发现这个主板按照正确的安装方向完全没法放下去的时候,我就知道问题严重了起来。
它的尺寸是 335.28 × 384.04, 而标准 EATX 的主板尺寸是 305 × 330. 这就意味着这个特殊的主板必须配一个特殊的机箱;而这个特殊的机箱又非常难找。
于是我一怒之下决定:开放式机箱走起!不就是显卡还是得魔改散热么,直接醋酸胶带粘涡轮扇上去结束战斗。我直接买矿机用的开放机箱,这货能插 4 张大显卡,我就不信它还不够大!
但小李啊小李,你在买东西之前,就不会先看看尺寸么?结果到货了发现,即使是专门给矿机用的开放式机箱,也还是短了那么一截。本来计划中秋三天可以结束战斗的,现在感觉是又得拖成一个大项目了。
我不太想现在就认输。开放机箱说到底不过是个铁架子,而我则有钢铁般的意志——和金工实习。我只需要将架子中挡住主板的部分锯掉,就可以把主板凑合着装上了。虽然没有台钳,但是并不妨碍我用小钢锯一点点挫掉遮挡部分;再简单地用砂纸打磨一下锯口后用醋酸胶带贴住,避免这玩意滴血认主,就算大功告成了。
只可惜 2U 机箱最后没用上。这么大个物件退货的邮费都要赶上购置费用了,只好先塞到机柜里以备后用。
迁移系统
有些时候我会因为接触过太多主板都自带一个 M.2 硬盘位而忘记了这玩意可是个新鲜功能的事实。这块主板虽然有足够多的 PCI-E 接口,但并没有一个 M.2 硬盘接口。所以,小李啊,你还得想办法把你这个 M.2 的系统盘迁移到 SATA 硬盘上。
啊,反正 PCI-E 接口够用。我再召唤一张 PCI-E 转 M.2 硬盘卡不就好了?
然而第一张转接卡到货后,我发现系统不认盘。仔细阅读说明之后我才意识到:并不是所有用 M.2 接口的硬盘都是 NVMe 硬盘;而这种无源转换卡是只支持 NVMe 硬盘的。NGFF SATA 盘虽然表面上用的是 M.2 接口,但底下跑的还是 SATA 协议;之前的主板只是恰好两套协议都支持而已。
所以,正确的玩法是:换一张「有源」卡,把系统盘插上,然后再从转换卡上接一根 SATA 线到主板的 SATA 口上。本质上是从 PCI-E 插槽上供电,实际的数据还是走传统的 SATA 链路。
点火入轨
苦难终于结束了(笑)。
服务器主板的远程管理功能确实好用。超微的 BMC 功能带一个 iKVM, 使得我不需要再接一套显示器和键盘就可以在网页端设置 BIOS 选项和安装系统引导。软件的迁移过程并不需要费太多功夫,只是简单地运行一下 grub-install 即可。
模型运行时当然是我们的老朋友 llama.cpp. 得益于两颗 CPU 带来的 88 线程,编译速度也提升了不少。拖一些规模稍大的各类模型试跑一下,没有遇到太多奇怪问题,两颗 GPU 都能正常使用。
不过不得不感叹,这玩意跑起来是真的热啊!GPU 核心温度飙升到 80 摄氏度是常有的事情。如果后续换能耗更高的 GPU, 可能甚至得考虑整个房间的散热的问题。不过,之后的问题就先留给未来的我;现在我们可以着手做一些 NLP 相关的事情了。