这段时间在硬件圈和大模型圈子里,"单卡 5090 跑 125B 大模型"这件事被反复刷屏。第一次看到 Strata 这个名字的时候,我也跟大多数人一样先算了一笔账:125B 参数,就算用 4-bit 量化,光权重也得 60 多 GB,一张 5090 只有 32GB 显存,怎么想都不够。但等我真正动手把这套环境搭起来、把模型跑起来,才发现之前的计算没有错,只是思路错了——MoE 模型的推理方式跟传统稠密模型完全不一样,Strata 恰恰是抓住了这个差异,把本来属于服务器的能力硬生生拉到了普通 PC 上。
这篇文章不打算复述那些转来转去的消息,而是把我从验证、部署到调优的完整过程整理出来。想在自己机器上跑 125B 级别模型的同学,看完应该可以少走很多弯路;对原理感兴趣的同学,也能在中间几节里找到足够多的细节,知道为什么这件事能成、瓶颈在哪里、哪些场景适合这么玩。
1. 单卡跑 125B,难的不是算力而是显存
很多人一听"125B 大模型",第一反应是"这玩意儿不是得上 8 卡服务器吗"。这话对,但只说对了一半。真正卡住单卡推理的东西,不是计算量,而是显存容量和显存带宽这两堵墙。
1.1 先算一笔显存账
大模型推理的第一道门槛是权重怎么放得下。以 125B 参数为例,如果按 FP16(每个参数 2 字节)存,光模型权重就是 250GB,30 块 32GB 的显卡才勉强塞得下。换成 INT8 量化(每个参数 1 字节),125GB,依旧远超单卡。就算极限压缩到 INT4(每个参数 0.5 字节),也有 62.5GB,还是比 5090 的 32GB 显存大了一倍。
这里还没算推理过程中额外的显存开销。KV Cache 要占、中间激活值要占、框架和 CUDA 上下文也要占。所以用传统思维去想,单卡跑 125B 就是个不可能三角:容量不够、带宽不够、还有一堆隐藏开销。
1.2 MoE 的稀疏激活:看似很大,实则很轻
"总参数 125B"里有两个完全不同的概念:总参数量和单 token 激活参数量。Strata 能跑通的根本原因,就是它针对的是 MoE(Mixture of Experts,混合专家)结构。MoE 模型的内部不是一个完整的大网络处理所有 token,而是拆成"注意力共享层 + 多个专家子网络"的形式,中间再由路由器决定当前 token 派给哪些专家。
拿常见的 MoE 配置来说,125B 总参数里可能有约 100B 分布在几十个专家里,但每个 token 只激活 top-2 或 top-4 个专家。也就是说,单 token 实际参与计算的参数量可能只有 10B 左右,算力压力远没有 125B 那么大。麻烦的是显存:哪怕只用其中一小部分专家,所有专家的权重也都得存着,路由说不定下一秒就轮到哪个专家工作。
这就形成了一个很有意思的局面:MoE 的短板不在算力,在"存储和搬运"。算力上它比同规模稠密模型轻得多,但显存放不下所有专家。Strata 的全部设计都在回答一个问题——既然所有专家放不进显存,那能不能让权重在内存和显存之间流动起来,谁被路由选中就把谁搬进来?
2. Strata 的技术解法:让权重动起来
Strata 的思路其实是对"显存完全装下模型"这个传统假设的重新审视。它把系统内存、显存、甚至固态硬盘,统一看成一个分层的存储池,然后在上面做非常激进的调度。
2.1 权重量化:内存里能塞多少决定上限
第一步还是量化。125B 模型不动权重的话,交给系统内存都费劲。Strata 支持把权重压到 4-bit 甚至更低,这一步的目的是让"未激活的专家"能完整放进内存里。压到 4-bit 后,62.5GB 权重可以放进一台 64GB 内存的机器,如果你的机器是 128GB 内存,还能给 KV Cache 和文件系统页缓存留出充裕空间。
但量化不是无代价的。4-bit 会让激活专家的计算精度下降,对某些任务(比如代码生成、数学推理)影响比较明显。Strata 的做法是支持同一份模型不同层用不同精度:共享的注意力层和路由器保留 8-bit,专家的权重用 4-bit。因为路由器和注意力层每个 token 都要过,精度损失会被放大;专家权重只在被选中时才参与计算,4-bit 的影响相对可控。这个"混合精度"设计是我认为整个项目里最务实的一点,既压了内存占用,又保住了大部分输出质量。
2.2 Expert 级卸载:真正的"绝活"
量化只是前菜。Strata 的核心机制是 Expert Sliding Window(专家滑动窗口)式的卸载。具体说,显存里只驻留三类东西:共享层(注意力、路由器)、当前和最近被激活过的专家、以及一小块预取缓冲区。当路由把一个 token 分配给某个不在显存里的专家时,系统才把它的权重从系统内存搬到显存,同时把最久没用过的专家踢回内存。
这个机制的关键在于"替换"而不是"加载"。如果每次都要把专家权重从内存拷进显存,PCIe 带宽就成了瓶颈。RTX 5090 是 PCIe 5.0 接口,理论带宽 64GB/s 左右,但实际单方向传输很难跑满。一个专家权重假设 1.5GB,搬运一次要几十毫秒。如果每个 token 都搬运两次,生成速度就崩了。
所以 Strata 做了两层优化。第一层是预取:根据路由历史的统计规律,提前把"大概率会用到"的专家放进显存。第二层是缓存驻留:一批 token 往往被路由到同一批专家,连续生成同一段文本时,专家可以被反复命中,不用重复搬运。实测中只要连续生成几百个 token,专家命中率能稳定在 85% 以上,搬运开销被摊薄到可以接受的水平。
2.3 KV Cache 和批处理调度
MoE 推理还有一个隐性成本:KV Cache。注意力层的 KV 缓存是逐 token 增长的,序列越长占显存越多。Strata 把 KV Cache 的一部分放到系统内存,通过异步预取的方式在需要时搬回显存。这一步如果做不好,长上下文生成时会出现"生成到一半显存爆掉"的尴尬场面。
调度层面,Strata 支持持续批处理(continuous batching)。当一批请求里有 token 完成生成,它的显存资源立刻释放给新请求,而不是等到整批结束。这个设计对单卡场景尤其重要,因为显存资源本来就很紧张,任何"等一批跑完再处理下一批"的浪费都是不可接受的。
3. 从零搭建:单卡跑 125B 的实操记录
下面是我的实际部署过程。我用的是一台普通工作站,配置不一定非得跟我一样,但关键部件的选择逻辑值得参考。
3.1 硬件配置与驱动准备
我的配置:RTX 5090 显卡(32GB 显存)、64GB 系统内存、PCIe 5.0 主板和固态。这里要特别提醒两点。
第一,系统内存 64GB 只是最低门槛。跑 4-bit 权重的 125B 模型需要约 62.5GB 内存,加上操作系统、驱动和 CUDA 库的占用,64GB 会非常紧张,建议直接上 128GB。我一开始在 64GB 机器上试,模型加载到一半就触发 OOM,加了一条内存后整个世界都清净了。
第二,固态硬盘的速度影响的是"冷启动加载"的速度。首次把权重从硬盘读入内存,或者显存溢出时向硬盘换页,都要走磁盘。PCIe 4.0 以上的 NVMe 固态是底线,PCIe 5.0 的体验会好很多。我用一块 2TB 的 PCIe 5.0 固态放权重文件,冷启动加载 62.5GB 权重大约用了 50 秒。
驱动方面,安装对应显卡的最新驱动和 CUDA 运行时环境即可。装完之后一定先用一个小的测试模型跑通推理链路,确认驱动、运行时、显存都能正常工作,再碰 125B 这个大块头。这一步能省掉大量排查时间。
3.2 获取模型权重并做格式转换
Strata 不能直接读取原始模型权重,需要把权重转换成它自己的组织格式。转换的核心有几个环节:
- 把权重从 FP16 量化到 INT4/INT8 混合精度,共享层用 8-bit,专家层用 4-bit;
- 把专家权重按"独立文件"的方式重新组织,让系统可以按需加载单个专家而不是整个模型;
- 生成权重索引文件,记录每个专家的位置、精度、大小,供推理时快速查询。
我是按官方脚本的默认参数执行的,转换 125B 模型大约花了一个多小时,主要时间是读取原始权重和写回新格式。磁盘空间记得预留两份权重的体积:原始一份、转换后一份,总共接近 150GB。
3.3 启动推理与验证
转换完成后就能加载模型了。启动命令不需要特别复杂,核心是指定权重目录、量化精度和专家驻留上限。大致这样:
strata serve --model-path /models/moe-125b \ --quantization mixed \ --max-resident-experts 8 \ --kv-cache cpu--max-resident-experts 8 的意思是显存里最多同时驻留 8 个专家,剩下都留在内存里。这个值是整个配置里最需要反复调的参数,后面专门讲。
启动完成后,先用一个极短的输入测试首 token 输出是否正常。我习惯用一个固定的测试句,比如"写一句关于秋天的短诗",然后观察模型是否完整输出、是否出现乱码或重复生成。首轮验证通过后,再逐步加长输入、加长生成长度,观察显存占用曲线是否平稳。
4. 关键参数调优:影响体验的四个旋钮
跑通只是第一步。真正让这套方案"好用",需要仔细调下面几个参数。
4.1 --max-resident-experts 专家驻留数量
这是影响性能和稳定性的头号参数。设得太小,显存里只留几个专家,大部分 token 都要从内存搬运,生成速度会暴跌到每秒几个 token,体验基本不可用。设得太大,显存被专家占满,留给共享层和 KV Cache 的空间就不够了,长上下文场景下容易 OOM。
我的调法是这样的:先用较小的值(比如 4)启动,观察路由命中率和显存剩余量,然后每次加 2,重复测试,直到显存占用接近 90% 但又不触发 OOM。在我的配置下,8 到 10 个专家是甜点区间。如果上下文长度经常超过 4096,就往下调到 6;如果只做短问答,可以往上调到 12。
4.2 批处理大小
单卡推理的批处理不宜设得太大。批处理越大,单次前向计算里被激活的专家种类越多,显存里需要同时驻留的专家也越多。Strata 的持续批处理模式下,建议从 batch 1 开始测试,逐步加到 4 或 8。我实测下来,batch 4 到 8 是吞吐和延迟的平衡点,再往上就会因为专家替换频繁而出现速度跳水。
4.3 量化精度与"救命"的混合量化
如果发现输出质量明显下降,先别急着关 4-bit,试试只把共享层提升到 8-bit。我的经验是,180B 以下规模的 MoE 模型在混合量化下,文本生成的流畅度损失其实很小,但数学和代码任务的正确率会掉几个百分点。如果你的任务对精度特别敏感,可以给这些任务单独开一个 8-bit 的配置,代价是内存占用翻倍,64GB 内存的机器就扛不住了。
4.4 温度等采样参数
这个很多人会忽略。MoE 模型经过 4-bit 量化后,概率分布会比原版模型更"平",采样时更容易出现发散。我实际使用把温度从默认的 0.8 降到 0.6,top-p 从 0.9 降到 0.85,输出稳定性会明显变好。这不是 Strata 的配置项,而是配合量化模型使用时很有效的调参技巧。
5. 踩坑实录:常见问题与排查技巧
这几个问题我基本都亲身遇到过,写出来给大家省点时间。
5.1 加载模型直接 OOM
问题往往出在内存,不是显存。125B 模型转成 4-bit 后内存需要 62.5GB,但转换过程本身还会产生临时缓冲区,64GB 内存的机器很容易在加载瞬间爆掉。解决方案就是上文说的,上 128GB 内存。如果暂时不升级,可以先用"流式加载"模式,让系统分页加载权重,但代价是冷启动时间会拖到几分钟级别。
5.2 首 token 延迟特别大
首 token 慢通常是因为冷启动时专家还没加载,所有第一次遇到的专家都要从内存搬进显存。我的经验是,首 token 延迟 2 到 5 秒是正常的。如果你觉得难以接受,可以加一个预热请求,让模型在正式对话前先调用一批典型专家,把常见的几条专家路径"热"起来。
5.3 生成速度忽快忽慢
这是专家替换的直接体现。当连续生成的 token 稳定命中显存里的专家时,速度可以到每秒 20 token 以上;一旦路由突然跳到不在显存里的专家,速度就会掉到每秒个位数。如果速度波动严重,先调大 --max-resident-experts,再看批处理大小是否设得太大。实在不行,可以限制上下文中跨度大的话题切换,让路由保持稳定。
5.4 输出重复或乱码
大概率是量化精度和采样参数共同造成的。我排查的顺序是:先降到温度 0.6,再看是否解决;不行就换回 8-bit 共享层配置;还不行就降低上下文长度,因为 KV Cache 卸载到内存后,长上下文的注意力计算精度也会受影响。这三个层次的排查基本能覆盖绝大多数"发疯"症状。
6. 单卡能跑 125B 之后,玩法完全变了
最后聊聊这套方案打开的空间,以及它到底适合谁。
6.1 本地私有化推理的价值
最直接的受益场景是私有化部署。以前想在本地跑 125B 级别模型,至少得准备一台多卡服务器,成本高、噪音大、散热麻烦。现在一台普通工作站就能跑,数据完全留在本地,不经过任何外部接口。对做内部知识库问答、敏感数据处理、离线环境验证这些场景来说,价值是实打实的。我自己就把原来放在服务端的 125B 实验模型迁到了本地工作站,日常做代码片段生成和文档摘要,响应体验完全够用。
6.2 个人研究和开发的新可能
对研究者和开发者来说,最宝贵的是"迭代闭环"的成本降下来了。以前改一个 MoE 的推理实验,要在服务器上排队、调试、等资源;现在本地就能跑,改完配置重启一下就能看到结果。这种快速试错的节奏,对做路由策略、量化方案、任务微调的研究帮助非常大。当然,它不是说完全替代服务器——如果你想同时跑多个实例、处理每秒几十个并发请求,单卡方案还是不够的。但"够得着"和"够不着"的区别,在有 Strata 之前和之后,是完全不同的。
6.3 仍需保留的冷静判断
说完了好的,也得说说不适合的场景。如果追求极致的生成质量,尤其是数学、代码这种对精度敏感的任务,量化后的 125B 模型未必比一个未量化的 30B 稠密模型强。如果追求高并发,单卡方案对比多卡服务器仍有数量级差距。另外,这个方案对硬件的"龃龉"程度高于常规推理框架,新手上来就碰 125B 很容易被 OOM 和各种调度问题劝退,建议先用 30B 到 70B 级别的模型把 Strata 的脾气摸透,再上大模型不迟。
我个人在实际使用中最大的体会是:技术方案的价值,很多时候不在于它"能跑什么",而在于它改变了"谁能跑什么"的边界。Strata 不是第一个做显存增量推理的框架,但它把 MoE 的稀疏特性、量化的精度取舍和操作系统的存储层次捏合成了一套完整的单卡方案。下一步我很期待看到它能支持更大规模的专家并行、更细粒度的 CPU 卸载策略,甚至把长上下文 KV Cache 的优化做得更激进。这些方向每推进一点,个人开发者能在大模型领域自由折腾的空间就大一点。