一张24GB显存的RTX 3090,能跑得动70B参数的大模型吗?
按照常理,这纯属“想桃子”。
Llama 3.1 70B即便经过量化,通常也得两张甚至四张高端卡才能勉强塞得下。
但最近,GitHub上出现了一个硬核项目,愣是把这件不可能的事变成了现实。
显存不够,硬盘来凑。
只不过,这并不是简单的虚拟内存,而是一次绕过CPU的外科手术级数据搬运。
把大象塞进冰箱,还得绕过CPU
通常我们跑大模型,权重数据得先从硬盘读到内存,再由CPU搬运到显存,最后GPU才开始计算。
这一路关卡重重,CPU就像是那个不仅要签字还要亲自搬砖的“中间商”,效率低得令人发指。
这个名为ntransformer的项目,直接把这个中间商开除了。
它实现了一套NVMe Direct Streaming机制。
简单来说,就是让NVMe SSD通过DMA(直接内存访问),把数据直接扔给GPU。
NVMe SSD → (DMA) → Pinned Staging → (PCIe H2D) → GPU Buffers → Compute
数据路径被彻底重构。
模型文件通过dd命令直接写入NVMe原始块设备,然后在推理时,每一层权重(大约670MB)通过670条NVMe指令直接调用。
老实讲,这种操作挺危险的,但也极客味十足。
项目脚本甚至需要手动绑定VFIO驱动,强制设置PCIe电源状态。
0.2 tok/s的浪漫
能跑起来是一回事,好不好用又是另一回事。
根据项目描述,对于70B的Q6_K量化模型,读取每一层大约需要202毫秒。
Llama 3.1 70B有80层,这意味着生成一个Token,光是把权重搬运一遍,就需要十几秒。
评论区里有眼尖的开发者直接算了一笔账:
0.2 tok/s is fine for experimentation, but it is not interactive in any meaningful sense.
每秒0.2个Token。
说实话,这个速度确实有点“感人”。
你问它一句“你好”,它可能得想个半分钟才开口。
有意思的是,项目方宣称实现了“33倍加速”。
这其实是个相对概念,相比于最初那种完全没优化的搬运方式,现在的方案通过双缓冲和流水线重叠,确实快了很多。
但相比于把模型全塞进显存的“土豪”玩法,这依然是自行车追跑车。
——这不禁让小编想起自己的毕业论文,多少速度你别管,反正得有加速,得有创新点,
该说不说,俺当时也用了双缓冲和pipeline。
个人觉得,这就像是用软盘启动了Windows 11。你能做到这件事本身确实很牛,但真要拿它来办公,恐怕得把人急出心梗。
三层缓存,榨干每一滴性能
虽然速度感人,但这个项目的工程实现依然堪称教科书级。
为了在24GB显存的“螺蛳壳里做道场”,作者设计了一套3层自适应缓存架构。
这就好比一个精明的仓库管理员:
- Tier A(常住显存): 把前29层常驻在显存里。这部分不用搬运,计算时零I/O开销。
- Tier B(内存缓冲): 中间层放在锁定的内存里,通过异步DMA传给GPU。
- Tier C(硬盘回退): 实在放不下的,就老老实实待在NVMe里,随用随调。
这种分层策略,让单张3090在显存捉襟见肘的情况下,硬是撑起了70B的骨架。项目甚至支持Q4_0、Q8_0、Q6_K等多种量化格式,还包括F16和F32。
这不仅是代码层面的优化,更是对硬件特性的极致压榨。
“技术正确”
虽然实用性存疑,但这并不妨碍它在极客圈子里引发热议。
评论区里有人已经在畅想未来了。
一位开发者提到,理论上结合Gen5 NVMe和SGLang的路由层,甚至可能跑起1T参数的模型——只要你的硬盘够快。
还有人提到了DirectX早就有类似API,或者NVIDIA自家的GPU-Direct技术。
这说明大家苦“显存贵”久矣,谁都想找到那条绕过黄牛和溢价显卡的捷径。
但冷静下来看,这更像是一场技术上的“概念验证”。
正如一位评论者所言,对于大多数实际应用场景,一个经过良好量化、能全塞进显存的8B或13B模型,在延迟和质量的综合权衡上,绝对吊打这种“硬盘直连”的方案。
毕竟,没人愿意为了省一张显卡的钱,把大模型用成了老式电报机。
不过,技术的魅力往往就在于这种“无用之用”。今天它是0.2 tok/s的实验品,明天也许就是低资源环境下的救命稻草。
如果下一代NVMe速度再翻倍呢?如果模型架构进一步压缩呢?
这大概就是开源社区最迷人的地方:总有人愿意去尝试那些“看起来毫无意义”的极限挑战。
对于手里只有一张3090的开发者来说,这或许就是离70B大模型最近的一次。
参考链接:
https://github.com/xaskasdf/ntransformer