8 月 21 日,蚂蚁 Ling 基础设施团队、阿里和 SGLang 团队在 LMSYS 博客上放出一个叫 Weight Cache Daemon 的组件:一个常驻显存的进程,把量化并切好片的权重留在 GPU 里,新起的推理引擎通过 CUDA IPC 零拷贝映射过去。团队给的数字是,Ling-2.6-1T FP8 的权重加载从约 495 秒降到 0.63 秒,整体启动从 8.8 分钟压到 0.528 分钟。
八分半钟里有八分钟在读盘
他们把一次完整启动拆开测了一遍。Ling-2.6-1T FP8 跑在 8 张 H20-3e 上,权重放在 3.5T 的 NVMe SSD,从拉起到能接请求需要 527 秒左右。这里面权重加载占 495 秒,也就是 93.9%;tokenizer 初始化 13 秒,torch 分布式初始化 5 秒,CUDA graph 捕获 7.7 秒,其余各项加起来不到 6 秒。
每张卡要从盘上读约 120 GB 的 safetensors,反序列化、按张量并行切片,再做 FP8 量化和权重重排,一共 161 个分片。这套流水线每次重启都要从头跑一遍,可它的输出是确定的:同样的模型、同样的配置,最后落在显存里的张量每次都一样,而且往往上一个进程刚退出时还留在那儿。
对生产环境来说,这几分钟意味着 P99 尾延迟在重启期间跳一大截、在途请求全部失败或者无限排队,滚动升级和故障恢复全被这个周期卡住。
权重留在显存里
每张 GPU 跑一个 daemon 进程,对应一个 TP rank。它按完整流水线从磁盘加载一次,然后把 model.state_dict() 里所有参数和 buffer 导出成 CUDA IPC 句柄,通过 Unix socket 交给来连的引擎进程。引擎那边先在 meta device 上把模型结构搭起来,不分配任何显存,再把每个参数的 data 指针指向映射过来的张量。两个进程共享同一块物理显存,全程没有拷贝。FP8 量化过程中生成的 weight_scale 这类后处理参数也一并缓存,省掉重新量化。
安全上做了两道闸。一道是配置指纹,模型路径、TP/PP/DP 切分、量化方法与配置哈希、dtype 都要对得上,还额外记了 GPU 计算能力和 torch 版本。后两项是环境戳:不同架构或不同 torch 版本走的后处理分支不一样,权重能干净地映射过去却算出垃圾,把环境写进指纹就把这种隐性错误变成一次明确的不匹配,然后退回磁盘加载。
另一道是量化方法白名单。目前只验证了不量化和 block-wise FP8,per-tensor FP8、Marlin、AWQ/GPTQ 会直接报错。原因是 IPC 只导出原始张量数据,而这几种方法把一部分效果留在 Python 侧的元数据里,或者对权重做了重排和转置,映射过去数值就是错的。团队选择让它硬报错,而不让它悄悄给出错结果。
daemon 崩掉不影响已经在跑的引擎,CUDA 的引用计数还在,显存要等两边都退出才释放;daemon 重启后重新读盘、重新导出句柄,新引擎才能再连上。
顺带解决了热备的账
组件有三种模式:daemon(引擎自己拉起 daemon,首次启动照样慢)、client(连已经在跑的 daemon,亚秒级重启)、off(默认,走磁盘,Ling-2.6-1T 要 405 到 411 秒)。
比启动加速更实际的是几个部署形态。同一张卡上多个引擎实例映射同一份权重,磁盘只读一次、量化只做一次。高优先级在线服务和低优先级离线批处理共用一张卡,后者被抢占之后亚秒级重新拉起。主备切换里,备用引擎零拷贝挂上同一份权重保持热态,主实例挂掉后 1 秒内接管。
最后这条是明摆着的成本项。粗算一下:一套 Ling-2.6-1T 实例占 8 张 H20-3e,传统热备意味着再压 8 张卡在旁边空转;换成共享权重的备机,省掉的就是这一整组卡的常驻占用。滚动升级同理,按 8.8 分钟一次估,每个实例每轮重启烧掉约 1.2 个 GPU 小时的空转,实例数上百的集群一轮升级就是三位数的 GPU 小时。
还没到头
Weight Cache Daemon 是 Fast Engine Recovery Framework 的第一期,路线图上写着冷启动 10 秒以内、热备切换 1 秒以内。后面计划做 CUDA graph 序列化、kernel 缓存和分布式初始化优化。从上面那份拆解看,这几项加起来约 26 秒,正是权重之后剩下的大头。
Qwen3-235B FP8 那一档的数字也一并放了出来:约 235 GB 权重,磁盘加载 306 到 327 秒,IPC 映射 1 秒以内,约 500 倍。Ling-2.6-1T 那一档约 780 倍。
博客里顺手点了刚发布的 2.8T Kimi K3。参数量往上翻,磁盘加载时间跟着线性翻,IPC 映射却基本是常数级,这条曲线的差值只会越拉越大。对已经在跑万亿参数模型的团队来说,重启一次的代价正在从「等几分钟」变成「几乎不用等」,而这件事影响的不只是可用性数字,还有敢不敢频繁改配置、敢不敢在同一张卡上塞两个服务。
参考来源:LMSYS Org 技术博客、CocoLoop、SGLang 项目说明;启动耗时拆解、权重加载与 IPC 映射的对比数字均取自团队公布的单机基准表。