文件導航

Laya MLX 能快十倍嗎?一次數學調查

研究日期:2026-09-19。基線:Apple M3 Max(40 個 GPU 核心、128 GiB 統一記憶體)上已提交的 FP16 MLX 結果。本報告區分代數事實、靜態成本估計、選定 checkpoint 矩陣的 CPU 測量,以及需要推理實驗的假設。這次數學調查沒有執行任何 GPU 推理或新的延遲測量。配套的工程調查在有候選計時時會給出它們。這裡的「精確」指保留數學依賴關係和實數算術函式;不同的 GPU 歸約順序或 kernel 仍可能改變浮點結果,所以現有的數值容差和已暴露輸出的契約仍是驗收門檻。

結論: 在保留這些 checkpoint 及其完整輸出的前提下,不要為「靠手寫 kernel 獲得普遍的 10× 端到端改進」做預算。精確的區域性注意力和輸出裁剪是值得做但有界的改進。直接的秩分解在四個抽樣的權重矩陣上遠不算無損。對於一個有大量精確重複的工作負載,或者作為顯著更小的蒸餾/重構模型的目標,10× 的產品改進是可信的。這些是不同的承諾,必須用不同的基準衡量。

1. 快十倍實際需要什麼

下面是現有的同步、熱態端到端中位數,包含準備和格式化;它們不是新的測量。每個基線使用五次預熱、50 次計時迭代和 64 的問題批上限。一個短 50 問題固定樣本重複三個問題定義;它的原始執行時仍會求值全部 50 個。下載、載入和編譯時間在這些中位數之外。

模型 短 1:基線 → 10× 目標 短 10 短 50 長 1 長 10
Laya 13.421 → 1.342 ms 71.068 → 7.107 ms 336.030 → 33.603 ms 44.927 → 4.493 ms 420.987 → 42.099 ms
Multilingual 7.390 → 0.739 ms 27.386 → 2.739 ms 127.565 → 12.756 ms 37.635 → 3.763 ms 389.487 → 38.949 ms
Typed decisions 13.712 → 1.371 ms 75.618 → 7.562 ms 380.560 → 38.056 ms 99.233 → 9.923 ms 1000.294 → 100.029 ms

來源:Laya FP16、multilingual FP16、typed-decisions FP16。短輸入填充長度是 93/91/93;長長度是 512/1024/1024。比較它們的長行並沒有保持 token 長度不變。目標是相對於原生 MLX FP16 的進一步改進,而不是相對於 PyTorch MPS FP32。

對任何提出的最佳化,設 f 為它實測佔端到端真即時間的比例,s 為它自身的加速。Amdahl 定律給出:

whole-request speedup = 1 / (1 - f + f/s)
10× requires f > 0.9 and s >= f / (f - 0.9)

即使加速一個佔據請求時間 95% 的熱點,也需要 19× 的熱點改進。在 98% 時仍需要 12.25×;99% 時需要 11×。任何未被觸及、且至少消耗 10% 的準備、輸出轉換或同步,都會讓僅靠其餘部分無法獲得有限的 10× 收益。獨立的前向和端到端中位數不能相減來估計那個比例;要使用分段計時實驗或剖析。

2. 稠密工作與條件下界

從 model.py 出發,定義隱藏寬度 D、編碼器 MLP 寬度 I、編碼器深度 N、頭深度 H、批大小 B 和填充後的 token 長度 L。把一次乘法和一次加法計為兩個 FLOPs:

A = N * (4 D² + 3 D I) + H * 12 D²
main dense FLOPs = 2 B L A
current dense attention products = 4 B (N + H) L² D

3DI 包含帶門控編碼器 MLP 的兩個分支及其輸出投影。頭部的 MLP 使用一個不同的、常規的 4D 展開。這些公式排除歸一化、啟用、評分、掩碼、傳輸和排程;它們是一個常規稠密實現的開銷模型,不是對所有可能演算法的無條件算術下界。

系列 D / I / N / H 主要稠密權重 A 編碼器 MLP 佔 A 的比例 A 的 FP16 位元組數
Laya / typed decisions 1024 / 2624 / 28 / 2 368,312,320 61.28% 736,624,640
Multilingual 768 / 1152 / 22 / 2 124,452,864 46.92% 248,905,728

