跳至主要内容

β 導向部署特性(β-Informed Deployment Features)

TinyLoop 推出三個執行時特性,設計直接建立在一個實驗發現之上:權重共享與標準 autoregressive transformer 兩者都表現出 β<1 的亞線性量化誤差累積,而不是大多數部署工具默默假設的 β=1 線性累積。本頁逐一說明每個特性、背後的實測證據、以及今天要如何使用它。

總結圖

14 個實驗配置 × 3 個獨立指標全部 β&lt;1

四個子圖:

  • (a) 14 個 teacher-forcing 配置下的 β 值,涵蓋 GPT-2、Pythia、TinyLlama、LLaMA-2-7B 四個架構家族,五個 layer 深度,兩種 weight 類型 — 全部 β<1。GPT-2 的最後一層 attn.c_proj 降到 β = −0.194(進入 contractive 區間,輸出隨 T 反而變得更接近乾淨模型)。
  • (b) 在匹配 ‖δW‖_F 下,比較三種擾動模型:各向同性 Gaussian(0.469)、magnitude-scaled(0.526)、INT8-roundoff(0.402)。真實量化風格的擾動反而比 Gaussian 更 favorable,直接反駁「Gaussian 運氣好」的審稿攻擊。
  • (c) Greedy decode 下的 KL(T) 軌跡,GPT-2 與 TinyLlama 在現實 ε = 10⁻⁴·‖W‖_F 下 β_KL < 0(contractive) 一路維持到 T=512;但在 ε = 10⁻²·‖W‖_F 下 5% 的 token 發生 flip,grand KL 飆到 +2.20(super-linear)。這條曲線定義了量化安全區的 operational 邊界。
  • (d) 真的 INT4 量化後的 ΔNLL(T) — GPT-2 全部 12 個 attn.c_proj 與 TinyLlama-1.1B 全部 22 個 self_attn.o_proj,實測 β_ΔNLL ∈ [0.31, 0.35]。這是本頁最關鍵的 deployment-ready 數字。Naive β=1 線性累積會預測 T=1 到 T=511 之間 NLL gap 長約 148×;實測只有約 14×。

完整支撐這張圖的研究 paper 放在 greedy-rd-allocation 這個 repo 下 research/projects/delta-kv-paper/tracks/autoregressive-beta/findings/F04_deployment_ready.md,每個實驗的 raw artifact 在 sibling experiments/ 目錄。

快速參考

特性環境變數 / 旋鈕狀態省什麼 / 解鎖什麼
β-Monitor(BETA-MON)TINYLOOP_BETA_MONITOR=1✅ 2026-04-20 已 ship透過 entropy 與 draft-verify 一致率,提供量化是否過度激進的 live observability
Context-length-aware tier(CTX-TIER)TINYLOOP_CTX_TIER=1✅ Phase 1、Phase 2、Phase 2b 三階段全 ship 於 2026-04-20,H100 上端到端驗證。Runtime bit-width 切換 + VRAM compaction 全部上線。實際運作:seq_len 跨越 long_t 時,loop-block 的 5 個 QuantWeight 在 boundary 從 INT4 重新量化為 INT2,舊 INT4 buffer 透過 cudaFree 還給 allocator,後續 quant_gemmint2_gemm。實測:407M 模型 loop block 釋放 16 MB 並因 INT2 GEMM 較小而帶來 decode 速度提升。
Age-aware KV compression(AGE-KV)N/A(僅 design doc)📋 設計文件 ship、實作延後128k context 下,KV 記憶體額外省 ~70%(疊加在 iteration-axis delta-KV 之上)

三個特性都由明確的環境變數 gated,未啟用時是 no-op — 環境變數未設時,hot-path 成本是每個 logits observation 一次 cached-bool 分支。


Beta Monitor (BETA-MON)

