FreeToken 完全拆解:带宽自适应执行,让 8GB 笔记本跑 35B、单卡工作站跑 753B 的边缘 MoE 服务系统

10315 字
52 分钟
FreeToken 完全拆解:带宽自适应执行,让 8GB 笔记本跑 35B、单卡工作站跑 753B 的边缘 MoE 服务系统

AI 生成内容声明

背景:能力差距在缩小,“可运行差距”却在拉大#

开源大模型的参数发布只决定了”谁能拿到模型”,并不决定”谁跑得起它”。2026 年的前沿开源模型——Kimi-K3、GLM-5.2、DeepSeek-V4-Flash-0731——能力上已经逼近最强的闭源系统,但完整跑起来仍默认需要数据中心级的 GPU 集群。闭源 API 相对便宜,智能体(agent)类应用又在成倍推高推理需求,长期使用对个人用户和小团队来说依然是一笔沉重的开销。

与这种状况形成鲜明对比的是硬件存量:超过一亿台消费级设备已经带着独立 GPU,覆盖游戏台式机、工作站和高性能笔记本。Steam 平台报告月活用户超过 2 亿,其中约 72% 的受调查机器带有 NVIDIA 独立显卡。这些机器是一大池算力充足却严重闲置的资源。FreeToken 的出发点很朴素:缺口不在硬件本身,而在一套能把每台异构消费机器当作统一推理平台、自动把 GPU、CPU、内存和互连带宽映射到”它跑得动的最强模型配置”上的服务系统。

FreeToken 由加州大学伯克利分校(UC Berkeley)、德州大学奥斯汀分校(UT Austin)与 MIT 的研究者合作完成,作者包括 Shuo Yang、Ion Stoica、Matei Zaharia、Song Han、Kurt Keutzer、陈锋(Chenfeng Xu)等,论文《FreeToken: Efficient Edge-Native MoE Serving with Bandwidth-Adaptive Execution》于 2026 年 8 月 17 日发布在 arXiv(编号 2608.16157),代码以 Apache-2.0 协议开源在 GitHub(FlashML-org/FreeToken),并提供 Windows/Linux 一键安装的桌面应用。

为什么是 MoE:稀疏激活带来机会,完整专家池带来挑战#

混合专家(Mixture-of-Experts,MoE)架构为在个人设备上跑前沿模型打开了一条路。MoE 层的典型结构是:一个路由器(router)把每个 token 分配给 EE 个专家(expert)中的 kk 个(top-k 路由),只有被选中的专家参与计算。以 DeepSeek-V4-Flash 为例:它共 284B 参数,43 层中每层有 256 个路由专家,每个 token 只激活其中 6 个,因此单 token 实际参与的活跃参数只有约 13B——这个活跃参数规模放进 32GB 显存的 RTX 5090 毫无压力。

但 MoE 的稀疏性有个关键性质:稀疏只减少计算,不减少内存。token 每次只算 6 个专家,模型文件却必须完整保存全部 256 个专家。DeepSeek-V4-Flash 以 FP4 部署时,完整专家池约 140GB,远超任何消费级显卡的显存,必须把不活跃的专家放在主机内存(host memory)或二级存储里,按需进入计算路径。

于是 MoE 同时制造了机会与核心系统难题:稀疏激活让计算变得可行,完整专家池却让高效服务变得困难。FreeToken 要解决的就是后者——如何在”专家池远大于显存”的前提下,把消费级机器的整体性能榨出来。

下图是论文的概览图(图 1),展示 FreeToken 的定位:左侧是模型的价格-能力帕累托前沿,蓝色方块是 FreeToken 能在消费级硬件上交互式服务的模型(DeepSeek-V4-Flash 到 GLM-5.2 恰好就是这条前沿段);右侧是各硬件档位在真实智能体负载上的解码吞吐对比,虚线是生产环境中 Codex 的 33 tok/s 中位解码速度,× 表示该引擎在此配置下无法服务。

论文图 1:FreeToken 服务的模型落在价格-能力帕累托前沿上(左:API 价格 vs Code Arena Elo,蓝色方块标注可在消费级硬件上交互式服务的模型);右:真实智能体负载下各边缘引擎的解码吞吐,虚线为 Codex 生产环境的中位解码速度 33 tok/s
论文图 1:FreeToken 服务的模型落在价格-能力帕累托前沿上(左:API 价格 vs Code Arena Elo,蓝色方块标注可在消费级硬件上交互式服务的模型);右:真实智能体负载下各边缘引擎的解码吞吐,虚线为 Codex 生产环境的中位解码速度 33 tok/s

三个挑战:为什么现有边缘引擎远达不到硬件上限#

论文把现有边缘推理引擎(llama.cpp、KTransformers、Ollama、MoE-Infinity)的短板归结为三个维度,分别对应 prefill(预填充)与 decode(解码)两个阶段,以及贯穿两者的资源管理问题。

挑战一:Prefill 摧毁稀疏性——专家传输与重复计算#

第一重成本来自专家传输。解码时每个 token 只路由到 kk 个专家,但 prefill 一次要处理成千上万个 token,这些 token 的路由并集几乎覆盖每一层的全部专家。一次 prefill 相当于把整个专家池流过 CPU-GPU 互连,这是显存驻留部署完全不会有的 I/O 开销。

以 FP4 部署的 DeepSeek-V4-Flash 为例:约 140GB 专家权重需要传输。在 RTX 5090 机器上(PCIe 5.0 ×16,实测约 60GB/s)需要约 2 秒;在 RTX 4090/3090 这类 PCIe 4.0 ×16 桌面机上(约 25GB/s)需要约 5 秒;笔记本常见的 ×8 链路则要 10 秒以上。如果引擎按需(on-demand)抓取专家,整个传输窗口 GPU 都是空闲的——这段时间全部暴露为延迟。