multilingual 嵌入有 196,608,000 個權重,但推理只收集選中的行,而不是與整個詞表相乘。因此,總 checkpoint 參數量誇大了它相對於英文的逐 token 工作量。更小的嵌入檔案不會自動帶來更快的推理。

模型 / 形狀 稠密 + 稠密注意力工作 10× 目標所需的有效吞吐
Laya, B=1 L=93 69.57 GFLOPs 51.84 TFLOP/s
Laya, B=50 L=93 3478.44 GFLOPs 103.52 TFLOP/s
Laya, B=1 L=512 409.36 GFLOPs 91.12 TFLOP/s
Multilingual, B=1 L=91 23.26 GFLOPs 31.48 TFLOP/s
Multilingual, B=50 L=91 1163.05 GFLOPs 91.17 TFLOP/s
Multilingual, B=1 L=1024 332.19 GFLOPs 88.27 TFLOP/s
Typed decisions, B=1 L=1024 883.15 GFLOPs 89.00 TFLOP/s

這些是要求,不是聲稱的 Apple GPU 峰值。在這些形狀上實測的稠密 GEMM 上限才是有用的工程比較。一個實測的上限可以讓一個專案顯得不可行;它仍然不是硬體上界的證明。由於 CPU 工作也落在目標之內,如果 CPU 工作不與 GPU 重疊,實際的 GPU 執行必須比這張表允許的更快完成。

Apple 為這個 40 核心的 M3 Max 配置標明 400 GB/s 的統一記憶體頻寬。在「主要的 FP16 矩陣權重每次請求從統一記憶體讀取一次、且尚未保留在片上快取中」這一顯式假設下,理想的流式下界是英文/typed 的 1.842 ms 和 multilingual 的 0.622 ms。這些忽略了啟用、嵌入、評分器權重和全部計算。它們還假定標稱的聚合頻寬完全可用於這個工作負載。Apple 技術規格。

英文短單問題的目標 1.342/1.371 ms 已經低於那條常規的 FP16 流式下界。要在不改變權重儲存的情況下於 400 GB/s 下滿足這些目標,大約需要 200/188 MB 的計入權重避免記憶體讀取,或者對執行假設做另一處更改。本報告不假定也不臆造任何片上快取容量。跨批的權重複用、精確壓縮和替代演算法會改變這個下界;這一觀察不是一個普遍的不可能性定理。

僅就稠密部分而言,理想的僅權重算術強度在 FP16 下是 BL FLOPs/byte:B=1 L=93 時為 93,B=50 時為 4650。啟用流量會降低這些數字。這解釋了為什麼隨著共享每個矩陣的 token 數量增加,權重壓縮成為一種越來越沒有說服力的吞吐策略。

3. 到底能移除多少精確工作?

第一個全域性編碼器層讓每一個合法 token 都可能相關,而兩個決策頭層都是全域性的。一個 token 不出現在最終輸出裡,並不意味著它的中間表示可以省掉:後續的 query 仍把它當作 key/value 使用。

精確的例外是最後一個頭層。為所有合法 token 計算它的 K/V,只為 CLS 和選項標記計算 Q,並且只在那些選定位置計算它的輸出投影/MLP。前一個頭和完整的編碼器仍必須產生所有合法 token 狀態。這是依賴裁剪,不是移除注意力頭。在包含 CLS 的 R=5 個選定位置下,當把 Q 從融合的 QKV 投影中拆出時,它的最大稠密節省是 20 B (L-R) D² FLOPs,外加 4 B L (L-R) D 的注意力 FLOPs。保留融合的 QKV 投影更簡單,但節省更少。

區域性編碼器注意力允許 abs(q_position-k_position) <= 64,即一個包含端點的 129 位置內部視窗。L>64 時合法區域性對的數量是 129L - 64*65。如果保留填充和位置,跳過被禁止的 K/V tile 在數學上是精確的。在稠密 QK 乘法之後施加掩碼並不會實現那種算術節省。

模型 / 長度 attention 乘積佔建模 FLOPs 總量的比例 精確區域性視窗節省 末頭選擇節省,R=5 合併節省
Laya, 93 1.53% 0.086% 2.701% 2.787%
Laya, 512 7.87% 3.607% 2.857% 6.464%
Typed decisions, 1024 14.59% 7.686% 2.904% 10.589%
Multilingual, 91 2.62% 0.130% 4.465% 4.595%
Multilingual, 1024 23.27% 11.919% 4.584% 16.503%