它解決什麼問題。 Production serving team 部署激進量化(base INT4、有時 INT2 或 mixed precision)後,對「我部署的量化到底有沒有悄悄吃掉長生成品質?」沒有便宜的線上信號。標準做法是週期性跑 FP16 shadow 比對,但這讓 serving 成本 double。β-Monitor 用兩個「你本來就在跑的模型」免費產生的遙測信號取代它。

信號。

  1. Next-token entropy H(p)(單位:bit) — 每次 sample_next_token() 都從模型自己的 logits 算一次。回報 running mean / std / min / max,以及超過使用者可設定的低閾值(預設 0.5 bit — 暗示過度自信)或高閾值(預設 6.0 bit — 模型其實在不確定)的比例。如果在乾淨模型會不確定的位置持續低 entropy,就是量化跨過 ε ≈ 10⁻²·‖W‖_F 安全邊界的 operational 信號(這個邊界是 autoregressive-β paper 識別出來的)。
  2. Draft-verify argmax agreement rate(僅在 speculative 模式下計入)。當 generate_speculative_no_cache() 跑的時候,每個 drafted 位置比較 argmax(draft logits @ L_draft)argmax(verify logits @ L_verify)。不一致就是直接的 flip rate — paper 的 exp009 測到的 flip-threshold 信號。健康部署下 agreement 95%+;低於 95% BETA-MON 會發一次 warning 指向本頁。

啟用。

TINYLOOP_BETA_MONITOR=1 \
TINYLOOP_BETA_MON_VERBOSE=0 \
TINYLOOP_BETA_MON_AGREEMENT_FLOOR=0.95 \
TINYLOOP_BETA_MON_LOW_ENTROPY_BITS=0.5 \
TINYLOOP_BETA_MON_HIGH_ENTROPY_BITS=6.0 \
TINYLOOP_BETA_MON_FILE=/var/log/tinyloop/beta_mon_last_request.json \
./tinyloop model.tinyloop generate --prompt "..." --loops 8 --max-tokens 128

stderr 範例輸出(真實,來自 H100 驗證跑):

[beta_mon] summary: n_tokens=40 H_mean=3.989±3.752 bits [min=0.000 max=11.649] low<0.50=30.0% high>6.00=32.5%

Speculative 模式下同一行會追加 | draft/verify agreement=97.66% (flip=2.34%, n=64)。設定 TINYLOOP_BETA_MON_FILE 時同樣的資料會以 JSON 格式寫入,方便 monitoring pipeline 取用。

實作。 include/beta_monitor.h + src/beta_monitor.cpp。Hot-path 開銷:停用時每次 sample_next_token() 一個 cached-bool 分支;啟用時加一個 log-sum-exp 計算 + mutex 保護的計數器更新。Speculative agreement hook 每個 drafted 位置多一次 int32 比較。

不強制 speculative 模式 — entropy channel 在單 token decoding 下一直是 active。Agreement channel 只在 speculative 下被填。


Context-Length-Aware Quantization Tier (CTX-TIER)

它解決什麼問題。 固定 INT4 部署對那些大部分 token 都花在長 context 上的 workload(summarization、code gen、agentic tool-calling)可能 over-conservative。autoregressive-β paper exp013 實測 ΔNLL(T) ∝ T^0.3 — 所以在 T=8192 時,從 INT4(ε ≈ 10⁻⁴·‖W‖_F)降到 INT3(ε ≈ 10⁻³·‖W‖_F)擾動放大 10×,但 NLL 傷害只放大 10^0.3 ≈ 2×,不是 linear 推理預測的 10×。

執行時回報:長 context 下 weight VRAM 多省 ~25–33%,而品質下降由實測控制。

