L 排程
功能
在單次 decode 呼叫中,逐 token 變化 loop 深度。前 N 個 token 以淺深度執行(便宜的 warmup),後續 token 以完整深度執行(品質輸出)。
運作方式
實作位於 generate_stream 的 decode loop 中。每次 decode 步驟前,有效 loop 次數根據步驟索引設定:
step_loops = (step < warmup_tokens) ? warmup_L : n_loops
KV cache 自然處理可變 L — 以 L=2 寫入的位置只填充 cache 層 0-3(2 pre + 2 loop),而以 L=8 寫入的位置填充層 0-9。
量測
H100 / 2B INT4,64-token decode:
| 設定 | warmup token 耗時 | 完整 token 耗時 |
|---|---|---|
| L=2 | ~1.7 ms | — |
| L=8 | — | ~6.2 ms |
| L 排程(16 warmup L=2,其餘 L=8) | ~1.7 ms | ~6.2 ms |
Warmup token 比完整深度 token 快 ~3.3×。
用法
tinyloop model.tinyloop generate --loops 8 \
--l-warmup-tokens 16 --l-warmup-L 2 \
--prompt "..." --max-tokens 64
model.generate(prompt, loops=8,
l_warmup_tokens=16, l_warmup_L=2)
為何僅 looped
標準 transformer 有固定的層數 — 每個 token 都必須跑完所有層。在 looped transformer 中,深度是 runtime 參數,相同權重可在任意深度使用,因此可以在不改模型的情況下逐 token 調整計算量。