ANE 可行性:等價變換與可測量的 10× 目標
研究日期:2026-09-20。硬體:M3 Max,40 核 GPU,128 GiB。本文描述的是假設和數學邊界,不是聲稱有新的實測加速。起點是原始 Laya 權重和更快的 MLX FP16 執行時。下面的工程實驗和測量可能會取代這裡的起始觀察。
最好的第一個實驗是對整個 transformer 做固定形狀、channel-first 的重寫,然後檢查執行計劃。最有可能實現數量級提升的目標是 每個已完成決策的能耗,前提是模型保持可用的延遲和準確率。只改一個 Core ML 計算單元設定,不足以作為 Neural Engine 執行了該模型的證據。
隨後的 工程實驗 實現了該重寫,實測的速度/能耗報告 現在記錄了結果。未壓縮的候選提升了效率,但沒有達到 10× 目標。下面的假設和原始分母作為研究記錄保留;實測效能說法請使用後來的編譯 MLX 對比。
最佳化之前先定義目標
對於相同的輸入、checkpoint、精度策略和已完成決策數,定義:
t = elapsed time / completed decisions
P = average measured power over that same interval
E = integrated energy / completed decisions = P × t
S = t_MLX / t_candidate speed gain
R = P_MLX / P_candidate power reduction factor
S × R = E_MLX / E_candidate energy efficiency gain
在這個恆等式中使用區塊平均延遲,而不是延遲百分位數。P50 和 P95 分開報告。一個速度快 2×、功耗為五分之一的方案,就是 10× 的能耗改善。一個速度只有一半的方案,需要 20× 的功耗降低才能給出同樣的 10× 能耗改善。把速度乘以已經算出的能耗改善,就是重複計算時間。
有兩種不同的功耗測試:
- 飽和的順序推理:測量實際吞吐量、延遲和每決策焦耳數。功耗更低但更慢的候選並不自動更高效。
- 等提供負載,例如相同的 Snake tick 速率:兩個候選都必須在截止時間內完成相同的工作。報告平均功耗、區間總能耗、截止時間錯失和已完成決策數。睡得更久或丟掉工作不是最佳化。
記錄所測量的功耗域。CPU + GPU + ANE 遙測不一定是整機或電池功耗,不得被那樣標註。報告原始能耗,以及(如果可用)配對的扣除空閒能耗。當負載減空閒接近噪聲時,保留不確定性,而不是靜默鉗制它並報告一個巨大的比值。把分詞、輸入複製、CPU 回退和後處理都保留在端點的計賬邊界之內。
起始證據與分母
當前的 多語言 MLX 基準 測量一個 91-token 問題,為 P50 7.870 ms / P95 9.870 ms。英文 MLX 基準 測量一個 93-token 問題,為 13.334 / 13.734 ms。這些是端到端 predict 測量,不含模型載入和預熱。新的對比必須重跑最強、適用的 MLX 路徑,在工作負載允許時包含它需顯式啟用的 compile 和 prompt 快取設定;歷史的 eager 結果不是永久的分母。
現有的 Core ML 多語言匯出測得 CPU + GPU 下 11.277 ms P50、ALL 下 78.037 ms、CPU + NE 下 81.336 ms。後一份計劃記錄 1,318 個 CPU 首選運算元和零個 NE 首選運算元;24 個 SDPA 運算元的裝置後設資料未知。這不構成任何 NE 執行的說法。該計劃把許多運算元列為 NE-支援,這與 NE-首選不同。Apple 把 計算計劃的裝置使用 描述為預期的裝置使用,所以即使是理想的計劃,也應當由執行時剖析或可觀察的 NE 活動來佐證。
現有的 FP16 迴歸門禁是 100% 夾具 argmax 一致、有限且確定性的輸出,以及校準機率和動作機率的絕對漂移不超過 0.02。這是在一個小語料上的轉換保真度檢查。它不能證明通用任務準確率、Snake 能力或壓縮模型的質量。
等價的圖變換
Apple 的 Transformer 部署研究 啟發了四維 BC1L 啟用、1×1 卷積、把注意力拆成多頭,以及減少佈局複製。它釋出的 10× 示例是另一個模型、裝置和基線;不能移植到這裡的 MLX 對比上。把這些佈局建議當作在本作業系統和晶片上待測試的候選,而不是當下完整的硬體支援契約。
線性投影與門控 MLP
令 X[b,l,i] 是現有的啟用,並定義 U[b,i,0,l] = X[b,l,i]。對於一個線性層,
Y[b,l,o] = sum_i W[o,i] X[b,l,i] + bias[o]
K[o,i,0,0] = W[o,i]
Conv2D(U,K)[b,o,0,l] = Y[b,l,o]
這改變了佈局和運算元表示,但不改變實值函式。把這個佈局保持貫穿整個編碼器和兩個 decision-head transformer 層。在每個線性層周圍來回轉換會抹掉收益。QKV 可以保持為單個 D → 3D 卷積;把它的通道輸出拆成 Q、K 和 V。類似地,保留現有的融合 D → 2I 編碼器投影,把通道拆成 value 和 gate,對 value 施加原始的精確 GELU,乘以 gate,再投影 I → D。
對於 FP16,序列寬度能被 32 整除也與 Apple 研究中描述的 64 位元組末軸對齊相符。初始形狀是短 API 夾具的 B=1,L=96 和緊湊 Snake 的 B=3,L=64。這裡建議 32 的倍數遵循該緩衝模型;這不是允許把每個工作負載都補齊到一個任意的大長度。Snake 不需要 96 token。
注意力與 RoPE
對每個頭,把 Q 和 V 保持為 (B,d,1,L),並把 K 轉置為 (B,L,1,d)。計算:
score[b,k,0,q] = sum_c Q[b,c,0,q] K[b,k,0,c] / sqrt(d)
weight = softmax(score + additive_mask, axis=key)
out[b,c,0,q] = sum_k weight[b,k,0,q] V[b,c,0,k]
在這個表示中,key 軸是軸 1。把頭輸出拼接在通道軸上。這是同一個注意力函式;softmax 軸選錯會靜默地改變它。Apple 的 參考注意力實現 演示了對應的兩次四維收縮。檢查轉換後的 MIL 運算元:寫一個 einsum 並不保證得到預期的裝置或 lowering。
在 QK 之前對每個頭的通道對施加 RoPE。保留 checkpoint 的 split-half 約定、原始位置和逐層 theta。在這個多語言 checkpoint 中,完整 RoPE 和區域性 RoPE 都使用 theta 160000。把所有頭拼在一起後的前後半分開是錯誤的;要在每個 64 通道的頭內部拆分。依賴位置的旋轉通常不能摺疊進單個與位置無關的權重矩陣。
區域性規則是雙向的 abs(q-k) <= 64,含端點。保留 key padding 和現有的 padded-query 規則。在固定形狀下,與位置相關的常量部分可以在追蹤之前算好;改變樣本 padding 仍必須影響 key mask。用有限的大負數掩碼替換數學上的排除是一種數值近似,除非它與原實現的有限精度行為一致;要驗證對抗性輸入和補齊輸入。
LayerNorm 不能與其他歸一化互換
對每個 (b,l),只在通道維度上歸約:
mu = mean_c U
v = mean_c (U-mu)^2
normalized = (U-mu) / sqrt(v + epsilon)
output = normalized * gamma + beta
保留原始的 epsilon、仿射順序、總體方差、第一層的恆等歸一化、精確 GELU 和殘差順序。Apple 的 參考 LayerNorm 使用不同的仿射順序;它的 DistilBERT adapter 通過變換 bias 來補償。直接複製那個類並載入 Laya 的 state dict,在 bias 非零時會出錯。顯式寫出原始順序的仿射表示式,也避免了除以一個可能為零的 gamma。
鉗制啟用、把 GELU 換成 tanh,或用 RMSNorm 替換 LayerNorm,都會改變函式。如果平方值溢位,正向重縮放是一個數學等價的選項:
normalize(x/a, epsilon/a^2) = normalize(x, epsilon), for a > 0
有限精度累加仍需要一致性測試。FP32 歸約可能帶來複製或 CPU 回退的開銷,所以要檢查計劃,而不是靜默地放鬆數值行為。
把不支援的運算元移到模型邊界
如果 embedding 查詢、動態標記 gather 或 action tail 阻礙了一個連續的 NE 區域,就用這個劃分做一個單獨的候選:
CPU: tokenizer → selected embedding rows → embedding LayerNorm
NE candidate: all encoder layers → type embedding addition → both heavy head layers
CPU: marker/CLS selection → small scorer → raw-probability features → action head
只有端點跨越引擎。不要把每一層的注意力或 LayerNorm 都解除安裝到 CPU。在多語言 B=1,L=96 下,一個 FP16 embedding 張量是 147,456 位元組;在 B=3,L=64 下是 294,912 位元組。把這些複製以及任何完整隱藏狀態的輸出複製都計入端到端測量。
多語言 token 表有 196,608,000 個參數,但每個請求只 gather 它的 token 行。不必把它送進 ANE transformer 子圖,也不得把它算作每次預測都完整讀取整張表。它的 LayerNorm 不依賴位置,所以對錶行做離線的預歸一化在實值算術上是等價的。它可能改變舍入和儲存精度,需要自己的一致性檢查。action head 消費的是 原始 標記 logits 的機率,在溫度校準之前;從公開的校準機率重建它的特徵會改變 checkpoint 的行為。
關於 10× 延遲說法的算術限制
令 D 為隱藏寬度,I 為門控編碼器中間寬度,N 為編碼器層數,H=2 為 decision-head 層數。主要的每 token 矩陣參數量和密集算術是:
A = N(4D^2 + 3DI) + 12HD^2
F_dense(B,L) = 2BLA + 4B(N+H)L^2D
乘法和加法分別計數。這些等式不含 norm、啟用、embedding、scoring、mask、複製和執行時開銷。它們不是 profiler。即使對帶掩碼的區域性層,它們建模的仍是當前的密集註意力計算。
| Checkpoint | D / I / N | A | FP16 主矩陣位元組數 | B=1,L=96 的密集工作量 | 當前 MLX P50 之下實現 10× 所需的有效算力 |
|---|---|---|---|---|---|
| 多語言 | 768 / 1152 / 22 | 124,452,864 | 248.91 MB | 24.574 GFLOP | 在 0.787 ms 內達到 31.23 TFLOP/s |
| 英文 / typed 架構 | 1024 / 2624 / 28 | 368,312,320 | 736.62 MB | 71.848 GFLOP | 在 1.333 ms 內達到 53.89 TFLOP/s,使用英文基線 |
這些是所需達到的速率,不是斷言的 ANE 峰值規格。佈局重寫會去掉開銷,但不會去掉那些密集投影。硬體還必須執行一條由 24 或 30 個 attention/MLP 塊構成的順序鏈。
一個樂觀的流式模型給出另一個有條件的下限:
t >= max(F / effective_compute, bytes_from_DRAM / effective_bandwidth)
40 GPU 核心的 M3 Max 標稱 400 GB/s 統一記憶體頻寬。如果每個主 FP16 矩陣每次請求都要從 DRAM 取一次,那麼即使完全用滿該頻寬,多語言也至少需要 0.622 ms、英文至少需要 1.842 ms。實際的 ANE 頻寬訪問可能更小,而快取或壓縮權重會改變這個假設。這不是無條件的物理下限。它說明了為什麼在未壓縮流式下 10× 英文延遲尤其苛刻,也說明了為什麼即使延遲只是小幅改善,測量能耗仍然有用。
對於端到端時間中被加速因子 s 改善的實測比例 f,Amdahl 定律給出 S = 1 / (1-f+f/s)。即使某個區域被無限加速,除非它至少佔原始延遲的 90%,否則也達不到 10×。當目標是每決策焦耳數時,類似的邊界用的是實測能耗的比例,而不是 FLOPs。final-head 的 selected-query 最佳化只去掉了模型算術的幾個百分點;在 L<=64 時區域性注意力稀疏性也可忽略,因為區域性視窗覆蓋所有位置。兩者都不能提供一條可信的、獨立的 10× 路徑。
壓縮與架構改動有不同的契約
| 候選 | 與 checkpoint 的實值函式相同? | 它實際能改變什麼 |
|---|---|---|
| BC1L 佈局、1×1 投影、靜態位置/掩碼、多頭拆分 | 是,只要等式和輸入保持不變 | 排程、區域性性、編譯器分割槽、記憶體複製 |
| CPU 端點劃分、離線 embedding norm、最終頭中的 selected query | 在實值算術上是的;需驗證舍入 | 不支援的運算元、包體積、一些未使用的計算 |
| 8/6/4 位調色盤化或權重量化 | 通常不是 | 權重傳輸/儲存,可能還有推理能耗/延遲 |
| 剪枝已學到的非零權重或低秩分解 | 不是,除非存在代數上精確的結構 | 恢復/校準之後的矩陣算術和傳輸 |
| 提前退出、token 剪枝、更少的層、更窄的 student | 不是 | 可能有大額節省;新模型與質量契約 |
| 跨任意問題複用隱藏狀態 | 對這個雙向編碼器來說不是 | 無效的捷徑;上下文狀態取決於問題 |
| 快取完全相同的整輸入答案 | 對命中快取是精確的 | 工作負載特性;不是未快取推理速度 |
Apple 當前的 最佳化概覽 指出調色盤化可為 NE 帶來記憶體/延遲收益,並標識出 A17 Pro/M4 上更新的 W8A8 計算路徑。不要把那個更新硬體的加速外推到這臺 M3 Max。量化效能指南 也警告啟用反量化可能拖慢 CPU/GPU 執行。先取得一個駐留 NE 的基線,然後從 8 位向下測試權重調色盤化,同時按需保留敏感的 norm/scorer。
把 FP16 權重打包到八位或四位,在計入後設資料之前給出 2× 或 4× 的理想權重儲存比。這並不等於同樣的延遲倍數:解壓、啟用搬運和計算仍在。剪枝只有在所選表示真的利用了這些零時才有助於執行時。移除任意的頭/層或做低秩截斷需要質量恢復,並且若無保留說明就不能保持原模型的身份。
對於逐輸入的 logit 誤差界 ||z'-z||_infinity <= delta,一個充分的 argmax 證明是 top1(z)-top2(z) > 2delta。在校準溫度 T 相同且為正時,softmax 的無窮範數 Lipschitz 界給出 ||p'-p||_infinity <= delta/(2T)。這些是在被評估輸入上有用的診斷,不是量化的全域性證明。保留單獨的 close-margin 和多語言評估切片;飽和樣本會掩蓋大的 logit 誤差。
三個實驗與驗收門禁
- 固定形狀的等價 NE 圖。 匯出多語言
B=1,L=96,K=4和 SnakeB=3,L=64,K=4,帶 BC1L 投影、正確的逐頭 RoPE、顯式注意力和原始 LayerNorm/GELU。把輸入陣列和各層輸出與原圖比較。檢查哪些主要投影和注意力塊是 NE 首選,然後檢查實際的執行時 NE 活動。單憑受支援運算元的數量不算成功。用交替區塊重跑對應的最佳化 MLX 基線。 - 一個連續的 transformer 孤島。 如果第一個圖碎片化,就把 embedding 和小的最終 tail 移到 CPU 邊界。在相同的功耗測量下,把它與整圖候選比較。只有當完整預測在延遲或能耗上優於觀察到的執行間波動時,才保留一個候選。包含所有複製;一個快速但孤立的編碼器是不夠的。
- 在放置生效之後,做以能耗為重點的壓縮。 先篩選 8 位調色盤化,然後 6/4 位作為單獨的近似變體。執行不變的門禁夾具、留出的 choice/score/noul 任務、多語言輸入、接近的並列情況和 Snake 軌跡。把準確率、機率漂移和校準與效能一併釋出。如果激進壓縮或蒸餾改變了已學到的行為,就應歸入一個單獨命名的模型。
在做出釋出說法之前,使用相同的 checkpoint/輸入雜湊和交替的基線/候選順序;排除冷編譯,但單獨報告它。每個入圍方案至少用五個持續區塊,並保留原始延遲、完成呼叫和功耗取樣。要求原始夾具一致和現有的機率容差,不得為了讓候選通過而放寬它們,此外還要求穩定有限的輸出和有界記憶體。把長輸入和形狀邊界輸入與短的固定形狀演示分開測量。
只有當相關的速度、等負載功耗或能耗比值至少為十,且其不確定性支援該說法,同時滿足所述延遲和任務質量限制時,才宣稱 10×。如果不確定性的下界達不到十,就報告實測比值。在驗證了 NE 執行的情況下,較小的能耗提升仍是有用的證據;它不是數量級的結果。
文件來源
使用了必需的 Context7 CLI 工作流:把 Core ML Tools 解析為 /apple/coremltools,然後查詢 transformer 運算元/佈局 lowering 和 NE 壓縮行為(共三條命令)。查閱了 Apple 的研究文章、參考原始碼、當前的 Core ML 最佳化文件、計算計劃文件,以及上面連結的裝置規格。模型等式、參數計數和起始測量來自本倉庫及其 MLX 姊妹專案。本研究分支沒有執行任何可競爭的 GPU/ANE 基準。