這些是建模工作的削減,不是延遲預測。它們留下 83.5–97.2% 的建模工作不變,離 10% 的預算很遠。即使讓所有 attention 乘積免費,在這裡也只移除 1.53–23.27%。反過來,在相同 FLOP 效率下,假想地把每一個稠密投影加速 10×、同時保持 attention 不變,對英文短輸入只給出 8.79×,對 multilingual 長輸入只給出 3.23×。在應用 Amdahl 之前,真實的剖析必須用實測的時間比例取代這些算術比例。

執行時已經呼叫 MLX 的快速 SDPA。FlashAttention 用更少的中間記憶體流量計算相同的稠密 softmax 注意力函式;它的分塊並不會讓任意的全域性注意力在 token 數量上變成線性。利用 checkpoint 現有的區域性掩碼是精確的,而對它的全域性層施加新的稀疏性會改變模型。QKᵀ 的低秩並不意味著逐元素指數化和行歸一化之後仍然低秩。FlashAttention 論文、MLX 注意力 API。

在保持獨立序列、原始位置和輸出順序的情況下,去填充也是精確的。當前的短 50 問題固定樣本對英文/typed 只浪費 8.9%、對 multilingual 只浪費 5.8% 的填充 token。這些固定樣本無法從移除填充中獲得 10×。一個包含一個 1024 token 項和 49 個 64 token 項的不同工作負載會浪費足夠多的填充,達到 12.3× 的 token 工作比;那會是一個特定於該分佈的排程結果。

4. 低秩分解能揭示隱藏的 10× 捷徑嗎?

對一個形狀為 m × n 的凍結矩陣 W,把它替換為兩個因子 U(m × r) 和 V(r × n),會把逐 token 的乘法成本從 mn 變成 r(m+n)。盈虧平衡要求 r < mn/(m+n);10× 的矩陣工作削減要求:

r <= mn / (10(m+n))
best squared Frobenius residual at rank r = sum_{j>r} sigma_j²

第二個表示式是截斷 SVD 的最優值。一個 1024 寬的正方形投影至多需要秩 51;它的精確滿秩分解反而使乘法數量翻倍。GELU、門控、softmax 和依賴輸入的 LayerNorm 使得無法簡單地把相鄰層的權重乘成一個常量矩陣。

我用一個 CPU float64 Gram 特徵求解器檢查了四個顯式選定的中間層矩陣,每個模型系列各取一個注意力輸出矩陣和一個融合 MLP 輸入矩陣。最大的特徵系統是 1024×1024;所有請求的 BLAS 執行緒上限都設為一,沒有匯入任何 GPU 庫,也沒有執行任何模型前向。這些是所選矩陣的完整譜,不是隨機投影估計,也不是對每一層的普查。

樣本矩陣 形狀 10× 矩陣工作削減的最大秩 該秩下保留的平方 Frobenius 能量 最佳相對 Frobenius 誤差 保留 99% 能量的秩
Laya 第 14 層 attention Wo 1024×1024 51 28.66% 84.46% 690
Laya 第 14 層 MLP Wi 5248×1024 85 29.29% 84.09% 956
Multilingual 第 11 層 attention Wo 768×768 38 24.97% 86.62% 516
Multilingual 第 11 層 MLP Wi 2304×768 57 32.88% 81.93% 697

原始測量、所選矩陣的 SHA-256、奇異值極值、穩定秩和額外的候選秩都在 math_spectrum.json 中。每個抽樣矩陣在數值上都是滿秩的。在四個當中,保留 99% 的平方 Frobenius 能量所需的秩都高於雙因子算術的盈虧平衡點。multilingual 的 MLP Wi 穩定秩只有 13.29,然而秩 57 只保留總能量的 32.88%:穩定秩並不是實現小重建誤差所需的維度。

這是反對把樸素的僅權重 SVD 當作近似無損捷徑的有力證據。它並不證明每一個低秩模型的任務準確率都很差:token 啟用可能佔據一個受限的分佈,而重訓練可以把有用的計算移進一個更小的表示。啟用感知的壓縮應當最小化以實際輸入協方差加權的誤差,近似為 ||(W-Wr) Sigma_x^(1/2)||F,然後測試端到端質量。四矩陣分析沒有估計那些協方差、全域性的 logit 誤差界,或全模型可達的加速。一個低秩微調增量也不意味著凍結的預訓練矩陣本身可以被丟棄。