第二重成本来自重复计算。智能体的工具调用几乎每一轮都会修改上下文:删掉旧的工具输出、截断思考段(thinking segment)。这直接打击混合注意力(hybrid attention)架构——许多前沿模型在全注意力之外交织了滑动窗口注意力(sliding-window attention,如 DeepSeek-V4-Flash、GPT-OSS)或循环层(recurrent layer,如 Qwen3.6-35B-A3B 中的 gated DeltaNet、Kimi-K3 中的 Kimi Delta Attention)。循环层把整个过去上下文压缩进一个持续演化的状态(recurrent state),这个状态无法像 KV 缓存那样部分复用,只能整体保存或整体重算;因为单个状态占用的内存相当于数百个 token 的 KV 缓存,引擎只能保存少量检查点(checkpoint)。上下文一被编辑,编辑位置之后的所有检查点全部失效,只能回退到最后一个有效检查点,经常要重新 prefill 数千个 token。而消费级 GPU 的稠密算力有限——RTX 5090 的 BF16 稠密吞吐大约只有 H100 的五分之一、B200 的十分之一——每次冗余 re-prefill 都会占用 GPU 几十秒。

挑战二:Decode 的缓存缺失——静态放置、CPU 带宽与”最优分工因机而异”#

解码阶段每个 token 只激活稀疏的专家子集,但缓存缺失(cache miss)导致专家被反复加载、驱逐或在主机内存里执行。现有引擎缺乏处理这些缺失的原则性策略:

  • 静态专家放置错过大部分路由流量。 llama.cpp 在模型加载时就把 MoE 张量分配到各设备;KTransformers 把”热门”专家子集固定(pin)在 GPU 显存,其余在 CPU 上执行。但路由随每个 token、每个负载实时变化,prefill 时冻结的放置只能覆盖路由流量的一小部分,导致绝大多数专家计算落到 CPU 上,GPU 与 PCIe 链路反而闲着。
  • 消费级 CPU 的带宽扛不住全部解码。 小批次解码时专家执行是内存受限(memory-bound)的:每个 token 要把路由到的专家权重完整流过一遍。消费级平台的内存只有双通道:双通道 DDR4 峰值约 50GB/s,DDR5 约 80-90GB/s,而单张 RTX 4090/5090 从板载显存取数可达 1-1.8TB/s。这个带宽差决定了纯 CPU 专家路径的解码速度只有显存路径的零头,与核心数无关。
  • 正确的分工比例是硬件相关的。 缺失的专家可以经 PCIe 传上来在 GPU 算,也可以就地(in-place)在 CPU 上算。两者没有普适的优劣:只靠传输,主机内存能比链路搬得快的部分就浪费了;只靠 CPU,PCIe 链路闲着,还放弃了”填充缓存换来未来命中”的收益。RTX 4060 笔记本(LPDDR5)与 RTX 5090 桌面机(DDR5)处在主机-互连带宽平衡的两个极端,最优混合比例从规格表上读不出来,必须在实际运行的机器上定量测量。

挑战三:边缘资源没有什么是专用的#

数据中心里 GPU 和 CPU 整机专供推理负载;在笔记本和个人电脑上,LLM 服务只是众多并发应用之一。桌面合成器、浏览器、游戏随时可能划走数 GB 显存,因此服务引擎可用的显存预算在不同次启动之间不同,服务中途还可能收缩或增长。最优的预算划分也在移动:智能体会话跨轮次累积上下文,KV 缓存需求不断增长,而专家工作集基本固定——首轮选择的划分在几十轮之后就错了。显存总量及其在 KV 缓存与专家缓存之间的分配必须能在运行期调整,且不能重启引擎。

引擎启动本身也很慢且频繁发生。完整专家池要从磁盘读入并预热 GPU 才能服务第一个请求:DeepSeek-V4-Flash 的 140GB 池从 7GB/s 的 NVMe 读出就要约 20 秒。边缘用户”用到才开、不用就关”,换模型还要重启引擎,启动速度直接决定可用性。

FreeToken 设计总览:把个人机器当作统一的推理平台#

FreeToken 围绕一个两级专家内存层次(two-level expert-memory hierarchy)组织一切(下图,论文图 2):

  • CPU 端专家池(host-resident expert pool):完整保存所有路由专家的权重,是唯一事实来源(source of truth)。
  • GPU 端弹性专家缓存(elastic expert cache):由所有 MoE 层共享;每个槽位(slot)保存”评估某一个 层-专家 对(layer, expert)“所需的全部张量,因此驻留、查找、执行都基于逻辑标识 (layer,expert)(\text{layer}, \text{expert}),而不是张量分片。
  • 非专家权重(embedding、attention、norm 等)常驻 GPU,剩余显存全部弹性分配给 KV 缓存与专家缓存。

图上方的 prefill 路径:专家加载按全层粒度双缓冲(double buffering),层 l+1l+1 经 PCIe 流式传输的同时 GPU 计算层 ll;循环状态检查点锚定在特殊 token 边界上,上下文被编辑时从最近的存活锚点恢复,只重新 prefill 新增后缀。下方的 decode 路径:大多数被路由的专家命中共享 LRU(least recently used,最近最少使用)专家缓存(图中 12 个中的 8 个,体现时间局部性);m=4m=4 个缺失专家按 q=mBP/BHq^{\star}=m\cdot B_P/B_H 在”经 PCIe 填充缓存”(1 个)与”在 CPU 上就地执行”(3 个)之间划分,比例由该机器实测的两个带宽决定;GPU 与 CPU 的部分输出精确合并。整个过程中主机端专家池始终是唯一事实来源。