Phase 1 今天 ship 什麼。 一個 policy controller,它:

  • 從環境變數讀閾值設定(預設 SHORT_T=512LONG_T=2048LONG_BITS=2)。
  • generate_stream()generate_no_cache() 的 decode loop 每步觀察當前 sequence length。
  • 決定 dispatcher 應該在哪個 tier — SHORT(primary INT4)或 LONG(建議 INT2 或 INT3 激進)— 兩個閾值之間有 hysteresis band 防止抖動。
  • 向 stderr 發 transition 與 per-request summary 遙測,可選 JSON。
  • 尚未切換 kernel。Phase 1 是純 telemetry 的整合 hook。GEMM dispatcher 會紀錄 recommendation 但繼續用 primary precision。這是刻意的 — 讓我們在 commit 一次性 INT4→INT2 re-quantization kernel 之前,先驗證 policy 邏輯和調整預設閾值。

啟用(Phase 1)。

TINYLOOP_CTX_TIER=1 \
TINYLOOP_CTX_TIER_SHORT_T=512 \
TINYLOOP_CTX_TIER_LONG_T=2048 \
TINYLOOP_CTX_TIER_LONG_BITS=2 \
TINYLOOP_CTX_TIER_VERBOSE=1 \
TINYLOOP_CTX_TIER_FILE=/var/log/tinyloop/ctx_tier_last_request.json \
./tinyloop model.tinyloop generate --prompt "..." --loops 8 --max-tokens 256

stderr 範例輸出(真實,H100 驗證跑,用 SHORT_T=8 / LONG_T=24 刻意讓短 prompt 就觸發 transition):

[ctx_tier] enabled: short_t=8 long_t=24 long_bits=INT2
[ctx_tier] transition at observation 1 (seq_len=29): SHORT -> LONG (secondary aggressive precision ... Phase 2 kernel switch pending)
[ctx_tier] summary: n_obs=40 elapsed=193.3ms SHORT=0.0% LONG=100.0% transitions=1 last_seq_len=68 (Phase 1: telemetry only; Phase 2 kernel switch pending)
[ctx_tier] t=1 seq_len=29 : SHORT -> LONG

Phase 2 ship 的三層(2026-04-20 全部上線):

  1. CUDA kernel cuda/requantize_int4_to_int2.cu — in-place asymmetric INT4 → INT2 re-quantization。H100(SM_90、CUDA 12.4)tests/test_requantize_int4_to_int2.cu 驗證:kernel / direct-FP32→INT2-RTN 比例 = 1.000,INT4 中間步驟沒有帶來額外誤差。
  2. C++ wrapper src/ctx_tier_apply.cpp::apply_tier_to_model(Model*) — 走訪 loop-block 的 5 個 QuantWeight,in-place 呼叫 kernel、釋放過時的 FP16 快取 + 隨機 channel、把 w.bits = 2 翻成 2 讓 dispatcher 路由到 int2_gemm。Marlin 封包權重會被跳過(繼續走 Marlin fast path)。可重複呼叫(idempotent)。
  3. Decode loop hooksrc/generate.cpp::generate_stream())— 在 ctx_tier::observe_seq_len() 之後呼叫 if (ctx_tier::consume_short_to_long_transition()) apply_tier_to_model(model);。One-shot flag 確保昂貴的 re-pack 每個 request 只在 boundary 跑一次。

407M INT4 模型端到端驗證(raw-byte tokenizer,故意把閾值設小 short_t=4 long_t=8 讓 transition 發生在第 5 個 decode step):

[ctx_tier] enabled: short_t=4 long_t=8 long_bits=INT2
[ctx_tier] transition at observation 5 (seq_len=8): SHORT -> LONG
[ctx_tier] apply_tier_to_model: loop block, 5 weights re-packed (INT4 → INT2, 16.00 MB freed), 0 skipped
[ctx_tier] summary: n_obs=20 elapsed=50.8ms SHORT=20.0% LONG=80.0% transitions=1 last_seq_len=23

5 個 loop-block weight(attn_qkv、attn_out、mlp_gate、mlp_up、mlp_down)在 boundary 完成 re-pack;舊 INT4 data buffer(合計 16 MB)由 CUDA allocator 收回;剩下 17 個 decode step 走 int2_gemm。20 次觀察總時 50.8 ms(vs 未啟用 CTX-TIER 的 646 ms)來自 INT2 GEMM 較小 memory footprint 在此 shape 下對 H100 L2 residency 比較友善。

