0.8MB 跑通 Qwen|第 12-1 篇:LLM 推理的跨进程恢复——服务重启了,会话不能断

简介: 本系列《0.8MB跑通Qwen》聚焦ARM端零依赖纯C推理引擎,实现在RK3588上部署Qwen3-VL等多尺寸模型。本文详解`--disk-kv`机制:将KV Cache落盘持久化,支持进程重启后按前缀精准恢复,实现“会话不断连”,2K上下文prefill加速达23.6×,真正打通边缘AI服务可用性最后一环。(239字)

系列:《0.8MB 跑通 Qwen:从零实现 ARM 零依赖纯 C 推理引擎》(30 天 × 90 篇) | 适配模型:Qwen3-VL-8B-Instruct(千问3_VL_8B_Instruct)· Qwen3-VL-2B-Instruct · Qwen3-30B-A3B | 测试设备:RK3588(4×Cortex-A76 + 4×Cortex-A55,aarch64)

系列总纲:《0.8MB 跑通 Qwen》30 天 90 篇 · 总纲(阿里云社区)

上一篇:11-3《缓存的一生:内存、容量与淘汰》 | 下一篇:12-2《L3 快照格式与 mmap 落盘》

真机实测通过:本文实验已在 RK3588 板端实测完成(2026-09;方法学与原始记录见仓库 docs 与《实验脚本》目录)

一句话导读:跨进程恢复:推理引擎的进程内缓存再快、进程一死全没,真实服务必遇更新与重启——本篇讲 --disk-kv 把 KV 快照落盘、新进程扫描建索引、重启后按前缀找回复用,回答"服务重启了会话为什么不能断"。

关键词:手搓 Qwen 推理引擎、千问大模型推理、Qwen3-VL、零依赖纯 C、跨进程恢复、磁盘 KV、KV cache、前缀缓存

导语:进程内缓存再快,进程一死全没,而真实服务必遇更新与重启。本篇讲 --disk-kv 怎么把 KV 快照落盘、新进程启动扫描建索引、重启后按前缀找回并只补算增量尾巴,从而回答"服务重启了会话为什么不能断",也指向仓库报告里那个 13.1×。

11-3 结尾说了句扎心的实话:进程内缓存再快,进程一死全没。真实服务一定会碰到"更新/重启/断电"。今天解决它:--disk-kv 把 KV 快照落盘,重启后按前缀找回——仓库基准报告里的 13.1× 跨进程恢复就是这条路径。

1. 知识点:为什么"进程内缓存"救不了重启

11-3 的缓存一生里,KV 区是进程内存的一部分:

  • 进程退出 → 内存归还 OS → 算好的 KV 烟消云散;
  • 重启后客户端重发同样的历史 → 引擎只能从零全量 prefill——多轮长会话直接回到"最贵的那一段"。

解决思路直白得像把大象装进冰箱:把 KV 从内存"复制"到磁盘。存下三样东西:

  1. token 序列(这一段的身份,跨进程的"缓存键"——11-2 的 LCP 在磁盘上同样适用);
  2. KV 行(K、V 张量,跨进程的"缓存状态");
  3. 模型几何(层数、头数、维度——防止用错模型的快照去恢复,几何不符直接跳过)。

重启后,新进程扫描目录建索引,把请求的 token 序列与每个快照做 LCP(还是 11-2 那套 kv_lcp),最长且 ≥16 的命中就把 KV 读回内存,然后只 prefill 增量尾巴。用户在客户端无感知——他照常重发全历史,引擎在内部把"全量重算"偷换成"读盘 + 算尾巴"。

两个诚实边界(先摆出来):

  • F32 快照很大:28 层 × 8 KV 头 × 128 维 × 4B ×(K+V)= 229 KB/token——8K 会话 ≈ 1.87 GB。它买的是位级一致(恢复 == 重算),贵但绝不引入误差;
  • 落盘有成本:turn1 响应后要同步写盘(8K 会话 +16s wall),这个成本换"重启不丢长会话"。

2. 对应代码:save/load 与"启动扫描建索引"

写盘(vllm_safetensors.c 第 12357 行 st_kv_disk_save):头注释(第 12312–12335 行)把文件布局写得明明白白——64B 头(VLKV magic + 版本 + 几何 + token 数 + FNV-1a 哈希)+ token ids + 逐层逐块的 K/V F32 行。每层按 kv_bs 块写:先 K 块后 V 块(第 12389–12400 行),尾块只写有效行。

serve 侧触发(vllm_server.c 第 620–621 行):每个成功的文本请求结束后调用 save,并打印 [KV-DISK] saved %d-token KV -> %s。

启动建索引 + 命中恢复:新进程启动时 vllm_server_diskkv_scan 扫描目录(main.c 第 4465/4717 行,serve 日志 [KV-DISK] index: N checkpoint(s)),把每个快照的 token 序列读进内存;请求来时(vllm_server.c 第 1308–1317 行)用 dkv_best_lcp 找最长前缀命中,st_kv_disk_load 读回,日志打 [KV-DISK] loaded %d-token KV prefix from %s。

