官方給了兩個比例——CSA2 把 KV 快取砍到四分之一,SWA Bounded Replay 再把常駐部分砍到八分之一。把兩個數字疊乘,會以為省了三十二倍;但兩個比例其實各自對著同一個舊基準算,常駐只比 CSA2 再省一半。
KV 快取的兩個比例,不能直接相乘
這份模型卡片本身沒有故事,只有一串數字——552B 的骨幹參數、prefill 每個 token 醒 8B、decode 醒 16B、KV 快取壓到每個 token 890 bytes。單獨看每個數字都像宣傳稿,擺在一起查,才看得出這些數字是怎麼換來的、換這筆帳的時候什麼東西被拿去交換。
552B 骨幹醒 8B 或 16B——40 層怎麼分工
整個網路總共 40 層,前 20 層是 causal encoder,後 20 層是 decoder,模型卡片直接把這個切法寫進架構名稱裡。552B 是 backbone 的參數總量,但不代表每個 token 通過網路時真的要動用 552B——卡片給了兩個活化量:prefill 階段(整段 prompt 一次餵進去)每個 token 只活化 8B,decode 階段(逐個 token 往外吐)活化 16B,兩個數字差了一倍。合理的推測是,decode 每一步都要重新跑一次路由決策,prefill 可以把整段 prompt 的路由攤在同一次前向傳播裡分攤成本——這是延伸的解讀,卡片本身沒有解釋兩個活化量為什麼剛好差一倍。這個切法也不只是命名:卡片把它叫作 Causal Encoder-Decoder(CED),並且說明了兩段的分工——decoder 的全域 KV 快取是從最後一層 encoder 的 hidden state 投影出來的,不是各個 decoder 層各自從自己的 hidden state 算一份。換句話說,前 20 層算出來的那份表示,後 20 層整段共用。
552B 能縮到 8B、16B,靠的是 MoE 路由。每一層 MoE 配置是 1 個共享 expert 加上 384 個 routed expert,共享的那個一定參與計算,384 個候選裡再挑 6 個參與——卡片的用詞是「activating 6 routed experts per token」。552B 是把全部 expert 的參數都算進去的總和,但任何一個 token 實際走過的路徑只碰到共享 expert 加上被選中的 6 個 routed expert,其餘 378 個那一輪完全不參與運算、也不佔用那次前向傳播的算力。骨幹大小決定模型裝了多少可能的路由分支,活化量才決定這次前向傳播真正要花多少算力。
同一個模型,四個不同層次的數字
層數、骨幹、活化量、expert 路由,四個數字回答的是四個不同的問題:運算路徑多深、裝了多少參數、單次前向傳播動用多少參數、動用哪些而不是動用多少。後面要拆的 KV 快取數字,問的是完全不同的第五個問題——前向傳播結束之後,要為了生成下一個 token 留住多少 byte。
40 剛好可以被 20 平分,這種對稱的層數安排在架構設計裡不算罕見,但也不是必然——一個模型完全可以是 22 層 encoder 配 18 層 decoder,或乾脆不做這種切分。卡片沒有解釋為什麼剛好對半分,這一類「為什麼是這個數字」的問題,在接下來每一節都會重複出現:官方給的是結果,不是推導過程。
552B 這個數字還有另一個跟活化量無關的現實含義。不管某次前向傳播只用到多少參數,整個 552B 的權重都得先放進可以快速存取的記憶體,因為下一個 token 可能路由到不同的 6 個 expert,任何一個 routed expert 都可能被叫到。活化量決定的是這次要花多少算力,552B 決定的是至少要有多大的記憶體空間把整個模型攤開來待命——這也是 MoE 架構部署起來比同樣活化量的稠密模型貴的原因之一,省下來的是算力,不是硬體帳單。384 選 6 換算成使用率大約是 1.6%,用百分比講,這個路由稀疏度聽起來比「384 選 6」驚人得多,但講的是同一件事。
CSA2:Full、Reindex、Reuse 三種模式怎麼省
把 890 bytes 這個數字生出來的機制,叫 Compressed Sparse Attention 2,卡片簡稱 CSA2。它的做法是給每一層注意力配一種模式——Full、Reindex 或 Reuse——三選一。40 層裡不是每一層都重新算一次「這個 token 該注意誰」:某一層用 Full 模式,真的把 KV 與稀疏索引算一遍;後面的層則共用算好的 KV 與索引 key,或直接沿用選出的 Top-K 清單,不再重算一次。卡片把「共用 main KV 與 indexer K」跟「沿用 Top-K 索引」並列成三種模式的共同目的,沒有逐一指定哪個模式負責哪一件;下面把 Reindex 對到前者、Reuse 對到後者,是從命名與原文語序反推的讀法。decoder 這一段還多一層限制,卡片稱作 Hierarchical Sparse Indexer:後面的索引層只能在第一個 Full 模式層先篩出的候選池裡挑,不是在全部歷史 token 裡重新搜一遍。往下拆,這套設計等於押注一件事:「這個 token 該關注誰」在相鄰幾層之間變化不大,所以一次算出來的結果值得往後共用——卡片沒有正面講這個前提,這是從三種模式的分工反推出來的讀法。省下的計算量,直接對應省下的 KV 儲存量:沒有重算,就沒有新的 KV 需要另外存一份。Hierarchical Sparse Indexer 對 1M 這種長 context 特別有意義——卡片正面講的效果是,較深的那些索引層要付的成本,不會跟著 context 長度一起往上走。範圍也要看清楚:這個限制寫在 decoder 這一段,管的是後面的索引層,不是 40 層全部都套用,卡片也沒有把 KV 重算算進這一筆。
卡片用的字眼是「靜態模式」——每一層的模式在架構設計時就固定下來,不是推論當下依內容動態決定要不要重算。對做延遲預算的人來說,這代表 Full、Reindex、Reuse 各自的計算量在部署前就能算清楚,不會因為輸入內容不同而在推論當下臨時多跑一層 Full 計算,延遲的上界因此是可預測的——這一點卡片沒有明講,是從「靜態」這個詞本身推出來的合理解讀。
890 bytes 還有第二個來源,跟 Full、Reindex、Reuse 完全無關——數字精度。卡片寫得很白:主要的 KV 用 FP4 存,格式是 E2M1,每 16 個 channel 才配一個共用的縮放係數(E4M3)。也就是說,890 bytes 是「少算幾層」跟「每個數字只用 4 個 bit 存」兩件事疊加出來的結果,卡片沒有拆開講兩者各自貢獻多少。拿數值精度換 KV 佔用,是這筆帳裡看不見的那一半——這筆代價不會出現在「890 bytes」這個漂亮數字裡,只會出現在推論時的近似誤差裡,卡片也沒有給量化對準確度影響的任何數字。對建置推論服務的人來說,4-bit 的 KV 快取要吃到這個好處,前提是 serving stack 本身能處理 FP4 精度的讀寫——這一步不是每個現有框架都預設支援,值得在導入前先確認,否則 890 bytes 這個數字只存在於卡片上,實際部署還是得回頭用比較保守的精度存 KV。
SWA Bounded Replay:不存的那一段怎麼補回來
890 bytes 是「全域」KV 快取的數字,卡片另外給了一個「常駐」版本,兩者不是同一件事。省常駐這一段用的機制叫 SWA Bounded Replay——SWA 這個縮寫卡片沒有展開,多半跟局部滑動視窗注意力有關。它的做法是:局部這一段 KV 不用真的存到 SSD 上,需要用的時候,把最近 n_win 個 token 重新跑一次注意力,現場算出來就好,卡片自己的說法是「replaying only the most recent n_win tokens」。n_win 實際是多少,卡片沒有公開,重放這個動作本身要花多少額外算力或延遲,卡片也沒有講,只講了換到的東西:常駐這段的 KV 快取,壓到舊模型的八分之一左右。有一個邊界情況卡片完全沒提:對話剛開始、還沒有累積到 n_win 個 token 的時候,視窗裡能重放的內容本身就不夠——這時候是回退成把已有的全部 token 都重放一次,還是有另一套處理方式,卡片沒有交代,這是讀者只能自己猜的一塊。同一份卡片願意具體到「E4M3 scale per 16 channels」這種實作細節,卻在 n_win 這種同樣關鍵的數字上留白,讀起來像是「演算法設計的部分講清楚,工程實作的旋鈕留給自己調」的分界——公開多少細節,公司自己劃線,讀者只能照著劃出來的線去猜劃線外的部分。
拖動視窗大小滑桿、按播放看重放視窗跟著最新 token 走 · 視窗大小為示意值
圓點代表 token 沿時間軸推進;橘色是目前 SWA 視窗內、要重放的 token,墨綠色是 CSA2 可能挑中的長…
SWA 這段 KV 不寫進 SSD,重放最近一段 token 現場算出來——視窗多大、重放要多久,官方都沒說。
省 SSD 空間的代價,是把「存一次、之後直接讀」換成「每次要用都重算一次局部注意力」——重放不是免費的,只是卡片沒有給價格。這跟 CSA2 的 Reindex、Reuse 邏輯很像:後面的層能不能沿用同一份計算結果,決定了同一段記憶體能不能不用重新佔用,差別在於方向相反——CSA2 省的是不用重算,SWA Bounded Replay 省的是重算比存更便宜。n_win 開多大,回放要重算的量就跟著變大——這是這個機制天生的槓桿,卡片沒有給讀者估算這筆重放成本的依據,是文章開頭兩個比例之外,第三個沒被量化的代價。
把兩個比例換算回同一個基準
「四分之一」跟「八分之一」這兩個比例,很容易被讀成疊乘關係——CSA2 先把 KV 省到四分之一,SWA Bounded Replay 再把剩下的省到八分之一,兩個一乘就是三十二分之一。但卡片原文是兩個各自獨立的比較,分母都是同一個舊模型,不是彼此:890 bytes 是舊模型的四分之一,常駐版本是舊模型的八分之一。換算回同一個基準——如果 890 bytes 等於舊模型的四分之一,舊模型大約落在 3,560 bytes 一個 token(這個數字卡片沒有直接列出,是拿四分之一這個比例反推出來的);常駐版本是舊模型的八分之一,算出來大約 445 bytes(同樣是反推,不是卡片原文的數字)。445 除以 890,剛好是二分之一——照卡片的比例推算、並假設舊模型的常駐佔用與全域佔用相同,SWA Bounded Replay 比起 CSA2 已經省下的量只再多省一半,不是再乘一次四分之一。這個假設卡片沒有明寫,只能從「新模型不必再把 SWA KV 持久化到 SSD」這一句反過來推。
拖動滑桿改變 context 長度 · 4K 到 1M,共 9 個級距,比較 3 種 KV 設計的總佔用
比較務實的讀法是:890 bytes 是這個模型算一次注意力時用得到的全部 KV,445 bytes 才是它在兩次請求之間真的要留在記憶體或硬碟裡的量——差的那一半,就是 SWA Bounded Replay 平常不佔位置、要用才現算出來的部分。這個差距在小 context 時看不出來,4K token 的絕對差距只有幾 MB,誰省得多不重要。差距被放大的地方,是卡片自己強調的另一件事:稀疏注意力訓練在 64K,外推用到 1M。以 1M 這個外推上限來算,推算基準要吃掉將近 3.7 GB,CSA2 全域版本落在 933 MB 上下,常駐版本則落在 467 MB 上下——三條線的絕對差距隨 context 長度線性放大,彼此的比例(四倍、八倍、二倍)從頭到尾不變,這正是 KV 快取問題的性質:單一 token 省下的 byte 數字很小,乘上百萬個 token 才顯出意義。稀疏注意力訓練用的 64K 這個長度,換算成 bytes 也有意義:CSA2 全域版本在 64K 大約是 58 MB,常駐版本大約是 29 MB,都還在單一 GPU 記憶體可以隨意負擔的範圍——這或許是官方選擇在這個長度訓練、之後才外推的原因之一,不過卡片沒有明講訓練長度的選擇是不是考慮了這一層。
把三個階段擺進同一張表,方便直接對照每一段各自省的是什麼、代價記在哪一筆帳上。
點擊分頁比較 3 個階段 · 每格含機制與代價
機制:對照用的舊基準。
代價:反推出來的,非原文數字。
機制:層模式共用計算,加上 FP4 量化。
代價:精度換空間,準確度影響沒公開。
機制:局部視窗改用現場重放,不寫入 SSD。
代價:重放要重算注意力,數值沒公布。
互動圖表
CSA2 把 KV 壓到 890 bytes,常駐版本反推約 445 bytes——四分之一跟八分之一各對照舊基準,不是疊乘的三十二分之一。
這幾個數字算的都是單一個請求、單一個 token 的成本,真正要規劃硬體的時候還要再乘一次併發數。假設一個服務要同時撐 200 個請求、每個請求都在 128K 這個級距的 context,常駐版本一個 token 約 445 bytes,200 個請求同時攤開來,光是常駐 KV 就要吃掉 445 × 131,072 × 200,約落在 11.7 GB 上下——這還只是常駐部分,全域版本會更高。這個乘法卡片不會幫忙做,但決定一台機器能撐多少併發,靠的正是這個數字,不是那個漂亮的「890 bytes」。
45T token 從頭訓練,reasoning effort 是另一個維度的旋鈕
KV 快取決定的是跑起來要付多少記憶體,跟它平行的另一條線,是模型怎麼被練出來的。卡片寫的是這個模型從頭訓練,拿的是一個 45T token 的多模態語料,不是延續前代權重微調。訓練細節也交代得具體:稀疏注意力先在 64K 這個序列長度上練,前 34T token 都停在這個長度,稀疏注意力該怎麼選、選得準不準,是在 64K 這個尺度上學出來的;之後才把 context 硬拉到 1M。1M 是訓練長度之外的外推,不是原生訓練出來的長度,卡片沒有給外推後的準確度數字。合理的推測是,從頭訓練這個選擇,讓 CSA2 與 SWA Bounded Replay 這類新的注意力機制,能從訓練一開始就參與模型學習的過程,而不是訓練完才後補上去的元件——但卡片沒有直接這樣說,這是延伸的解讀。
另一個獨立的旋鈕是 reasoning effort。卡片講的是模型支援一個連續可調的整數刻度,從 1 到 100,拿推論成本換準確度——不是常見的「低、中、高」三檔開關,是一整條連續的刻度。卡片也註明了跑分測試用的設定:所有公開的 instruct 成績,都是把這個旋鈕轉到 100 才跑出來的。旋鈕轉低之後準確度掉多少、換回多少推論成本,卡片沒有給任何一組對照數字。
拖動滑桿感受 1 到 100 的連續刻度 · 每格都是不同設定
刻度本身沒有形狀——長條的長度就是設定值,不代表任何實際算力或 token 數的比例。中檔(34 到 66):同樣沒有對照數字——公開的成績只跑在滿檔(reasoning_effort=100)。
這裡刻意不畫一條「成本 vs 準確度」曲線——卡片沒有公開對應函式,畫出來就是編造出來的曲線
reasoning effort 是 1 到 100 的連續刻度,公開的 instruct 成績全部跑在滿檔 100,中間檔位卡片沒有給對照數字。
對接 API 的人來說,一個整數刻度比三檔開關麻煩,也比三檔開關誠實——三檔開關逼你在「快」跟「準」之間選一邊,連續刻度理論上讓你按每一類請求各自的延遲預算去調,付多少成本、換多少準確度,自己決定要在哪一點停。代價是卡片沒有給任何一個中間點的成績,這個決定目前只能靠自己拿實際流量去測,不是照著官方數字表挑一個檔位。
授權這件事,卡片交代得乾脆——整個 repository 跟權重,都是 MIT 授權,沒有另外掛使用限制條款。MIT 授權的重點在於幾乎沒有限制:可以商用、可以修改、可以重新散布,唯一要求是保留原始授權聲明。對評估要不要採用這個模型的團隊來說,授權這一關至少不會卡關,剩下要決定的都是前面幾節那些工程代價。
能拿來對照的帳:卡片給的每一個記憶體數字,都能拆成省了什麼計算、換了什麼代價兩欄——CSA2 省的是重算,換的是數值精度;SWA Bounded Replay 省的是常駐空間,換的是每次要用都重新跑一次的局部注意力;四分之一跟八分之一兩個比例分開看才準,疊乘只會算錯。n_win 的實際數值、重放的延遲成本、量化造成的準確度損失——這三個缺口,大概要等社群自己拿真實流量測出來,卡片本身不會回答。