挑战纯CPU最低成本推理极限:四路E5服务器装机与模型优化
挑战纯CPU最低成本推理极限:四路E5服务器装机与模型优化
本文作者分享了其在四路E5服务器上的装机与模型优化经验。文章详细描述了作者在配置、成本、性能优化等方面的探索过程,包括遇到的问题和解决方案。文章内容深入,包含了具体的硬件配置、成本分析、性能测试数据以及优化方法,具有较高的技术含量和实用价值。
前情提示
本贴属于个人探索帖, 后续用到的一些模型推理项目也大都处于测试开发阶段, 模型可能会出现无法载入或者运行不稳定等各种兼容性问题, 如果是为了想低价玩模型的纯小白, 不建议仿照, 如果有大佬知道优化思路的, 也欢迎一起探讨, 当然真想入手可以考虑单纯入手一块四路x99的主板放家里备着, 价格几百也不算太贵, 将来对于纯CPU并行优化好了, 可以再采购其他材料装机直接玩, 因为现在二手市场上的正牌的四路主板货还是很稀缺的, 特别是支持e5 v3以上的, 不是便宜不便宜买到的问题, 是难不难买到的问题, 我为了买这台机器的主板就在咸鱼和各老板博弈了将近一个星期. 本贴也不会涉及过多的理论科普, 主要展示实际中的应用.
当前配置成本
RQ750主板 + 原装电源 1250元
内存DDR4 2133 x16 128G 16x40=640元
E5-4650 v3 * 4 20x4=80元
硬盘散热机箱等各类杂项 500元左右
当前整台机器成本在2500元左右, 本机48核心96线程, 最大理论内存16通道带宽是272GB/s, 加上128G的RAM容量, 理论上跑一个70B Q8会有3~4t/s的速度, 并且考虑的以后会有越来越多的大体积优秀moe架构的模型推出,性能高的同时推理速度还不低,对于CPU+内存方案是很吃香的,我也是在向着无限接近理论性能不断寻求优化方案, 因为怕翻车因此只买了这么多内存.
对于家养服务器购买建议是, 不要直接买准系统, 只买原装的主板和电源就够了, 机箱和风扇自己DIV, 因为原装考虑到原工作场景, 给2U机箱的体积和高度有限, 四颗高功率CPU散热会出问题, 原装采用的是几个暴力工业风扇解决, 小风扇配滚珠轴承声音非常尖锐而且还吵, 因此机箱和风扇建议自己DIV, 买4U的通用机箱增加高度, 然后换更大号的静音磁悬浮风扇来解决噪声问题.
真16通道与假16通道问题
这也是我装完机并跑上模型之后才遇到的问题, 当时装机直接按经验内存通道插满, 并且BIOS关了超线程和NUMA, 直接装上Ubuntu Server用kobold跑了一下LLama 8B Q8做测试, 发现速度慢得离谱, 仅4t左右, 于是装了Win10去烤机做了测试, 整台机器内存带宽才25GB/s, 并且只识别了两颗CPU? 一度以为是主板或者CPU出了问题, 花了大把时间在CPU四个槽位挨个拆卸, 后来才知道是被Win系统坑了, 不装企业版整机最多支持双路, 并且主板BIOS必须开启NUMA,也是绕了个大圈子, 后来烤机数据就正常了, 内存带宽有230GB/s, 对于3000以内的价位还是很不错的, 于是又用kobold跑了一下LLama, 速度依旧只有4t? 排查了各种问题才知道, 这台机器是个假16通道, 当前网上的CPU内存跑满血r1都是用的真16通道, 当然成本也是大幅度提升, 基本预算要上万, 单颗CPU就要几千, 岂是我20元一颗洋垃圾能比的? 由于目前llamacpp还未做CPU方面的并行优化, 对于真16内存通道CPU直连的主板, 往往不会出现降速问题, 但对于多路CPU往往只有单节点的带宽性能, 一旦模型被均摊到所以内存中, 就会出现跨节点访存降速的问题, 这个问题后面会给几个粗略的图解来解释.
关于真16通道, CPU数据总线与16个内存并行直连, 现在市场上很多组CPU+内存跑deepseek的都是用的这个方案, 可以参考这个链接, 成本基本都要上万, 当然推理速度4t左右也还行
https://digitalspaceport.com/how-to-run-deepseek-r1-671b-fully-locally-on-2000-epyc-rig/
而假16通道则是主板只给CPU直连4通道, 加上E5 CPU本身也就只支持四通道, 因此即使是16通道直连也毫无意义, 而且还会出现跨节点访存降速的问题, 我用我组的这台机器示例, 每个CPU的本地NUMA节点内内存访问虽具备4通道68GB/s的理论带宽优势, 但受限于QPI互连总线仅9.6GT/s(对应19.2GB/s双向带宽)的物理瓶颈, 在跨节点NUMA访存场景中带宽将产生断崖式下跌. 更关键的是, llamacpp推理框架原生缺乏多CPU并行计算优化机制,导致跨节点的数据交互产生大量非必要的总线传输负载.
很不巧的是, 本人就是组的这种假16通道(不然为啥才2500元呢?), 这个可以用mlc工具测试, 可以看出非对角线处无论是延迟还是带宽都非常慢, 但是总带宽却很高, 因此本贴主要就是针对这种假16通道来进行推理速度的优化, 这还是很有意义的, 一旦成功了, 对于本地化模型成本会大幅度下降
一个朋友洋垃圾组的双路服务器, 也同样存在这类问题, 不过没四路的严重
为了攻克跨节点访存带来的性能损失, 对于一些小模型来说, 优先考虑只在单节点上运行, 这里直接用的unmactl工具来跑llama 8b, 只在CPU1上推理, 并且局部的四通道开启内存交错访问, 性能得到了改善, 速度由4t到了6.5t, 比较接近单节点理论带宽了
numactl -N 0 -i 0 ./kobold...
这里也是试了在四路只在本地节点同时推理了四个nemo q8, 都有4t的速度, 说明只要实现了并行推理, 那速度就能有四倍超过15t/s的提升, 达到能用的地步
对于分布式推理的项目, 我首先想到的是一个叫EXO的项目, 毕竟早有耳闻, 但是后来搭了才知道, 该项目目前只支持苹果等Mac系列, 纯CPU还并不支持, 那我这台机器岂不是暂时只能放家里吃灰了? 就在失落之时, 我无意间逛了一下Reddit, 发现了这样一个贴子, 这也让我燃起了希望.
后来得知他用到了一个叫distributed-llama项目, 而且是专门针对纯CPU+内存方案的进行的张量并行性推理的项目, 支持家用跨设备分布式推理.
https://github.com/b4rtaz/distributed-llama
与exo项目不同的是, 他使用的是树形结构, 根节点将模型的所有切片分发给 worker 节点。项目本身的初衷是跨设备推理的, 对网速带宽有要求, 本机QPI链路本身带宽就不低, 很适合进行尝试, 具体用的什么技术可以参考一下项目作者写的帖子, 这不是科普帖, 不做过多的赘述
https://b4rtaz.medium.com/how-to-run-llama-3-405b-on-home-devices-build-ai-cluster-ad0d5ad3473b
于是再次尝试了dllama和llamacpp对于llama 8b q8进行对比, 前面也说了llamacpp单节点最大速度仅6.5t, 如果8b q8的模型可以完美的并行推理的话, 速度可以达到24t以上的,
但是这只是理论的预测, 实测之后, 采用该项目进行张量并行推理优化, 初测8b q8, 用numactl工具将三个worker节点进程与一个根节点进程绑定在各自的四颗CPU节点上, 节点内的内存开启局部的内存交叉访问, 并通过环回网络相互通信。测试后四节点推理速度来到了15t/s, 但是似乎离24t的速度还有一定的距离, 后来又测了单个根节点的推理速度仅5t, 双节点的速度9t, 看样子项目还没对推理速度进行优化, 目前单节点速度还不及llamacpp, 也有可能是我CPU算力不够了? 拖累内存带宽了? 因为已经上到44核了, 推理速度还有提升, 可能是20块的洋垃圾不太行了? 后续会考虑换CPU进行测试, 上到72核, 目前服务器放家里了, 暂时只能更到这里了.
这是目前开启并行推理和llamacpp单节点推理速度的差异, 同样跑llama 8b的q8量化, 目前的目标是将推理速度优化到24t/s以上
左下是并行, 右下是llamacpp
这也是目前的推理优化进度了, 如果扩大内存跑671B版本Deepseek R1, 最低1.58bit量化预估能有2~3t的速度了, 可以继续优化, 到了4t左右就完美了.