论文图 2:FreeToken 系统总览。Prefill:全层双缓冲,层 l+1 经 PCIe 传输与层 l 的 GPU 计算重叠;循环状态检查点锚定在特殊 token 边界。Decode:多数路由专家命中共享 LRU 缓存(图中 12 个中 8 个),m=4 个缺失按 q*=m·B_P/B_H 划分为 1 个 PCIe 缓存填充与 3 个 CPU 就地执行,GPU 与 CPU 部分输出精确合并
论文图 2:FreeToken 系统总览。Prefill:全层双缓冲,层 l+1 经 PCIe 传输与层 l 的 GPU 计算重叠;循环状态检查点锚定在特殊 token 边界。Decode:多数路由专家命中共享 LRU 缓存(图中 12 个中 8 个),m=4 个缺失按 q*=m·B_P/B_H 划分为 1 个 PCIe 缓存填充与 3 个 CPU 就地执行,GPU 与 CPU 部分输出精确合并

三个核心机制对应论文的三个设计原则:

  1. 带宽自适应执行(bandwidth-adaptive execution)——把边缘稀缺的带宽从固定瓶颈变成运行时的调度信号;
  2. 语义感知缓存(semantic-aware caching)——决定稀缺内存里该留什么:prefill 阶段在语义边界保存可跨编辑复用的状态,decode 阶段用跟随路由器的全局 LRU 专家缓存;
  3. 弹性边缘资源管理(elastic edge resource management)——在调度安全点动态调整显存预算与缓存结构,不重启引擎。

下面逐机制拆解。

Prefill 协同设计:流水线加载与语义感知状态缓存#

prefill 的两项成本——海量专家传输与冗余重复计算——分别由全层双缓冲和语义感知状态缓存来消除。

全层双缓冲:让专家搬运消失在计算背后#

既然 prefill 会激活每层几乎全部专家(论文 2.1 节),FreeToken 就不按需抓取 prefill 专家,而是从全局槽位池中分配两个全层缓冲区(full-layer buffer)。GPU 从其中一个缓冲区计算层 ll 的被路由专家时,一条专用传输流(transfer stream)同时把层 l+1l+1 的完整专家集加载进另一个缓冲区。关键设计点:

  • 传输可以在路由已知之前开始。 因为加载的是”整层”,不需要等待该层路由结果,权重搬运全程在后台连续进行,而不是在层与层之间串行。
  • 两个缓冲区与 decode 缓存共享同一个槽位池。 没有单独的 prefill 缓存,也没有阶段交接(phase handoff);prefill 期间存活的条目直接为延迟敏感的 decode 阶段”播种”。当槽位池腾不出两个整层的空间时,FreeToken 回退到按需 prefill 加载,而不是超订(oversubscribe)显存。

实测效果(论文图 4a,RTX 5090 + Qwen3.6-35B,BF16):开启重叠后,每个 8192-token 的 prefill 块在 1.19-1.22 秒内完成——这正是把 64.4GB 专家池以 52.7GB/s 流一遍的时间,即 PCIe 5.0 ×16 链路的实际上限。也就是说专家计算被完全隐藏在传输后面,prefill 变成纯传输受限,16k token 的 prefill 吞吐达到 6.7k tok/s。关闭第二个缓冲区后传输与计算串行,吞吐损失随提示词长度增长:4k token 损失 19%,8k 损失 25%,16k 损失 26%——提示词越长,被隐藏的计算占比越高,损失越大。

语义锚点:让循环状态跨越智能体的上下文编辑#

混合注意力模型在 KV 缓存之外增加了第二种前缀资源。全注意力层的 KV 由 radix 前缀树(prefix tree)管理(沿用 SGLang 等系统的成熟做法,可部分复用);但循环层把整个前缀压缩进一个持续演化的状态,无法部分复用,其前缀复用只能依赖 prefill/decode 期间保存的状态检查点。检查点很贵(每个状态的体积相当于数百个 token 的 KV 缓存),只能保留少数几个,因此检查点放在哪,直接决定它们值不值钱

FreeToken 把预算花在语义锚点(semantic anchor)上:标记思考段、工具调用、工具输出、对话轮次的特殊 token(special token)边界。这些位置恰好是智能体框架修改与截断上下文的地方:

  • OpenClaw 会裁剪除最新一轮外所有 assistant 轮的思考块;
  • OpenCode 的 compaction 机制把超过近期窗口的工具输出替换为固定占位符;
  • SWE-agent 只保留最后 nn 条观察(observation)。

三种情况下,编辑都是替换或删除由特殊 token 标记的整块内容,而编辑点之前的精确前缀被保留。因此锚定在语义边界的检查点比任意位置上的检查点存活率高得多:上下文被编辑后,从”编辑后仍存活的最深检查点”恢复——全注意力层复用截至编辑点的 KV 缓存,循环层从锚点状态继续——真正新增的后缀才需要重新 prefill。检查点槽位用 LRU 独立于 KV 池回收。

Decode 协同设计:语义感知专家缓存与 q* 策略#

解码每个 MoE 层:路由器与缓存查找都在 GPU 上完成,识别出已经驻留缓存、可直接在 GPU 上执行的活跃专家集合 H\mathcal{H};剩下的挑战是如何服务 mm 个唯一缺失专家集合 M\mathcal{M}

语义感知专家缓存:跟随路由器走,而不是固定放置#

解码时的路由表现出强时间局部性:连续步长上同一 MoE 层反复路由到重叠或近期使用过的专家,这种路由一致性(routing consistency)已在多个模型家族上被测量验证。FreeToken 把这一性质转化为显存驻留:维护一个所有 MoE 层共享的 LRU 驻留空间,内容持续跟随路由器选择的专家——命中刷新该专家的新旧度,填充准入新选中的专家,驱逐最久未被模型需要的专家。稀缺的显存因此持续追踪生成的当前工作集(working set),而不是加载时冻结的、与负载无关的放置。

论文图 4b 在相同缓存容量下重放四类负载的真实路由轨迹,对比三种放置策略的解码期专家缺失率:在 RTX 5090 的服务容量下(Qwen3.6 专家池的 37%、DSV4-Flash 的 11%),FreeToken 的全局 LRU 分别缺失 16% 与 39% 的解码期专家读取,而 KTransformers 的 prefill 更新式放置为 41% 与 59%,llama.cpp 的忽略路由的静态切分为 62% 与 89%。在未达到全池容量的任何容量点上,排序都成立。

