start	end	text
0	3840	Hello,大家好,我是Tommy。今天很高興跟大家分享最新的前置內容。
4100	9220	那上一次我們講過Deepseek V4.1 Flash,怎麼降低KP Cache的存儲開銷。
9220	13320	那麼這一次我們繼續看它怎麼減少脫離計算和緩存成本。
13560	19460	那核心呢就兩件事。第一個就是重新計算上下文的時候呢,只計算前一半的層。
19460	22520	那麼後面一半是直接附用已有的結果。
22780	28920	那第二個呢就是一部分短期緩存不再長期保存,而是在需要時重新計算。
28920	29880	那最终呢
29880	31660	计算量降低约一半
31660	34020	持久化缓存降到原来的1%
34020	36300	同时性能基本不受影响
36300	37200	那么这里呢
37200	38860	最关键的是两个问题
38860	39860	那第一个就是
39860	42640	为什么只计算一半的层就够了
42640	43580	第二个呢
43580	45000	为什么重新计算
45000	47800	反而比把缓存一直存下来更划算
47800	50520	那下面我们就直接来看它的具体设计
50520	52720	上一集那个编码agent
52720	54240	修一个仓库里的bug
54240	55200	跑了三个小时
55200	56920	上下文堆到50万token
56920	59200	上一集算的是它要存多少
59200	61580	40层只存4份KV
61580	63220	每个Token890字节
63220	65320	这一集算的是它要读多少
65320	66980	上一集结尾留了一句
66980	68860	4份里解码器那一份
68860	71000	还是从编码器投影来的
71000	72860	这意味着读入新内容时
72860	74300	只用跑前20层
74300	75520	后20层不用算
75520	77100	这一招叫CED
77100	79200	全称因果编码器解码器
79200	80600	这一集就讲它
80600	83020	它把40层分成前后两半
83020	84620	前20层叫编码器
84620	86060	负责读上下文
86060	88860	后20层叫解码器负责生成
88860	90640	解码器要用的KV
90640	92760	从编码器的输出投影出来
92760	94000	所以读入的时候
94000	95340	后20层可以不跑
95340	96660	为什么能这么干
96660	97760	代价是什么
97760	99220	就是这一集的内容
99220	101540	先看读入这一步为什么贵
101540	103360	Agent每掉一次工具
103360	106060	工具的返回都要接到上下文后面
106060	107840	模型再把新内容读一遍
107840	109820	也就是上一集说过的prefill
109820	111420	有缓存的时候
111420	113040	只读新增的那一段
113040	114700	缓存一旦没命中
114700	116520	整段50万都要重算
116520	118880	一次任务几十次工具调用
118880	120240	就是几十次读入
120240	121100	读一次
121100	122880	40层每一层都要算
122880	124080	上下文越长
124080	125260	这比算力越大
125260	127020	这还只是算力
127020	129440	50万token的KV还得留着
129440	130280	等下一轮
130280	132360	甚至等第二天用户回来接着聊
132360	134760	所以它要从显存落到硬盘上
134760	136260	V4的线上部署里
136260	139180	这份缓存要在硬盘上留72小时以上
139180	141060	显存装不装的下
141060	142500	硬盘存不存的起
142500	143920	机器之间搬不搬的动
143920	145360	三处都是压力
145360	147600	算力和硬盘两笔成本
147600	148540	问题来了
148540	149520	独入这一步
149520	151840	V4.1凭什么算力砍一半
151840	152920	硬盘砍到1%
152920	154120	先说算力
154120	156120	2024年有篇论文叫Yoko
156120	157880	意思是你只缓存一次
157880	160200	它把模型前后两半分开
160200	162400	后半层不再各自算KV
162400	164640	直接用前半层算好的那一份
164640	166440	后半层在独入阶段
166440	167640	就可以整个跳过
167640	170320	代价是后半层共用同一份KV
170320	172140	每一层没法有自己的一份
172140	173840	能存的信息就少了
173920	176360	CD顺着这个思路改了两处
176360	178380	解码器要用的全局KV
178380	180660	拿编码器第20层的输出
180660	182400	乘一个投影矩阵得到
182400	183440	第一处改动
183440	185380	投影矩阵可以逐层不同
185380	187260	每层能有自己的一份KV
187260	189340	容量比YOKO共用一份大
189340	190240	第二处
190240	192100	滑动窗口那条局部分支
192100	192700	不投影
192700	194140	每一层还是自己算
194140	196320	局部信息的计算深度保住了
196320	197800	在V4.1里
197800	199400	配合上一集讲的共用
199400	202040	真正做投影的是解码器那一个负层
202040	203320	其余层沿用它
203320	205820	独入阶段编码器20层算完
205820	208520	解码器要的全局KV顺手投影出来
208520	210240	后20层根本不用跑
210240	212340	算力从40层变20层
212340	214920	激活参数从160亿降到80亿
214920	217160	生成阶段才用满160亿
217160	218580	这里有个缺口要补
218580	220980	滑动窗口KV每一层自己算
220980	223180	可独入阶段解码器根本没跑
223180	226300	解码器20层的滑动窗口KV就是空的
226300	227800	生成第一个Token时
227800	231200	解码器要用到前面128个Token的窗口KV
231200	232360	手里却是空的
232360	233820	想精确补上
233820	234800	就得让解码器
234800	237340	把前面那些token重新算一遍
237340	237800	算多少
237800	239820	窗口是一层套一层的
239820	241760	解码器第一层的一个位置
241760	243620	只看它前面128个
243620	245240	第二层的同一个位置
245240	247900	看的是第一层算出的那128个
247900	249200	而那128个
249200	251500	各自又看过更前面的128个
251500	254720	所以第二层实际牵扯到前面256个
254720	256560	一层多128个
256560	259120	到第二层就是20乘128
259120	260480	2560个
260480	261540	也就是说
261540	264020	要把第20层的窗口KV算准
264020	266500	得从2560个Token之前开始
266500	268300	把解码器重新跑一遍
268300	270540	Agent的场景是多轮短消息
270540	272740	每轮新内容可能就几百个Token
272740	275260	为了补窗口再多跑2560个
275260	276340	这比开销不小
276340	277900	这个版本的做法叫
277900	279800	滑动窗口有界回放
279800	281920	不回退2560个
281920	283940	只回退末尾128个
283940	286500	把这128个Token的编码器输出
286500	287980	送进解码器跑一遍
287980	290700	开销是128个Token乘20层
290700	292380	跟50万笔可以忽略
292380	295340	窗口也只在这128个里面看
295340	296940	再往前的一律不看
296940	299360	因为再往前的token没经过解码器
299360	300320	没有东西可看
300320	302280	回放段里的第一个token
302280	303780	窗口里就只有他自己
303780	305680	越往后能看到的越多
305680	308200	到末尾正好是完整的128个
308200	311340	算出来的滑动窗口KV只拿来生成
311340	312380	不存进缓存
312380	313520	为什么敢
313520	316540	因为窗口的有效视野远比理论知晓
316540	319720	有篇叫PowerAttention的工作专门测过这件事
319720	321580	理论上第20层的视野
321580	323680	能到2560个token之外
323680	325260	实际上远处的信息
325260	326300	一层一层传过来
326300	327980	早就衰减到可以忽略
327980	329060	远处的东西
329060	330740	本来就归全局分支管
330740	332600	窗口只负责眼前这一段
332600	334040	这样补出来的KV
334040	335340	和完整跑一遍
335340	336160	不完全一样
336160	338100	报告说实测几乎不掉点
338100	339120	为了保险
339120	340020	后训练时
340020	341760	把同样的回放模拟进去
341760	344180	模型是在这种近似下练出来的
344180	345440	顺便说一句
345440	347580	这两集提到的前变量
347580	348520	稀疏注意力
348520	350360	后训练里的这种训练感知
350360	352520	都出自DeepSeek这套技术战
352520	355040	我做了一门DeepSeek专题的实战课
355040	358860	从MLA MOE ROPE这些核心机制
358860	360820	讲到GRPO对齐训练
360820	363300	再到VLLM SGLAN固鼓鼠
363300	365380	共计11张配项目代码
365380	367480	想把这两集背后的底子补齐
367480	369780	链接在简介和置顶评论里
369780	371020	算力说完
371020	371740	说硬盘
371740	373400	这一半省得更巧
373400	375520	先看V4是怎么存的
375520	377340	落到硬盘的缓存
377340	378640	叫持久化缓存
378640	379500	分两类
379500	381540	全局KV整段存
381540	384380	只要新请求的开头和缓存里的一样
384380	385600	就整段复用
385600	387880	滑动窗口KV不整段存
387880	390320	只在两个位置各存128个
390320	391980	一段提示词的末尾
391980	393300	一段回答的末尾
393300	395700	为的是重新生成和多轮接续
395700	397120	两类各自淘汰
397120	398900	最久没被用到的先删
398900	400380	硬盘配的够大
400380	402440	两类都能留72小时以上
402440	403300	就这样
403300	406940	滑动窗口KV还是占了持久化缓存将近一半
406940	408060	它没有压缩
408060	409940	每个位置128个Token
409940	412740	每一层各一份的8比特KV原样存
412740	415120	多轮对话每轮都要存一份
415120	417940	轮次多每轮短分数就多
417940	419960	问题处在访问模式
419960	422180	全局KV是常委复用
422180	424520	一天以后用户回来还会命中
424520	427100	滑动窗口KV只在一次绘画里
427100	428680	几分钟之内被用到
428680	430960	绘画一结束或者进到下一轮
430960	432460	它就再也不会被用到
432460	436660	把一份分钟级的东西放进保留72小时的缓存
436660	437900	又贵又没用
437900	440320	V4的报告提过干脆不存
440320	441260	要用再算
441260	444020	叫做Zero SWA Catching
444020	445000	可精确重算
445000	448420	要按层数乘128个token跑一遍完整前向
448420	449580	线上扛不住
449580	451440	这个版本改了两条
451440	452460	第一条
452460	454560	滑动窗口KV不再进硬盘
454560	456100	改放进一个内存池
456100	460100	所有机器各拿出10%的内存拼成一个池子
460100	462600	注意是机器的内存不是显存
462600	464780	池子总量比硬盘小得多
464780	466320	但有效期只有几分钟
466320	468160	过期立刻腾给新绘画
468160	470860	真实负载下这种高周转
470860	472980	够服务绝大多数正在进行的绘画
472980	475160	全局KV照旧流硬盘
475160	476500	保证72小时
476500	480000	第二条池子小必然有未命中
480000	483480	未命中指的是全局KV硬盘上还在
483480	486360	滑动窗口KV在池子里已经过期
501753	503173	编码器也是20层
503173	506073	精确补齐同样要2560个
506073	508333	现在只回放128个
508333	511053	补出来的窗口KV是近似的
511053	512333	缓存到哪里为止
512333	514173	回放就从哪里开始
514173	515373	起点不同
515373	517353	补出来的KV就略有不同
517353	520373	报告说这对回答质量几乎没有影响
520373	521833	还用了一个说法
521833	523713	把灾难性的未命中
523713	526053	变成了优雅又便宜的降级
526053	527893	正因为兜底便宜
527893	530753	才敢把滑动窗口KV从硬盘上拿掉
530753	532673	两种回放别混
532673	535013	解码器回放每次独入都做
535013	537073	补的是解码器的窗口KV
537073	539193	因为解码器从来不跑独入
539193	541753	编码器回放只在未命中识做
541753	543653	补的是编码器的窗口KV
543653	545333	因为硬盘上不再存它
545333	548073	两个都只回放末尾128个
548073	549453	都基于同一个判断
549453	550973	窗口的记忆很短
550973	553533	1%就是这么算出来的
553533	555033	不存滑动窗口KV
555033	556613	19化缓存少一半
556613	558433	剩下的全局KV
558433	559393	上一集讲过
559393	561073	是上一代的四分之一
561073	562853	二分之一乘四分之一
562853	564113	八分之一
564113	566673	把三层存储放在一起看就清楚了
566673	569273	显存里放正在用的全局KV
569273	571373	每个Token890字节
571373	574093	机器内存里放几分钟内会用的
574093	575113	滑动窗口KV
575113	575973	过期就扔
575973	579253	硬盘上放几天内可能会用的全局KV
579253	580433	留72小时
580433	582733	三层各管一个时间尺度
582733	584613	每一层只存它该存的
584613	586853	回到那个50万Token的绘画
586853	587853	看两个时刻
587853	588913	第一个时刻
588913	590933	工具返回一段新内容
590933	593293	读入直跑编码器20层
593293	594813	激活80亿参数
594813	597973	解码器要的全局KV顺手投影出来
597973	600193	滑动窗口回放128个
600193	601113	开始生成
601113	602213	第二个时刻
602213	603973	第二天用户回来接着聊
603973	607433	硬盘上取出来的只有全局KV400多兆
607433	610753	滑动窗口那份现算还是128个
610753	611973	两处近似
611973	614893	报告给的结论是性能与基线相当
614893	616613	读入的计算量减半
616613	621273	部署上还把视觉编码读入生成分成三段
621273	622573	各自扩缩容
622573	625573	读入密集的agent负载可以单独加机器
625573	627453	多轮短消息的agent绘画
627453	629713	就是报告点名要服务的场景
629713	631253	局限一共三条
631253	632173	第一条
632173	633933	有界回放是近似
633933	636653	尤其是缓存和新内容接缝的地方
636653	638833	报告承认还没充分验证
638833	640593	接下来要加压力测试
640593	642733	也要在真实负载里继续观察
642733	644773	后两条是我自己的判断
644773	645773	第二条
645773	647533	收益跟场景绑定
647533	650953	多轮每轮短的agent绘画收益最大
650953	653933	一次性为一份几十万token的长文档
653933	655893	省的主要是算力那一半
655893	658193	硬盘那一半的好处基本用不上
658193	659333	第三条
659333	661033	10%的内存池
661033	662513	几分钟的有效期
662513	664353	72小时的硬盘保留
664353	667753	都是按Deepseek自家的线上负载掉出来的
667753	669073	换一种负载分布
669073	671793	未命中率和回放开销都要重新测
671793	673753	回到开头的问题
673753	674913	算力砍一半
674913	677633	靠CED解码器的全局KV
677633	678873	从编码器投影
678873	680313	独入只跑20层
680313	681793	硬盘砍到1%
681793	683633	靠不存滑动窗口KV
683633	685973	为民众就回放128个补出来
685973	688853	再乘上上一集全局KV的1%
688853	691193	两件事背后是同一个判断
691193	692933	滑动窗口的记忆很短
692933	694353	短到可以现算
694353	695693	上一集的共用
695693	697193	加上这一集的回放
697193	700253	长上下文的存和算一起压了下来
700253	701253	成绩还没有掉
701253	703393	如果这一集让你有点收获
703393	704873	欢迎点赞转发
704873	705353	关注
705353	706773	评论区也聊聊
706773	707813	换你来做部署
707813	708913	滑动窗口KV
708913	710693	你会存硬盘保命中率
710693	711533	还是不存
711533	713053	靠回放节省硬盘
713053	713713	好
713713	714933	我们下期继续