读回(第 12406 行 st_kv_disk_load):先校验头里每个几何字段——有一个对不上就拒载(第 12428–12430 行),这是"绝不用错模型的 KV"的硬闸;随后跳过 token ids(它们已被 serve 层 LCP 逐 token 验证过),只按文件块的边界把 K/V 行读进缓存。

容量纪律:快照上限 DISKKV_MAX_TOKENS = 8192(vllm_server.c 第 451 行,覆盖 max_seq 窗口)、目录最多 DISKKV_MAX_FILES = 8 个文件、按 mtime LRU 淘汰(第 648 行)——磁盘缓存不是无限膨胀的。

3. 改动后果:同一台板子,跨进程恢复实测

口径:RK3588 / Qwen3-VL-2B / 2026-09 / --disk-kv / /v1/completions 贪婪。S1 进程全量 prefill 2K 上下文并生成回答 → 快照落盘 → 杀掉 S1 → 启动 S2 → 客户端重发"历史+追问",观察 S2 是"读盘恢复 + 增量"还是"全量重算"。

阶段 事件 实测
S1:turn1 全量 prefill 2044-token 上下文 46.37 s(请求总耗时 51.34 s),日志 [KV-DISK] saved 2056-token KV -> kv_a0db…cb8.kv
落盘 快照写入 eMMC 471,605,344 B(≈450 MiB,ls 实测)
杀 S1 / 启 S2 模拟"服务重启" S2 启动即扫描目录:[KV-DISK] index: 1 checkpoint(s)
S2:turn2(历史+追问) 恢复 + 增量 日志 loaded 2034-token KV prefix;prefill n=31 / 1.96 s(请求总耗时 7.27 s)

判读:

  1. S2 没有全量重算:日志 loaded 2034-token KV prefix from kv_a0db… 证明恢复的是 S1 的 KV;[PREFILL-TIMING] n=31 total=1962.2ms 证明只算了增量尾巴(本轮 31 个新 token);
  2. prefill 加速 ≈23.6×(46.37s → 1.96s),请求总耗时 51.34s → 7.27s(≈7.1×,双方都含 decode,见 12-3 的"口径拆解");
  3. 输出正确:S2 在恢复的完整上下文上答出了追问——Based on the provided information, Bob lives in Tokyo.;KV 是"算出来的状态",恢复 == 重算(F32 位级一致),所以回答与从未重启一致。

仓库基准报告的 8K 档同款实验(RK3588_性能基准报告.md §3.2):turn1 全量 TTFT 201.7s → 快照 1.87 GB(+16s 写盘)→ 重启 boot 1.0s → 恢复后首 token 15.4s(loaded 8104-token prefix)→ 相对全量 13.1×。llama.cpp 无等价物(重启即失),诚实标注这是本引擎相对它的架构级差异。我们这轮 2K 复现的 prefill 口径加速比 ≈23.6×、与 13.1× 同向(差异来自上下文比例与口径,12-3 细拆)。

4. 学员调试任务

  • A 档(板端动手):复刻第 3 节:S1 发长 prompt → 记 [KV-DISK] saved 与快照文件大小;杀进程;S2 同参启动 → 重发"历史+追问" → 抄 [KV-DISK] loaded 与 [PREFILL-TIMING] n=。用 ls -la 看快照字节数,对照 12-2 的公式估算是否吻合。把上下文拉长一档再跑,观察加速比变化。
  • B 档(纯读源码):读 st_kv_disk_load(vllm_safetensors.c 第 12406 行起)的几何校验段,回答:① 换一个不同几何的模型加载同一个 kv 目录,会不会发生错误恢复?② 文件名是 token 序列的 FNV-1a 哈希——哈希碰撞最坏会怎样(提示:serve 层还做逐 token LCP)?

预期输出:你能演示一次"杀掉进程再回来,会话没断"的完整闭环,并报出自己的恢复加速比与快照字节数。

收尾

  • 本篇源码点名:vllm_safetensors.c(st_kv_disk_save 12357、st_kv_disk_load 12406、布局注释 12312–12335)、vllm_server.c(save 620、索引 560、LRU 648、DISKKV_MAX_TOKENS 451、命中路径 1308–1317)、main.c(--disk-kv 4798、启动扫描 4465/4717)。
  • 开源仓库:Kestrel-LLM (Gitee)(AGPL-3.0-or-later 或商业许可,二选一)
  • 下篇预告:快照文件里到底躺着什么?12-2 用 xxd 拆一个真实的 .kv 文件:VLKV 头、token ids、按块排布的 K/V——顺便回答"为什么 2K 会话就要 ~0.47GB"。