q* 策略:用实测带宽把缓存缺失分给 PCIe 与 CPU#

缓存无法消除全部缺失:冷启动、工作集突变、容量不足都会让部分被选中的专家不在 GPU 上。带宽自适应执行负责服务这些残余缺失,决定哪些专家补进缓存、哪些在 CPU 上就地执行。

核心观察: DMA 传输与 CPU 专家执行读取的是同一个主机内存子系统。当 PCIe 传输饱和时,剩余给并发 CPU 执行的残差带宽(residual bandwidth)为:

BR=max(BHBP, 0)B_R = \max(B_H - B_P,\ 0)

其中 BPB_P 是实测的固定(pinned)内存专家传输带宽(PCIe 侧),BHB_H 是实测的主机侧专家处理带宽(CPU 侧)。BPB_PBHB_H 都取部署机器上的实测值,而非规格表数值。当 BH<BPB_H < B_P(主机内存比链路还慢,如部分 PCIe 5.0 桌面机),残差为 0,全部缺失都该走传输。

mm 个缺失专家划分为缓存填充集 F\mathcal{F} 与 CPU 执行集 C\mathcal{C}q=Fq=|\mathcal{F}|

M=F ˙ C,q=F\mathcal{M} = \mathcal{F}\ \dot{\cup}\ \mathcal{C}, \qquad q = |\mathcal{F}|

F\mathcal{F} 中的专家传入缓存槽位、在 GPU 上执行并驻留供未来复用;C\mathcal{C} 中的专家直接从 CPU 端专家池执行、不改变驻留状态。两个集合并发服务:缓存填充以完整 PCIe 速率进行,CPU 只消耗被饱和链路剩下来的主机带宽——把残差带宽转化为当前 token 的进度,而不打断缓存更新。

两条并发分支的执行时间近似为:

Tfill(q)qSBP,Tcpu(mq)(mq)SBHBPT_{\text{fill}}(q) \approx \frac{qS}{B_P}, \qquad T_{\text{cpu}}(m-q) \approx \frac{(m-q)S}{B_H - B_P}

其中 SS 是单个完整专家的大小(字节)。第一式:qq 个专家各自以 BPB_P 的速率过 PCIe;第二式:mqm-q 个专家在残差带宽 BHBPB_H - B_P 上执行——分母之所以是差值而非 BHB_H,正是因为 PCIe 传输饱和时 CPU 只能拿到剩下的那部分。让两条并发分支时间相等(层延迟取两者较慢者,恰好就是该平衡的量):

qmqBPBHBPqmBPBH\frac{q}{m-q} \approx \frac{B_P}{B_H - B_P} \qquad\Longrightarrow\qquad q^{\star} \approx m\,\frac{B_P}{B_H}

推导过程:qS/BP=(mq)S/(BHBP)qS/B_P = (m-q)S/(B_H-B_P),两边消去 SSq(BHBP)=(mq)BPq(B_H-B_P)=(m-q)B_P,展开 qBH=mBPqB_H = mB_P,即 q=mBP/BHq^{\star}=m\,B_P/B_H直觉:缺失专家按两条路径的带宽比例分配。 PCIe 相对主机内存越快,越多的缺失走填充;反之越多留在 CPU 就地执行。这个闭式解同时覆盖了所有硬件平衡:当 BHB_H 逼近 BPB_Pqq^{\star} 逼近缺失总数 mm,系统退化为纯按需缓存填充,不需要单独的执行分支或策略——一个公式覆盖全部硬件形态。

实践中 FreeToken 把 qq^{\star} 取整,具体的 F\mathcal{F} 选择交给缓存替换策略,并始终至少保留一个填充,这样即使 CPU 处理了大部分缺失,缓存也持续在热身(warming)。带宽参数在部署时用工具实测(ft bench bw)。计算上,CPU 与 GPU 各自算出部分和(partial sum)后精确合并——不修改路由器、不替换专家、不放松精度,MoE 输出逐位(bit-exact)保真。

执行顺序与工程细节#

单层执行顺序:先启动 CPU 分支;随后 GPU miss 路径执行三步——缓存更新、F\mathcal{F} 的批量拷贝、以及合并执行集 G=HF\mathcal{G} = \mathcal{H} \cup \mathcal{F} 的分组评估;CPU worker 并发处理 C\mathcal{C}。暴露的层延迟是两条并发分支中较慢的那个,正是上面公式平衡的量。

以论文图 2 的例子核算:m=4m=4,取 4060 笔记本的实测带宽 BP:BH=11.8:47.5B_P:B_H = 11.8:47.5q=4×11.8/47.50.99q^{\star} = 4 \times 11.8/47.5 \approx 0.99,取整为 1——1 个缺失走 PCIe 填充,3 个在 CPU 就地执行,与图注一致。若换到 RTX 5090 服务器(52.7:77.3),同样 m=4m=4q2.7q^{\star} \approx 2.7,约 3 个填充、1 个 CPU 执行——主机内存与链路带宽越接近,越倾向让 GPU 全包。这也是”正确分工因机而异”的直接体现。

这里有一个必须强调的工程难点:这个逐层控制流包含缺失检测、集合定容、受害槽选择与 CPU 分支本身,全部要装进一次静态捕获的 CUDA Graph 里(否则每层一次主机同步会让延迟优势荡然无存)。这是论文 4.1 节的主题,下文”实现细节”部分展开。

弹性内存管理:显存预算随时可调,启动秒级完成#