手寫的快速矩陣乘法並不能推翻這個證據。作為一個算術示例,用七乘積的塊遞迴代替八乘積,每一層只節省 12.5% 的乘法工作,還要加上額外的矩陣加法和流量;即使十個理想層也只產生約 3.8× 更少的乘法。把深遞迴應用到 768–1024 寬的投影上不是一個可信的 10× 延遲方案,尤其是面對已經分塊的 GPU GEMM 時。這並不是聲稱所有可能的精確演算法都已被排除。

5. 量化、裁剪和提前退出會改變契約

僅權重量化。 對組大小 64、帶 FP16 scale 和 offset 的仿射組,每個矩陣參數的儲存位元組數約為 bits/8 + 4/64。相對於 FP16,這給出理想的矩陣儲存削減:8-bit 時 1.88×、4-bit 時 3.56×、2-bit 時 6.40×。這些不是計算削減或真即時間收益。僅靠這個機制把權重流量降到十分之一,大約需要每個權重一個 bit 外加後設資料,那是一種截然不同的近似。現有的 norm/embedding/head 張量和解碼開銷會進一步削減整個請求的收益。MLX quantize 文件、quantized matmul 文件。

如果權重流量佔主導,量化在 B=1 時可能有用,但它不必加速一個大型 token GEMM。它會改變 logits、score 期望、熵置信度和動作機率。公開 API 暴露了所有這些,所以僅憑 argmax 一致是不夠的。如果每個最終 logit 的變化至多為 epsilon,那麼大於 2*epsilon 的 top-two logit 間距就能保證獲勝標籤,但不能保證機率、score 或動作一致。溫度校準會用它的溫度去除 logit 誤差;一個很小的溫度可能放大看似很小的原始誤差。現有 checkpoint 含有接近 0.1006 的選項數量溫度桶,這讓這一點變得相關。

Token 裁剪。 在寬度/深度和稠密計算效率不變的情況下,一個近似的 10× 稠密工作目標需要跨層保留約 10% 的 token 處理,而不是去掉幾個標點 token。在處理了原始深度的比例 a 之後裁剪,稠密工作比是 a + (1-a)rho,其中 rho 是後續層保留的 token 比例。如果 a >= 0.1,在那個簡化模型裡即使丟棄每一個剩餘 token 也無法得到超過 10×。在這個模型裡,第一個全域性層已經把每個 state token 連線到所有未掩碼的問題/選項 token。學習式的 token 重要性和動態裁剪可以研究,但它們的正確性是一個需要訓練/校準的任務質量主張。被丟棄的 token 可能包含否定、罕見實體,或決定一個接近選項的事實;早期注意力低並不能證明它在後續層不相關。

提前退出。 簡單地把第 3 層隱藏狀態餵給一個在第 28 層之後訓練的頭,並不會保持它的輸入分佈。必須訓練中間頭和一條經過驗證的置信度規則。一個 10× 均勻成本深度預算對英文約是 2.8 個編碼器層、對 multilingual 約是 2.2 個,這還沒算頭和 CPU 開銷。保留完整的當前頭會讓短序列的稠密預算更緊:僅它的兩層就佔英文/multilingual A 的 6.83%/11.37%。對 multilingual 來說,僅這個頭就超過了整個 10% 的稠密工作預算。批內的分化也很重要:如果單個項仍留在一個未縮小的稠密批裡,退出它們不會節省任何東西。FastBERT 和 DeeBERT 確立了帶準確率/速度權衡的訓練式自適應推理方法;它們報告的收益不是對 Laya 或這臺 Mac 的測量。

一個近似的學生加教師回退方案,其期望歸一化成本約為 c + q,其中 c 是學生成本除以教師成本,q 是教師回退率,假定序列執行。要達到 10×,需要 c + q <= 0.1:成本為教師 5% 的學生至多留下 5% 的請求用於回退。這可以改善平均延遲,而困難請求的 p95 仍接近教師延遲。基於置信度的路由不是一份精確等價性證明。

6. 究竟什麼可以在問題之間複用?