相关文章
|
1天前
|
调度 C++
0.8MB 跑通 Qwen|第 13-2 篇:草稿 + 验证——推理引擎里 spec decode 的实现
本系列《0.8MB跑通Qwen》聚焦ARM端零依赖纯C推理引擎,实测RK3588上运行Qwen3-VL多模态模型;详解speculative decode实现——基于n-gram草稿、批量验证与无损回放,确保输出位级一致,兼顾 correctness 与工程可控性。(239字)
|
1天前
|
JSON 数据格式 Python
0.8MB 跑通 Qwen|第 18-2 篇:tokenizer.json → vocab.bin——推理引擎的 build_vocab_bin.py 在干嘛
本系列《0.8MB跑通Qwen》聚焦ARM端零依赖纯C推理引擎,适配Qwen3-VL多模态模型(2B/8B/30B),在RK3588平台实测通过。本文详解词表编译:将7MB tokenizer.json编译为1.95MB可审计vocab.bin,精准处理byte-level解码(如0xAD/0x7F等历史坑),实现板端逐位一致、冷启动仅约2秒。(239字)
|
1天前
|
缓存
0.8MB 跑通 Qwen|第 8-3 篇:推理引擎的 KV 缓存结构——按 token 还是按头存
本系列《0.8MB跑通Qwen》聚焦ARM端零依赖纯C推理引擎,适配Qwen3-VL多模态模型,在RK3588上实测。本文精析KV缓存的token-major布局设计原理,揭示其如何兼顾prefill与decode访存效率,直击带宽瓶颈。(239字)
|
1天前
|
调度
0.8MB 跑通 Qwen|第 13-3 篇:推理引擎的回退与收益边界——哪些场景 spec 才划算
本文精析Speculative Decoding在ARM端的收益边界:基于RK3588实测,揭示“62%命中率仍变慢”的根源——单步Decode仅44ms时,验证开销与KV回滚反致负增益;明确开启条件:长上下文、高重复性、大模型、贪婪采样。零依赖纯C,适配Qwen3-VL系列。
|
1天前
|
缓存 NoSQL 区块链
0.8MB 跑通 Qwen|第 15-2 篇:推理引擎的 prefill 与 decode——两条路径为何分开
本篇详解Qwen推理引擎中prefill与decode双路径设计:prefill一次性处理整段prompt(如18 token),批量写入KV缓存;decode逐token循环生成,追加KV。通过RK3588真机gdb断点实证,明确二者独立入口、状态流转与性能动因,手搓零依赖纯C引擎的核心逻辑。(239字)
|
1天前
|
C++
0.8MB 跑通 Qwen|第 10-2 篇:推理引擎的 sparse top-k 块选择——"只看该看的"到底怎么选
本系列《0.8MB跑通Qwen》聚焦ARM端零依赖纯C推理引擎,实测RK3588上高效运行Qwen3-VL多模态模型。本文深度剖析sparse_attn_head的top-k块选择机制——探针抽样、prefill重要性预留、贪心补满与recency保险四段代码,揭示长上下文稀疏注意力如何精准“找针”,并实证k=1时板端翻车根源。(239字)
|
1天前
|
人工智能 图形学
婚庆建模500元变2元,她靠AI年入200万:AI婚庆培训OPC案例深度拆解
本文为「OPC一人公司通关手册」第24篇,深度拆解96年婚庆从业者如何用AI重构行业:将高端方案从3-7天压缩至1.5小时,建模成本从千元降至2元,进而转型AI培训,一年营收200万+。核心启示:一人公司成败不在工具,而在“专业底盘+AI放大”,卖认知差远比卖时间更可持续。(239字)
|
1天前
|
人工智能 自然语言处理 数据可视化
万小智AI建站3.0全新升级:一句话,企业官网发布上线全流程
阿里云万小智3.0是AI驱动的智能建站工具,用户只需用自然语言描述需求,AI即可自动生成完整网站。本文详解从创建应用、定义需求、对话细化、确认PRD到预览编辑、发布上线的全流程,助您快速搭建专业网站。(239字)
|
1天前
|
人工智能 Linux Windows
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面
千问办公(QwenWork)是阿里云推出的AI智能办公平台,支持网页端直接使用及Windows/Mac/Linux客户端下载。提供PPT生成、财报分析、网页搭建等AI功能,个人版免费,企业版198元/席/月。详情见官网qwenwork.cn或阿里云产品页。
186 0
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面
|
1天前
|
弹性计算 编解码 人工智能
阿里云服务器ECS实例架构:X86计算和Arm计算有什么区别?GPU、裸金属和高性能计算区别对比?
阿里云ECS支持五大计算架构:X86(稳定通用,适配Intel/AMD)、Arm(倚天/Altra,高能效独享核心)、GPU(AI训练/图形加速)、弹性裸金属(神龙架构,物理机性能+虚拟机弹性)、高性能计算(HPC优化,超大规格)。按场景灵活选型。阿里云服务器ECS官网:https://t.aliyun.com/U/AZBUsA

热门文章

最新文章