数据中心的资源是专用的,边缘不是。FreeToken 用两个机制吸收显存波动,两者都建立在同一个性质上:因为主机端专家池是唯一事实来源,GPU 显存只影响性能,从不影响正确性。

  • 运行时缓存重构(runtime cache reconfiguration)。 非专家权重与运行时状态分配完毕后,剩余显存预算在 KV 缓存页与完整专家槽位之间划分。这个划分不在启动时固定:任意调度安全点(scheduler safe point)上,FreeToken 都能按修订后的显存预算重建 GPU 专家缓存——不重启引擎、不重载主机端专家池,并为新缓存配置动态重建捕获好的执行路径。
  • 快速引擎启动(fast engine bootstrap)。 启动时间由两部分构成:从磁盘把专家池读进主机内存(过去)与预热 GPU(传统做法)。FreeToken 压缩前者、消灭后者。加载时专家权重直接从磁盘读入最终的主机布局,之后才 pin 内存——先 pin 空缓冲区会 fault-in 并清零数 GB 页面,只为随后覆盖它们;先填充后 pin 则完全避免。预热 GPU 则构造上就不需要:第一个请求用冷缓存服务,其缺失走 3.2 节的普通解码路径,缓存通过正常服务过程自然升温。

实现细节:把动态缓存装进静态 CUDA Graph#

FreeToken 的 serving 底座沿用 vLLM、SGLang 的 GPU 中心架构——分页 KV 缓存管理、radix 前缀复用,加上 FlashInfer 与 Flash Linear Attention 等社区 kernel 库。在此之上,两层实现把 3 节的设计落地:graph 兼容的专家缓存(4.1 节)与其下的存储与平台机制(4.2 节)。

Device-side 缓存控制:单个 kernel 完成去重、分类、选 victim#

专家缓存的本质是动态的:每步缺失的专家、抓取的数量、驱逐的槽位都在变。如果由主机控制缓存,每个 MoE 层都要引入一次昂贵的设备同步。FreeToken 把所有依赖路由的控制严格留在 GPU 上,把动态控制表示为静态捕获 graph 内部的数据:固定形状的工作缓冲区(work buffer)与设备端驻留的有效计数(valid count)。

每个 MoE 层用一个 GPU kernel 完成:对路由专家去重 → 对照驻留表分类(命中/缺失)→ 按带宽比例推导抓取数 qq → 选择驱逐受害槽 → 把逻辑路由 ID 重写为物理槽位 ID 或”CPU 执行”的特殊标志。

受害槽选择绕开经典 LRU 陷阱(每驱逐一个槽位就全缓存扫描一遍):单遍 kernel 一次性找出 KK 个最久未用的候选槽位,miss 路径只需消费其中前 qKq \le K 个——无论实际缺失多少,受害发现永远只花一遍扫描。由此得到的拷贝工作列表驱动一次融合传输(fused transfer):因为每个专家 bank 共享同一套逻辑 专家→槽位 映射(见 4.2 节),一份设备端源/目的索引列表就能以一次固定形状 launch 应用到所有 bank,未使用的工件由有效计数屏蔽。这个设计换来的是少量 kernel launch、高 PCIe 利用率,以及主机端零路由相关决策。

Graph 内的 CPU 执行分支#

带宽自适应执行的 CPU 分支同样被捕获进同一张 graph。对每个受支持的 decode batch 尺寸,FreeToken 准备稳定的 pinned I/O 缓冲区与持久任务描述符(persistent task descriptor);设备到主机拷贝、host-function 提交节点、并发 GPU 路径、同步节点、主机到设备结果拷贝全部一起捕获。这样 graph 回放(replay)就能重放完整的异构执行步,无需逐 token 的 Python 调度。worker 本身是一个 pin 在物理核心上的常驻 C++ 线程池,kernel 使用架构相关的 SIMD 指令与 kernel 内反量化(in-kernel dequantization)消费专家权重,使该路径保持带宽受限;最后返回经门控加权(gate-weighted)的逐 token 部分输出。

FTW 权重格式与平台适配#

FreeToken 把各模型的 checkpoint 布局规范化为一小组专家 bank(expert bank)。每个 bank 以扁平化标识 lE+elE+e(层号 × 每层专家数 + 专家号)作为首维;所有 bank 中同一标识的行共同构成一个完整专家。于是 GPU kernel 与 CPU 执行器共享同一个逻辑专家身份,与底层物理格式无关。

加载快的关键是 FTW(FreeToken Weight)格式:提前把专家权重按运行期 bank 布局合并存储。引擎启动时跳过张量发现(tensor discovery)与重打包(repacking),用并行直接 I/O(direct I/O)把对齐块直接读进精确尺寸的主机 bank,填充完成后再 pin。

平台适配方面:加载时按专家表示、GPU 架构与 CUDA 环境选择 GPU kernel;CPU 执行器按可用 SIMD 实现与物理核布局分派。若完整专家池无法 pin 或注册 DMA(某些操作系统与驱动配置下的限制),FreeToken 回退到纯 CPU MoE 后端:专家权重留在可分页主机存储,所有被路由专家在 CPU 执行;非专家层仍在 GPU,只有激活尺寸的输入、路由元数据与聚合输出跨过 CPU-GPU 边界。该路径以峰值传输带宽换取在无法建立快速路径的平台上的可部署性。

评估:四类智能体负载、六台机器、四个引擎#

实验设置#

硬件(论文表 1,带宽均为在部署张量形状上的实测值):

系统GPU(显存)PCIeBPB_P (GB/s)CPU(线程)DRAM (GiB)BHB_H (GB/s)
5090 服务器RTX 5090 (32GB)5.0 ×1652.72×Xeon Gold 6459C (32)DDR5 18077.3
4090 服务器RTX 4090 (24GB)4.0 ×1625.12×Xeon Platinum 8358P (32)DDR4 24063.2
3090 服务器RTX 3090 (24GB)4.0 ×1625.32×Xeon Gold 6330 (28)DDR4 18056.7
5090 桌面机RTX 5090 (32GB)5.0 ×1649.0Ryzen 9 9950X3D (32)DDR5 19253.8
4060 笔记本RTX 4060 Laptop (8GB)4.0 ×811.8Core i9-13900H (20)LPDDR5 3247.5
PRO 6000RTX PRO 6000 (96GB)5.0 ×1651.5Xeon Platinum 8559C (48)DDR5 512178