提示是 [CLS] question/options [SEP] state [SEP];不同的問題可以同時改變 state 偏移和 state 截斷。對第一層的 query i,注意力輸出是:

o_i = sum_j exp(q_i dot k_j / sqrt(d)) v_j
      / sum_j exp(q_i dot k_j / sqrt(d))

改變任何未被掩碼的問題 key/value,都會改變每一個 state query 的分子和分母。對有限的 logits 來說,在實數算術中未掩碼的 softmax 權重為正。因此,第一個全域性層之後的上下文 state 取決於問題。所有後續的 K/V 都取決於那些改變後的 state。所以在不同問題之間複用一個完整的 state 編碼或解碼器式 K/V 快取會改變函式。共享原始文本是不夠的;偏移、截斷、掩碼和標記後設資料也有影響。

有一個值得區分的小的精確例外:在第一次注意力操作之前,歸一化的 token 嵌入及其第一層、RoPE 之前的 Q/K/V 投影只取決於 token 身份。它們可以被快取或預先計算,之後再施加絕對的 RoPE 位置。消除整個第一層 QKV 投影在英文/multilingual 裡只移除主稠密工作的 0.85%/1.42%,還沒算查表流量。如果把一個全詞表的 QKV 表與普通嵌入一併保留,會增加約 309 MB/1.18 GB 的 FP16 儲存。第一層的 state 到 state softmax 充分統計量也可以在相同的 state token/截斷和相對位置條件下複用,然後通過穩定的 softmax 合併與問題貢獻結合。這隻節省一個注意力層的一部分;它不會讓後續的上下文狀態變得可複用。

精確的整輸入去重有更大的潛力。如果 N 個請求的問題包含 U 個相同的已準備前向輸入,就只求值 U 個,並把它們的原始輸出映射回所有原始問題,同時帶上正確的有序標籤、校準、ID 和用量記賬。相等性和快取鍵必須覆蓋所有已準備的張量,包括掩碼、標記位置和問題型別;跨呼叫的鍵還必須標識 checkpoint revision、dtype 和執行配置。在現有的 50 問題固定樣本里,U <= 3,所以理想的線性工作比是 50/3 = 16.67×。實際延遲更不可預測,因為小批的效率不同,而且準備/輸出對映仍然存在。對 10 個問題和三個唯一輸入,比例只有 3.33×。無論哪個結果,都必須配一個 50 個不同問題的基準。

用跨呼叫結果快取時,平均歸一化延遲是 1-h+h*epsilon,其中 h 是命中率,epsilon 是快取命中成本除以未快取推理成本。10× 的平均改進需要 h >= 0.9/(1-epsilon);如果一次命中花費推理的 1%,所需的命中率是 90.91%。要分別報告命中率、未命中、冷快取延遲和未命中路徑。標準基準反覆呼叫完全相同的請求,所以一個未標註的跨呼叫快取會很大程度上停止測量模型執行。

一個共享 state 編碼器加問題特定的交叉注意力是一個有前景的重設計產品,但它需要重訓練或蒸餾,因為它移除了原有的早期問題/state 互動。如果可複用的 state pass 成本大致等於一次舊的逐問題 pass,那麼在 Q=50 時共享 pass 消耗舊總預算的 2%;為了 10× 目標,問題特定的工作至多再消耗另外 8%。在 Q=10 時,那一次共享 pass 在問題特定工作之前就已經用掉了 10%。state 長度、選項複雜度和所選的更小 state 編碼器會改變這個估計。

7. 一條可信的、數量級模型改進路線

同時減少深度和寬度能提供足夠的算術空間來吸收開銷。下面是學生設計預算,不是已實現的模型、質量主張或實測加速。它們保留相同的 token 長度,使用一個帶門控的編碼器 MLP 和一個常規的決策頭層,並按同樣的 A 公式計數。

教師 候選 N / D / I / H 主要稠密權重 教師/學生稠密工作比
Laya / typed 6 / 512 / 1344 / 1 21.82 M 16.88×
Laya / typed 4 / 512 / 1344 / 1 15.60 M 23.61×
Multilingual 6 / 384 / 576 / 1 9.29 M 13.40×
Multilingual 4 / 384 / 576 / 1 6.78 M 18.35×