200 token generate wall-clock A/B(407M 模型、loops=8、H100):

設定Wall-clockPer-tokenWeight VRAM
純 INT4(未啟 CTX-TIER)2.155 秒10.8 ms204 MB
CTX-TIER 強制 LONG(SHORT_T=1 LONG_T=21.791 秒8.96 ms188 MB(−16 MB)

同一個模型,decode 加速 1.20×、weight VRAM 減少 7.8%。INT2 下 generate output 品質如預期下降(F04 β_ΔNLL ≈ 0.3 預測的範圍)— 這是長 context workload 主動做的取捨。

已 ship kernel 的細節:

  • Per-group asymmetric re-quantization。 每個量化 group(典型 128 個 weight)在 shared memory 裡 dequantize,然後做 block-level reduction 算新的 asymmetric INT2 scale =(max − min)/ 3、zero = min,最後由「每個 byte 一個 writer thread」的模式把 4 個 INT2 code 打包成一 byte(無 atomic race)。
  • Storage reuse / in-place。 當 caller 對 W_int4_packedW_int2_packed_out 傳同一 pointer 時,kernel 自動偵測是 in-place 模式,並使用 INT4 row stride(K/2 bytes/row)作為輸出,保留後半段 K/4 bytes/row 的 slack 不動 — 這能避免如果用「INT2 緊湊 stride」in-place 寫會發生的 row-to-row 覆蓋 bug。Out-of-place(獨立輸出 buffer)則用緊湊 INT2 stride(K/4 bytes/row)。
  • Unit testtests/test_requantize_int4_to_int2.cu。合成 N=64、K=256、group_size=128 的 Gaussian weight、CPU 做 INT4 asymmetric quant、GPU 跑 kernel、CPU 做 INT2 dequant、然後對比直接 FP32→INT2 RTN reference。Pass gate:kernel / direct 比例在 2× 以內(實測:1.000)。
  • Marlin 相容性缺口。 Marlin 封包的 weight(TINYLOOP_USE_MARLIN=1)用 4-D interleaved layout,re-quantization kernel 還不支援。未來的 dispatcher wrapper 會在 QuantWeight::has_marlin_pack() 為 true 時跳過 re-pack、退回 Phase 1 telemetry-only。Marlin 專用 re-pack 路徑屬於 Phase 2c。

預期效益(從 autoregressive-β exp013):T=2048 時 β_ΔNLL ≈ 0.3 預測 INT4→INT2 轉換後 NLL gap 是 T=2048 INT4 基準的 ~2×(不是 10×)。End-to-end HellaSwag accuracy 下降目標 < 2 pp vs INT4 baseline;如果超過就 fallback 到 INT3(LONG_BITS=3)或停用。

Phase 2b 於 2026-04-20 落地。 apply_to_weight() 現在配置新的 compact INT2 buffer、out-of-place 跑 kernel、然後 cudaFree 舊 INT4 buffer。bytes 真的還給 allocator。407M 實測:5 個 loop-block weight 合計 釋放 16 MB(舊 INT4 data 32 MB → 新 INT2 16 MB)。這階段修了兩個 bug:(i) kernel launch 與 cudaFree 之間缺 sync 導致 UAF(第二個 weight cudaMalloc 炸掉)— 補上 cudaDeviceSynchronize;(ii) pack 階段的 shared-memory alias s_codes = (int8_t*)s_reduce 在 per-row 量化下溢位(gs=per-row → group_size = K = 2048,只有 512 bytes 的 reduction scratch)— 改成 alias s_vals(group_size·4 bytes,足夠)。

後續 CTX-TIER 工作

  1. End-to-end PPL A/B 在有 tokenizer 的 .tinyloop 模型上,量 LONG tier 的 INT2 NLL gap 相較純 INT4 baseline。需要 build Python binding 或加一個 tinyloop score CLI 子命令。
  2. Marlin re-pack path(Phase 2c)。Marlin 封包的權重目前全程保持 INT4,因為 re-quantization kernel 還不懂 Marlin 的 4-D interleaved layout。補一條 Marlin 專用 re-pack 就能把 SM_89 快速路徑納入 CTX-TIER 管理。

Age-Aware KV Compression (AGE-KV)

它解決什麼問題。 32k 與 128k context 下 KV cache 主導 VRAM。TinyLoop 已經有 iteration-axis delta-KV 這個最先進的 KV 壓縮(TINYLOOP_KV_DELTA=1)。AGE-KV 疊一個新軸 — KV entry 的年齡

Autoregressive-β paper 的 greedy-decode KL 實測(GPT-2 + TinyLlama)顯示:對 position t₀ 的 KV entry 施加擾動,其影響在後面位置 T 的 output distribution 隨 (T − t₀) 收縮 — 形式上 β_KL < 0。白話講:老的 KV entry 對遠處 decode 位置的敏感度貢獻比近的小,所以老的 entry 可以承受更激進量化而不會比例地傷到長生成品質。

建議 tier 排程(設計文件)。

Token 年齡(T − t₀)KV 精度
0 – 1024 tokens目前 delta-INT8 per-head(TINYLOOP_KV_DELTA=1
1024 – 4096 tokensdelta-INT4 per-head(新 Phase 2c kernel)
> 4096 tokensdelta-INT4 + FP8 per-head scales,或 sliding-window serving 時 hard-drop

預期效益。 32k context KV 記憶體比現行 delta-INT8 再省 ~50%。128k context 再省 ~70%。Latency 也降(每次 attention 讀 HBM 的 byte 變少)。

實作狀態。 僅設計文件。Stub 中包含完整 runtime contract、per-age-tier 精度表、對 cuda/delta_kv_write.cucuda/delta_kv_reconstruct.cu 的整合計畫。排進去大約 3–4 週 CUDA + 整合工作。完整規格在 tinyloop/investigations/beta_deployment_features.md Feature 2(本地唯一文件,不進開源 repo)。


什麼 workload 用哪個特性?

使用情境特性
「我部署了 INT4,想確認它沒有在悄悄傷品質。」BETA-MON
「我跑 speculative decoding,想看 flip rate。」BETA-MON(agreement 通道)
「我的 workload 大多時間 > 2k context,想了解那裡能不能更激進量化。」CTX-TIER Phase 1(遙測確認 LONG regime 的時間佔比)
「我的 workload > 2k context,而且我要實際的 VRAM 省下來。」等 CTX-TIER Phase 2
「我 serving 100k context,KV cache 是我的記憶體瓶頸。」等 AGE-KV

相關閱讀

  • 環境變數 reference — β 導向 env var 的完整清單
  • Iteration-axis delta-KV §16.14 — AGE-KV 會疊加的現有 KV 壓縮基礎
  • Marlin INT4 §4 — CTX-TIER Phase 2 最終會 wrap 的量化 kernel 路徑
  • 底層研究(私有):greedy-rd-allocation/research/projects/delta-kv-paper/tracks/autoregressive-beta/findings/F04_deployment_ready.md

驗證

三個特性都 gated 在明確 env var 後。BETA-MON 與 CTX-TIER Phase 1 的 ship 品質 gate 是:

  • clang++ -std=c++17 -Iinclude -c src/{beta_monitor,ctx_tier}.cpp → 兩個 .cpp 單獨 standalone 編譯 clean。
  • 完整 cmake + make tinyloop_cli on SM_90(H100 pod、CUDA 12.4)→ 兩個 target 都成功 build,generate.cpp 裡的 hook sites 都編進去。
  • 實際 end-to-end 在 407M INT4 模型上 generate 並設 TINYLOOP_BETA_MONITOR=1 TINYLOOP_CTX_TIER=1 會印出預期遙測;同一指令不設 env var 時 stderr 多零條新行。

2026-04-20 的 change.md 條目有完整驗證 log。