前三台是租来的双路服务器,CPU 远超任何边缘主机,因此每次服务运行与带宽测量都被限制在 6 个 CPU 线程并 pin 到 GPU 的 NUMA 节点上——限流后它们的主机带宽为 56.7-77.3GB/s,与真实边缘机器自然满线程的水平相当(桌面机 16 核 53.8GB/s、笔记本 14 核 47.5GB/s);桌面机与笔记本不设限,用于验证这种模拟在真实边缘硬件上成立。

模型:DeepSeek-V4-Flash(284B 参数、13B 活跃,官方 checkpoint 原生 MXFP4 量化);Qwen3.6-35B-A3B(BF16,与各引擎精度完全对齐;8GB 笔记本改用官方 NVFP4 版本);跨硬件研究追加 GLM-5.2(753B 参数、40B 活跃,NVFP4 路由专家,433GB checkpoint,在 RTX PRO 6000 上作为前沿档演示)。

负载:四个真实智能体场景。W1 数学推理(AIME 竞赛题,长思维链解码,无工具调用,单轮、解码主导);W2 编码智能体(OpenCode 框架 + SWE-bench 仓库 issue,三次脚本化用户轮次内执行真实工具);W3 编码智能体原生协议(同一 issue 经 Claude Code 的 Anthropic 兼容端点驱动,会并发请求子代理,会话增长到 56-65k token);W4 邮件/日历智能体(OpenClaw 默认配置下 13 个固定用户轮次,约 24.5k token 的系统上下文底)。所有引擎以相同请求服务相同 harness;编码运行必须产出参考黄金补丁,W4 必须完成全部 13 轮。

基线:llama.cpp、Ollama、KTransformers、MoE-Infinity(在其支持的配置上)。权重格式严格对齐:每个引擎都以 BF16 服务 Qwen3.6,每个引擎都逐位(bit-exactly)消费 DSV4-Flash 的原生 MXFP4 专家块。指标为每请求平均解码吞吐(tok/s)与平均 TTFT(time to first token,首 token 时延);由于各引擎的智能体轨迹会发散,不比较跨引擎的墙钟总时长。

主结果:RTX 5090 上的端到端对比#

下图是论文图 3:RTX 5090 上四个负载 × 两个模型的端到端结果,上排解码吞吐、下排平均 TTFT(对数刻度),× 表示该引擎无法服务该配置。

论文图 3:RTX 5090 上的端到端服务结果。上排为解码吞吐(Qwen3.6-35B-A3B BF16 与 DeepSeek-V4-Flash MXFP4 在四个负载上的 tok/s),下排为平均 TTFT(对数刻度);× 表示该引擎无法服务该配置
论文图 3:RTX 5090 上的端到端服务结果。上排为解码吞吐(Qwen3.6-35B-A3B BF16 与 DeepSeek-V4-Flash MXFP4 在四个负载上的 tok/s),下排为平均 TTFT(对数刻度);× 表示该引擎无法服务该配置

解码吞吐:FreeToken 在 Qwen3.6 上维持 77-83 tok/s,在 DSV4-Flash 上维持 22-25 tok/s,分别是各负载最强基线的 1.8-2.3 倍与 1.5-1.9 倍。更关键的是智能体负载下的稳定性:三个智能体负载下解码速率仍保持在单轮 W1 值的 12% 以内,而上下文最敏感的基线——DSV4-Flash 上的 KTransformers——到 W2 时已经损失了单轮速率的 31%。单流基准因此系统性高估了基线的智能体表现。MoE-Infinity 只能服务 W1(8.8 tok/s):其逐专家 prefill 暂存上限中止了长提示词负载,自带的服务器在请求间不保留 KV 缓存。

TTFT:六个多轮单元格中 FreeToken 在五个取得最低平均 TTFT(Qwen3.6 × W3 一格 favor KTransformers 的 GPU-prefill 分支;W1 的短孤立提示词则 favor llama.cpp)。尾部时延比均值拉开得更狠:FreeToken 在每个单元格的最差轮次都低于 44 秒,而每个基线都在某处超过 150 秒——llama.cpp 232 秒、Ollama 179 秒、KTransformers 946 秒。这些停滞已经越过真实智能体客户端的放弃阈值:OpenClaw 自带 120 秒空闲看门狗,Claude Code 的默认请求超时约十分钟。尾部 TTFT 因此是可服务性边界(availability boundary),不只是延迟统计量

机制分解:双缓冲、专家局部性、跨硬件普适性#

下图是论文图 4:左图为 prefill 吞吐随提示词长度的变化(开/关流水线加载),右图为解码期专家缺失率随缓存容量的变化(三种放置策略、相同路由轨迹重放)。

论文图 4:(a) prefill 吞吐 vs 提示词长度(RTX 5090,Qwen3.6-35B BF16),开/关 FreeToken 的流水线全层加载对比;(b) 解码期专家缺失率 vs 缓存容量(占专家池百分比),三种引擎放置策略在相同路由轨迹上重放,实线为 W1-W4 均值,带状为最小-最大范围
论文图 4:(a) prefill 吞吐 vs 提示词长度(RTX 5090,Qwen3.6-35B BF16),开/关 FreeToken 的流水线全层加载对比;(b) 解码期专家缺失率 vs 缓存容量(占专家池百分比),三种引擎放置策略在相同路由轨迹上重放,实线为 W1-W4 均值,带状为最小-最大范围

流水线 prefill 使 prefill 变为传输受限:开启重叠后每个 8192-token 块 1.19-1.22 秒完成,等于 64.4GB 专家池以 52.7GB/s 流过一遍的时间——PCIe 5.0 ×16 的实际上限;16k token 时吞吐 6.7k tok/s。关闭第二缓冲区则传输与计算串行,吞吐损失 19%(4k)、25%(8k)、26%(16k),随提示词变长而增大。