嵌入可以保持相對較大,而收集它仍然便宜。蒸餾教師的選項分佈和動作輸出,混入帶標籤的任務,覆蓋 score/noul 行為和不同的選項數量,然後在留出資料上重新擬合輸出校準。評估完整的語言覆蓋和不同的問句。TinyBERT 是證據,表明通過蒸餾同時減少編碼器深度/寬度可以在另一種 BERT 設定中帶來重大的速度/質量權衡;它報告的 9.4× 推理增益不能按數值遷移到 Laya。

對於手寫工程,優先考慮以下決策:

  1. 在寫新的 GEMM 之前先確定上限。 在 B=1 和一個吞吐批下測量已編譯模型的時間和代表性的稠密原語。把實際持續吞吐與上面的 31–104 TFLOP/s 要求比較。如果移除 launch 之後稠密執行仍佔主導,新的逐元素 kernel 無法補上缺失的那個數量級。
  2. 把精確的輸出選擇和精確的區域性注意力作為有界專案來實現。 最後一個頭有清晰的依賴證明;multilingual 的長輸入區域性路徑有最大的精確算術機會。在維護自定義 Metal 之前檢查實測的真即時間比例。保留現有快速注意力的數值契約,並測試邊界長度/填充。
  3. 只有在做了工作負載記賬之後才釋出精確去重。 對於一個足夠重複的應用,這是通往可能的 10× 結果最快的路徑。它必須與不快取、唯一輸入的基準共存,這樣使用者才能預測自己的結果。
  4. 把 4/8-bit 和啟用感知的低秩當作經過測量的近似。 同時要求速度改進和經過校準的質量門檻。無論是更少的儲存位元組還是一個低的穩定秩數字,都不充分。
  5. 如果對全新的、多樣的請求需要 10×,就開發並驗證更小的學生或共享 state 架構。 學生預算刻意瞄準超過 10× 的稠密工作削減,因為 attention、CPU 準備和小 kernel 開銷仍然存在。一個質量預算和合適的訓練/評估資料是前提;現有的保真固定樣本無法驗證這個主張。

對近似變體,驗收應當記錄 choice 一致和帶標籤的準確率、score 誤差、機率漂移、置信度校準、動作機率和接近間距的情形。現有的 378/378 argmax 檢查、600 次有限重複呼叫和 AG News 迴歸對齊確立了當前埠在那些測試上的行為;它們並不能驗證一個新的壓縮模型。保留一個獨立的模型身份,並把 p50/p95、冷啟動設定、記憶體、唯一輸入數量和質量一併報告。

復現與範圍

  • math_costs.py 從 checkpoint 配置和現有基準 JSON 復現每一張由架構推導的表和延遲目標;math_costs.json 記錄輸入檔案的雜湊和 checkpoint revision。
  • math_spectrum.py 復現四個選定的 CPU 矩陣譜;math_spectrum.json 包含精確的矩陣雜湊。它只用 NumPy 和 safetensors,不載入完整模型。
  • 下載鎖定版本的源 checkpoint 後,在倉庫根目錄執行 .venv/bin/python experiments/math_costs.py 和 .venv/bin/python experiments/math_spectrum.py。CPU 取樣與工程 GPU 計時經過協調以避免重疊。
  • 當前 MLX 量化語義用 find-docs skill 核對,先做規定的 Context7 庫解析,再做一次單獨的量化文件查詢。來源包括官方 MLX 文件、ModernBERT/FlashAttention 和蒸餾/提前退出論文、Apple 規格,以及實際的本地模型。論文裡的任何效能數字都沒有被作為這臺機器上的測量來呈現。

中文結論: 相同 checkpoint、相同完整輸出語義下,暫時沒有可信的“手寫幾個 kernel 就再快 10×”路徑。現有模型的大頭是 dense 計算;區域性 attention 加最後 head 精確裁剪只減少約 2.8%–16.5% 的建模 FLOPs。真實權重抽樣顯示,把矩陣分解壓到十分之一工作量會產生約 82%–87% 的最佳相對 Frobenius 重建誤差,不能當成近似無損捷徑。10× 更有希望來自高重複輸入的精確去重/快取,或通過蒸餾把層數與寬度一起縮小、重新設計共享 state 的編碼方式。前者需要公佈命中率與獨立輸入效能,後者需要訓練和重新驗證準確率、分數、機率及 action 行為。