专家局部性:等容量下全局 LRU 缺失 16%(Qwen3.6 的 37% 容量)与 39%(DSV4-Flash 的 11% 容量),对比 KTransformers 的 41%/59% 与 llama.cpp 的 62%/89%。

跨硬件普适性(论文图 5,SWE issue + OpenCode 负载,Qwen3.6-35B-A3B):FreeToken 相对最强基线的提升为 RTX 3090 与 4090 上 1.3 倍、5090 服务器上 1.9 倍、5090 桌面机上 2.1 倍、4060 笔记本上 1.8 倍——后者以 NVFP4 在 8GB、PCIe ×8 的机器上维持 39.3 tok/s,达到 RTX 4090 速率的 92%。两个 5090 列共享同一 GPU 硅片、只差主机:从多通道服务器换到双通道消费桌面,FreeToken 只损失 4% 解码速率,而 llama.cpp 因 CPU 驻留专家在两个 DDR5 通道上挨饿而只保住 80%——主机内存带宽越弱,带宽自适应的价值越大

论文图 5:编码智能体负载下各消费级 GPU 的解码吞吐(Qwen3.6-35B-A3B;4060 笔记本为 NVFP4,其余为 BF16;RTX PRO 6000 列为单独演示:GLM-5.2 753B-A40B NVFP4 在数学负载上)。× 表示该引擎无法服务该配置
论文图 5:编码智能体负载下各消费级 GPU 的解码吞吐(Qwen3.6-35B-A3B;4060 笔记本为 NVFP4,其余为 BF16;RTX PRO 6000 列为单独演示:GLM-5.2 753B-A40B NVFP4 在数学负载上)。× 表示该引擎无法服务该配置

前沿档演示:单张 RTX PRO 6000 上,FreeToken 以 14.9 tok/s 服务 753B 的 GLM-5.2,llama.cpp 为 7.3 tok/s(2.0 倍),专家权重逐位相同,平均 TTFT 相当(7.5 秒 vs 7.8 秒)。KTransformers 在这台机器上根本没有可服务的路径:其 GLM-5.2 方案需要 753GB-1.5TB 主机驻留专家,而机器只有 512GiB 主机内存;其 CPU kernel 也不读 GLM-5.2 的 NVFP4 布局。

与已有工作的关系:FreeToken 站在哪#

论文把相关系统按三条线梳理,FreeToken 的定位也随之清晰:

专家卸载与缓存(expert offloading and caching):EdgeMoE 确立了”完整专家池在主机/磁盘、子集缓存上 GPU”的架构;Mixtral-offloading 组合 LRU 专家缓存与投机预取;MoE-Infinity 追踪请求级激活模式指导预取;ProMoE、ExpertFlow、FineMoE 则打磨预测未来路由的预测器。这条线的共同局限是:无论 miss 预测得多准,miss 最终都只能变成一次 PCIe 传输,解码延迟始终被链路封顶,而主机算力闲在那里。 另一条支线用放宽保真度换传输量:HOBBIT 抓取降精度副本,SiDA 与 SMoE 替换或跳过低分专家(以准确率换带宽),Pre-gated MoE 直接重构并微调路由器。FreeToken 与它们不同:保持路由计算精确、模型不改动,改变的是”残余 miss 如何被服务”而非”miss 预测得多准”。

混合 CPU-GPU 执行(hybrid CPU-GPU execution):稠密模型侧,FlexGen 与 DeepSpeed-Inference 按层粒度流式权重,PowerInfer 按激活统计切分神经元(依赖 ReLU 类稀疏性与学习式预测器),llama.cpp/Ollama 在加载时静态分配整层。MoE 侧,Fiddler 最早把 miss 当作”可在 CPU 上执行的工作”而非”只能搬运的数据”;KTransformers 用 AMX 优化 kernel 让 CPU 就地执行变快;HybriMoE 用逐步调度模拟重平衡 CPU/GPU 队列;SMoE 用贪心双指针启发式平衡加载与 CPU 时间。这条线的共同问题是分工要么启动时固定(KTransformers 即使 PCIe 空闲、缓存有容量也把路由专家压在 CPU 上),要么由主机侧启发式逐层重算——其调度开销与逐层同步无法被捕获进 CUDA Graph;llama.cpp 的混合模式同样无法维持 graph 执行。而且这些系统都围绕单轮、短提示词、常为未量化权重设计与评估,没有提供多轮智能体会话在每个工具调用轮次 re-prefill 时需要的跨请求前缀复用。FreeToken 用两个实测带宽的闭式比推导分工(便宜到可以驻留在设备端、装进捕获的 graph),并嵌入 serving runtime 而非单请求 harness。

服务基础设施与层级内存(serving infrastructure and hierarchical memory):FreeToken 构建在 vLLM/SGLang 的 GPU 中心 substrate 与 FlashInfer 之上(后者的注意力调度为”CUDA Graph 捕获内的动态行为”开了先例)。内存管理侧,SGLang HiCache 把 KV 缓存分 GPU/主机/远端存储三层以保留长多轮会话的前缀复用;WiSP 按边际延迟价值在专家权重与 KV 缓存间切分显存;eLLM 运行期再平衡弹性内存池;FluxMoE 以专家分页换 KV 容量。这些管理器搬动的都是被动字节:页面或专家缺席时只能去取,WiSP 自己的分析也承认无论预测多准单流解码都被 PCIe 封顶——这是纯分配方案抬不动的天花板。专家权重多出一个自由度:缺失的专家也可以”在它所在的地方算”。FreeToken 把两个杠杆合起来:对专家池应用层级内存哲学(弹性全专家缓存、prefill/decode 统一驻留),并在同一 serving substrate 上叠加带宽自适应的 CPU 协同执行。其贡献是一个集成的 runtime 与一个用实测带宽协调缓存、传输、CPU 执行的模型。

局限:自报数据、内存前提与”单卡”的含义#

一篇系统论文值得读透,也值得带着问题读:

  • 数据来源:论文的主结果(除图 4b 的重放分析外)为作者自报,截至 2026 年 8 月尚未看到独立第三方复现(MarkTechPost 的报道也明确点出 16 项声明中有 9 项属于自报)。吞吐数字的工程复现依赖 freetoken 包与论文一致的机器配置。
  • “单卡跑 753B”的前提:RTX PRO 6000 是 96GB 的工作站卡,且主机要配 512GiB DDR5;跑 DeepSeek-V4-Flash 的 5090 配置同样需要 192GB 量级的主机内存。140-433GB 的专家池不是凭空消失,而是从显存搬进了主机内存。对个人用户来说,“8GB 笔记本跑 35B”(32GB 主机内存即可)是最贴近现实的场景。
  • 精度口径:Qwen3.6 各引擎统一 BF16,但 DSV4-Flash 是 MXFP4、4060 笔记本是 NVFP4、GLM-5.2 是 NVFP4——跨模型对比吞吐时,精度差异被带进了数字里;论文按”逐位相同的专家权重”对齐了引擎间口径,这是合理的做法,但解读跨模型数字时要留意。
  • 负载覆盖:四个负载都是智能体场景(数学、编码、邮件/日历),没有覆盖流式生成、批处理服务等传统离线场景;跨引擎墙钟总时长被有意不比较。
  • 消费级 CPU 的现实:论文通过限流线程模拟了边缘主机的带宽,但真实边缘机器上 CPU 还要与浏览器、IDE 争抢;好在 FreeToken 的 CPU 分支设计上就只消耗残差带宽,且弹性内存机制允许显存被其他应用占用时降级运行。

小结#

FreeToken 的全部设计可以压缩成一句话:一旦稀疏激活让计算可行,本地推理就不再是”模型能不能塞进 GPU”的问题,而是”系统能否把整台机器编排好”的问题。 它把 GPU、CPU、主机内存与互连当作一个统一推理平台:prefill 用全层双缓冲把专家搬运藏进计算,用语义锚点检查点让循环状态跨过智能体的上下文编辑;decode 用跟随路由器的全局 LRU 专家缓存吃掉时间局部性,用 q=mBP/BHq^{\star}=m\,B_P/B_H 的实测带宽比例把残余缺失分给 PCIe 填充与 CPU 就地执行两条并发路径;底层用弹性显存管理吸收边缘资源的动态变化,用 CUDA Graph 兼容的设备端缓存控制消除每层同步。

对理解 MoE 推理系统而言,FreeToken 是一个很好的坐标点:往上看,它与 vLLM/SGLang 的分页 KV、前缀复用、CUDA Graph 捕获一脉相承;往横比,它把 KTransformers 的”CPU 也能算专家”、MoE-Infinity 的”专家池驻留主机”、WiSP 的”显存该给专家还是 KV”各自做了一半的事情补成了闭环;往下看,它的 FTW 格式与 bank 布局回答了”权重文件该怎么组织才能让加载和寻址最快”。对于正在学 CUDA 与推理系统的读者,文中”如何把动态缓存控制变成 graph 内的静态数据”(固定形状缓冲区 + 设备端有效计数)与”如何用两个实测带宽数推导一个闭式调度策略”是两个特别值得记住的工程范式。

参考资料#

  1. FreeToken: Efficient Edge-Native MoE Serving with Bandwidth-Adaptive Execution(arXiv 2608.16157)
  2. FlashML-org/FreeToken GitHub 仓库
  3. FreeToken 官网与桌面应用下载(flashml.ai)
  4. MarkTechPost:Meet FreeToken: An Edge-Native MoE Serving Engine that Runs 753B GLM-5.2 on a Single Workstation GPU
  5. 80aj:无需昂贵显卡,笔电4060也能流畅运行35B大模型,FreeToken打破显存瓶颈
  6. MoE-Infinity: Activation-Aware Expert Offloading for Efficient MoE Serving(arXiv 2401.14361)
  7. KTransformers: Unleashing the Full Potential of CPU/GPU Hybrid Inference for MoE Models(GitHub)
  8. Efficient Memory Management for Large Language Model Serving with PagedAttention / vLLM(arXiv 2309.06180)
  9. SGLang: Efficient Execution of Structured Language Model Programs(arXiv 2312.07104)
  10. FlashInfer: Efficient and Customizable Attention Engine for LLM Inference Serving(arXiv 2501.01005)
  11. Fiddler: CPU-GPU Orchestration for Fast Inference of Mixture-of-Experts Models(arXiv 2402.07033)
  12. PowerInfer: Fast Large Language Model Serving with a Consumer-grade GPU(arXiv 2312.12456)
  13. EdgeMoE: Fast On-Device Inference of MoE-based Large Language Models(arXiv 2308.14352)
  14. Fast Inference of Mixture-of-Experts Language Models with Offloading / Mixtral-offloading(arXiv 2312.17238)
  15. Gated Delta Networks: Improving Mamba2 with Delta Rule(arXiv 2412.06464)
  16. DeepSeek-V4-Flash-0731 模型 checkpoint(Hugging Face)
  17. SGLang HiCache: Fast Hierarchical KV Caching(LMSYS 博客)
  18. Local Routing Consistency of Mixture-of-Experts Language Models(arXiv 2505.16056)

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

FreeToken 完全拆解:带宽自适应执行,让 8GB 笔记本跑 35B、单卡工作站跑 753B 的边缘 MoE 服务系统
https://pinghaoyang.com.cn/aigc/posts/freetoken/
作者
平昊阳
发布于
2026-08-24
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
平昊阳
乘长风,破巨浪, 展鸿图于未央!
--
总访问量
--
访客数
公告
欢迎来到我的个人博客!欢迎关注交流吖!
更多相关公告,见
社交-留言」。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
站点统计
文章
66
分类
16
标签
93
总字数
477,284
运行时长
0
最后活动
0 天前

文章目录