← 所有文章

2026 年的 Metal 與機器學習

Apple 的 M5 搭載了一個名為 neural accelerator 的全新硬體區塊,它並不位於 Neural Engine 之上,也不在某個協同處理器裡。它就坐落在每一個 GPU shader core 內部,與既有的管線並肩,專為加速密集且受運算限制的工作而打造,例如 LLM 的 prefill 階段。1這樣的擺放位置,正是 2026 年 Metal 的全部故事。你用來繪製三角形的那顆 GPU,如今也是你用來執行矩陣乘法的那顆 GPU,而 Apple 在 WWDC26 上把直接使用它的 API 交到了開發者手中。Metal 已是一等公民的機器學習運算平台,圖形這個框架已經無法涵蓋它所做的一切。

多年來,裝置端的 ML 故事都運行在 Metal 之上:Core ML 鎖定 Neural Engine,MLX 用一套形似 NumPy 的陣列 API 包裹 GPU,MetalFX 則給遊戲一個封閉的 upscaler。Metal 本身是這些框架賴以站立的基底,而非多數 ML 開發者直接撰寫程式碼的那一層。WWDC26 改變了高度。Apple 推出了用於 tensor 運算的 Metal Shading Language API,讓自訂 kernel 可以插入 Core AI,並展示了在 shader 內部直接運行的神經網路。如今,下探到 Metal 這一層的理由已經具體到足以一一道出。

TL;DR

  • M5 neural accelerator 是位於每一個 GPU shader core 內部的全新硬體區塊,專為加速密集且受運算限制的工作而設計,例如 LLM prefill。1
  • TensorOps 是一套 Metal Shading Language API,能在 GPU 上加速 tensor 運算(矩陣乘法、卷積),並跨越各代 Apple silicon 自動運用可用的硬體加速。1
  • Metal tensor 原生支援量化資料型別:在 macOS 與 iOS 26 更新中支援 4 位元與 8 位元整數,而 4 位元與 8 位元浮點、2 位元整數型別以及 E8M0 區塊式縮放因子則在 macOS 與 iOS 27 中登場。1
  • Neural rendering 在 Metal 4 中橫跨三個層級:作為黑盒子的 MetalFX 去噪、用於將訓練好的模型放入 command buffer 的 ML command encoder,以及讓你直接在 shader 中建構微型網路的 TensorOps。2
  • MLX Swift 保留了高階數值運算路徑:讀起來就像數學式的陣列程式碼、惰性求值、自動微分,以及預設的 GPU 執行。4
  • 全新的效能工具(look-back trace 收集、metalperftrace 與 StateReporting API)為跨越長時間工作階段地量測這一切畫上句點。3

Metal tensor 與自訂 ML kernel

Apple 把 ML 堆疊描述為一層層的結構:最上層是 Core AI 與 MLX,用於最少程式碼的部署;下方是 Metal Performance Shaders,負責高效能 kernel;而在這一切之下,則是 Metal Performance Primitives 與 TensorOps 函式庫,執行底層的加速。1你下探到 Metal 這一層,總有具體的理由。ML 研究進展神速,因此你或許會實作一個自訂運算,插入像 Core AI 這樣的高階框架。你或許正在為 MLX 或 llama.cpp 這類框架貢獻程式碼。又或者,你正在撰寫一個以 Metal 為基礎、需要將該運算內嵌其中的應用程式。1

Watch on Apple Developer ↗

Apple 的 Shiyao 談 M5 neural accelerator:一個位於每個 shader core 內部的硬體區塊,專為 LLM prefill 這類密集且受運算限制的工作而打造(WWDC26,session 330)。

TensorOps 是一套在 GPU 上加速 tensor 運算的 Metal Shading Language API,矩陣乘法與卷積都在其中,而且它能充分發揮 M5 neural accelerator,無需你撰寫針對各代硬體的程式碼。1這套函式庫會讀取可用的硬體並加以運用。這種可攜性,正是透過 TensorOps 工作、而非針對特定 GPU 手寫 SIMD-group 數學運算的意義所在。

2026 年最實用的新增功能是原生量化。模型持續變大,而推論通常受記憶體頻寬限制,因此壓縮權重既能把更多模型塞進記憶體,也能節省頻寬。1標準做法是:取 16 位元的半精度權重,將其縮減為 4 位元,再把量化後的值與縮放因子配對,在運算時把它們映射回原本的範圍。1TensorOps 如今原生處理量化資料型別。macOS 與 iOS 26 更新加入了 4 位元與 8 位元整數型別;macOS 與 iOS 27 則將其擴充至 4 位元與 8 位元浮點型別以及 2 位元整數。1你建立量化 tensor 的方式,幾乎與建立一般 tensor 如出一轍:填好 descriptor 的屬性、指定量化的 dataType,再對你的 Metal device 呼叫 newTensorWithDescriptor1

縮放因子也有了俐落的安身之處。在 macOS 與 iOS 27 中,單一個 MTLTensor 可以把它的縮放值與量化資料一同攜帶,作為額外的縮放平面,並支援 FP8 E8M0 區塊式縮放因子格式,其中每個縮放元素套用於一個資料元素的區塊。1你為縮放平面建立一個 descriptor,設定它的 dataType 與區塊因子,再把一個輔助平面映射附加到原本的 tensor descriptor 上;量化資料、縮放值與中繼資料就此打包進同一個 tensor 物件。1在 kernel 中,你宣告縮放平面(例如以 32 乘 1 的區塊大小宣告 fp8_e8m0,使每 32 個資料元素共用一個縮放值)、宣告完整的 tensor 型別、以 tile 大小設定好 matmul2d_descriptor、建立一個 matmul2d 運算、傳入量化 tensor,TensorOps 便會替你處理反量化。1

當你需要的自訂量化格式是函式庫所不認得的,就直接反量化進一個 cooperative tensor,再把它傳給 matmul2d 運算。Cooperative tensor 會把儲存空間分散到 matmul 中各執行緒的 thread-private 記憶體裡,因此資料留在暫存器中,你便省去了往返 threadgroup 記憶體的開銷。1

Session 330 中的旗艦範例是 FlashAttention,這個融合式的 attention kernel 位於每一個 transformer 的核心。Attention 將 Q 乘上 K,對中間矩陣的各列計算 SoftMax,再乘上 V;FlashAttention 把這三步融合成一個 kernel。1你使用 execution_simdgroup 運算範圍,讓每個 SIMD group 各自擁有中間矩陣的完整列,便能在不跨 group 交換資料的情況下計算 SoftMax,再把中間矩陣存入一個 cooperative tensor,並以 reduce_rows 計算各列的歸約。12026 年最關鍵的改進是:在 macOS 26 中,你必須先把 cooperative tensor 存入 threadgroup 記憶體才能進行第二次 matmul,但如今經過一次 is_compatible_as_left 佈局檢查後,你便能透過 get_left_input_cooperative_tensor 把它直接餵入。1若檢查失敗,你就退回到往返 threadgroup 的做法;無論哪種情況,op.run 都是相同的。1

Apple 透過把這個自訂 kernel 整合進一個真實模型,為整件事畫下句點。Core AI 會轉換 PyTorch 模型並支援自訂 Metal kernel,因此團隊在 Python 中把 FlashAttention 的本體定義為一個字串、註冊一個 TorchMetalKernel、用一個會呼叫該 kernel 的版本取代 Hugging Face 預設的 attention,再從 PyTorch 把一個 SAM 3 影像分割模型匯出為最佳化過的 Core AI 資產,它在一張測試影像中正確分割出了一輛車。1這便是從一個手寫的 GPU kernel 通往一個可出貨模型的路徑。

即時 neural rendering

第二條戰線是 rendering。許多歷來採用解析方法的技術,包括 neural denoising、neural textures 與習得式 tone mapping,如今都能在管線的任一階段以機器學習的形式運行,以改善品質、效能或記憶體佔用。2Metal 4 提供三個控制層級,而你所挑選的層級,是一種刻意的取捨。

Watch on Apple Developer ↗

Apple 的 Yulia 帶你走過 Metal 4 rendering 管線中 ML 的三個層級,從 MetalFX 到在 M5 與 A19 Pro neural accelerator 上運行的 TensorOps 網路(WWDC26,session 359)。

在最高層級,MetalFX 以一個完全整合的黑盒子,提供開箱即用的神經去噪器與 upscaler,專為即時視埠的低延遲需求而設計。2在 path tracer 中,你的 frame 預算或許只允許每像素一個取樣以維持互動,而一個取樣是帶噪的。MetalFX 取下那個帶噪的 frame,加上輔助輸入(diffuse albedo、depth 以及其他幾項),運用空間與時間兩種技術,產生一張乾淨、近乎最終的影像。2Maxon 在 Cinema 4D 中的即時 path tracer Redshift Live 便採用了它,而 Apple 把這套整合提煉成三條最佳實踐:讓你的輔助輸入保持無噪(diffuse albedo 是最強的去噪訊號)、儲存觀者實際所見之物(鏡面採用 primary surface replacement、玻璃採用 Fresnel 混合的 albedo),以及把你的 motion vector 弄對(MetalFX 預期收到去抖動的 motion vector,否則邊緣會閃爍)。2

中間層級是 Metal 4 ML command encoder,它能在你的 command buffer 中直接運行一個預先訓練好的模型,毫無 context switch。2Apple 詳加示範的例子是 neural tone mapping。renderer 的後處理鏈(tone mapping、色彩分級、底片模擬)會變得任意複雜,而一個神經網路能夠習得整套轉換。你在 PyTorch 中訓練一個像 HDRNet 的網路(一個 2017 年由 Gharbi 等人提出的架構),把它匯出為 MTLPackage,用一個 function descriptor 與一個 machine learning pipeline descriptor 載入,再以一個 argument table 來 dispatch 它。2這個 neural tone mapper 於是以單一次神經網路求值,取代了整條多階段的後處理鏈,與 path tracer 及 MetalFX 一同編碼在同一個 command buffer 中,並在同一個 frame 內執行。2

最深的層級是 shader 內部的 TensorOps,與 session 330 是同一套函式庫,但用來建構僅有數千個參數或更少的微型網路,在單一場景上訓練、並不打算泛化。2由於這個網路能內嵌於你的 ALU 與紋理取樣指令之間,它便讓線上訓練成為可能:一個每個 frame 都隨變動的世界條件而調適的模型。Apple 的例子是用於 image-based lighting 的 sky probe,其中動態的日夜循環會讓預先算好的光照訊號失效。解法是一個全連接的 MLP,一個 3-4-4-3 的網路,把方向當作三個 float 接收、再把光照當作一個顏色回傳,在 shader 中前向求值,並以每個 frame 一次的反向傳播過程進行線上訓練。2運用 SIMD-group 執行範圍,所有參與的執行緒共同處理同一次矩陣乘法,並取得儲存空間分散於各執行緒的 cooperative tensor,於是你便能逐層 matmul2d、就地套用激活函數,並在 shader 中當場讀取輸出,無需往返主記憶體。這正是 session 330 中那條同樣的 neural accelerator 路徑,如今正餵養著一個像素。2

量測它:效能工具

在 GPU 上運行 ML,意味著要與你的 rendering 所需的同一批週期、頻寬與散熱預算競爭,因此量測不再是可有可無的選項。Session 388 談的是長時間的遊戲工作階段,但這套工具適用於任何 Metal 工作負載,ML 也包括在內,因為一次 neural tone mapping 過程造成的幀率下降,在你能看清 app 當時在做什麼之前,看起來與任何其他 GPU 停頓並無二致。3

Watch on Apple Developer ↗

Apple 的 Ruiwei 談系統如何在背景中持續記錄 Metal 效能指標,讓你能回溯數小時,並在工作階段結束後收集一份 trace(WWDC26,session 388)。

iOS 與 macOS 27 中最引人注目的改變是:系統會在背景中持續記錄 Metal 的效能與資源指標,把彙總資料以及選用的逐幀資料(CPU、GPU、FPS、記憶體)儲存數天之久。3你是在事後才收集的。在 macOS 上,metalperftrace collect --last 5h 會拉出最近五小時的 trace;在 iOS 上,一次性的設定會在控制中心加入一個「Performance Trace」按鈕,依需求處理一份 look-back trace。3你以 metalperftrace overview 進行分析,而 --json 會輸出結構化的內容,供你餵給回歸測試腳本,或交給一個 AI agent 做分流;Instruments 則把一切繪在時間軸上,並以顏色標示出偏離常態的統計數據。3

讓一張原始 FPS 圖表變得可付諸行動的關鍵,是 StateReporting API,它在 Swift 與 Objective-C 中皆可使用。3你定義一個個 domain,每個都是針對某一個彼此正交的功能領域的有限狀態機,再以一個標籤加上選用的穩定中繼資料與逐狀態的揮發性中繼資料來回報狀態轉換。3對於一個 ML 密集的 app,你或許會運行一個追蹤目前哪個神經網路過程處於作用中的 domain,如此一來,當幀時間飆升時,你便能要求 metalperftrace 彙總某個特定狀態標籤的 FPS,直接看出比方說 tone mapping 過程正是代價所在。3Apple 的提醒是:把狀態轉換的頻率維持在使用者操作的節奏或更慢,因為系統會節流高頻率的回報,你會因此遺失資料。3出貨之後,iOS 與 macOS 27 中的 MetricKit 會把 Metal 的幀率資訊依你的 StateReporting 狀態拆解後揭露出來,並以裝置每日回報的形式送達。3

MLX:高階路徑依舊存在

並非每位 ML 開發者都想撰寫 GPU kernel,而 Apple 也沒有把所有人往下推。MLX Swift 仍是 Apple silicon 上用於數值與陣列運算的富表達力層,而 session 328 正是一份清晰的論證,主張在能夠如此時就留在那一層。4

Watch on Apple Developer ↗

Apple 的 David Koski 談 MLX Swift 在 Accelerate、BNNS、Metal Performance Shaders 與 Swift Numerics 之間的定位(WWDC26,session 328)。

MLX 以 n 維陣列作為其核心抽象,如同 NumPy,因此多數 NumPy 程式碼只需極少改動即可轉換,且程式碼讀起來就像你正在實作的那個數學式。4有兩項特性撐起整個框架:惰性求值,其中運算會建構一張計算圖,唯有在你呼叫 eval 或讀取某個值時才會運行;以及惰性求值所驅動的函式轉換,當中包含用於自動微分的 grad4預設情況下由 GPU 執行工作,而 Apple 的說法是,視演算法而定,相較於純量 CPU 迴圈達到十倍的提升絕對是有可能的。4Session 328 以三個例子佐證:作為一個對整片複數網格進行的兩行迴圈的 Mandelbrot 集合、一個以單次 conv2d 呼叫便將 Jacobi stencil 套用於整片網格的熱分布求解器,以及一個讓 grad 在毫無手寫導數的情況下推導出精確梯度的曲線擬合。4MLX 在此之外還提供了完整的工具組,並以 MIT 授權開源,其 Swift、Python、C++ 與 C 前端共享相同的概念,因此你可以在 Python 中製作原型,再以 Swift 出貨。4

它與 Core AI、Core ML 及 MLX 的關係

這四場 session 描述的是同一個堆疊的不同高度,而恰當的心智模型是一架梯子。

  • Core AICore ML 是部署層。你轉換一個訓練好的模型並運行它,而加速由 Apple 一手包辦。Core AI 對自訂 Metal kernel 的支援正是那座橋樑:session 330 中的 FlashAttention kernel 可以插入一個 Core AI 模型,於是一項 Metal 層級的最佳化便能在無需重寫的情況下抵達高階部署。1
  • MLX 是陣列運算與研究層,你在這裡撰寫形似數學的 Swift,免費獲得 autodiff 與 GPU 執行,並運行或微調你自己的模型。它是多數 ML 工作都應從之起步的那一層。4
  • Metal Performance Shaders 與 TensorOps 是 kernel 層。當你需要一個自訂運算、當你正在打造像 MLX 本身這樣的框架,或當網路必須在 shader 中內嵌運行時,你才下探到這裡。kernel 層最直接地揭露了 neural accelerator。1

是硬體基底把它們繫在一起。neural accelerator 棲身於 GPU shader core 之中,而 Metal 是你抵達 GPU 的途徑,因此上方的每一層最終都騎乘在同一塊矽晶之上,跨越 Apple 的統一記憶體、tile-based 架構。挑選一個層級,與 MLX 對上 Foundation Models 的抉擇是同一種判斷:唯有當你能說出上方那一層所無法給你的能力時,才向下探,因為每往下一步,都是以便利換取掌控。

常見問題

什麼是 M5 neural accelerator?

neural accelerator 是 M5 晶片家族中的一個全新硬體區塊,直接坐落在每一個 GPU shader core 內部,與其他 GPU 管線並肩。1Apple 設計它來加速密集且受運算限制的工作,例如 LLM 的 prefill 階段,而 TensorOps 函式庫在它存在時會自動運用它。1在 neural rendering 那場 session 中,Apple 也提及了 A19 Pro GPU 上的 neural accelerator。2

Metal tensor 支援哪些量化資料型別?

macOS 與 iOS 26 更新加入了 4 位元與 8 位元整數型別。1在 macOS 與 iOS 27 中,TensorOps 把支援擴充至 4 位元與 8 位元浮點型別以及 2 位元整數型別,外加攜帶於 tensor 縮放平面中的 FP8 E8M0 區塊式縮放因子。1Apple 指出這些較小的型別帶有額外的對齊要求,因此在採用它們之前,請先查閱 Metal 文件。1

Metal 4 中 neural rendering 的三個層級是什麼?

MetalFX 是最高層級,一個開箱即用的黑盒子神經去噪器與 upscaler。2Metal 4 ML command encoder 是中間層級,在你的 command buffer 中直接運行一個匯出為 MTLPackage 的預訓練模型。2TensorOps 是最深的層級,讓你在 shader 內部建構微型網路,包含每個 frame 都調適模型的線上訓練。2

我何時該使用 MLX,而非撰寫 Metal kernel?

當你的目標是兼具良好效能、富表達力的數值或陣列程式碼,期望程式碼讀起來就像數學式,並想要預設的 autodiff 與 GPU 執行時,就使用 MLX Swift。4當你需要一個 MLX 或 Core AI 並未提供的自訂運算、當你正在為某個 ML 框架貢獻,或當網路必須在 shader 中內嵌運行時,才下探到 TensorOps 與 Metal kernel。1

在 2026 年,我該如何量測 GPU 上的 ML 效能?

在 iOS 與 macOS 27 中,系統會在背景持續記錄 Metal 效能指標,因此你可以事後再收集一份 look-back trace,在 macOS 上用 metalperftrace collect --last <duration>,或在 iOS 上用控制中心的「Performance Trace」按鈕。3metalperftrace overview(搭配 --json 供腳本使用)或 Instruments 進行分析,並加入 StateReporting API 來標示你的 app 當時在做什麼,如此你便能把效能下滑歸因到某個特定的過程。3


Apple Ecosystem 系列持續推進:MLX 在 Apple Silicon 上談陣列框架路徑,Apple Silicon TBDR談底層支撐這一切的 GPU 基底,Core AI談在裝置上運行模型,而 Core ML 裝置端推論談更廣的 ML 堆疊。系列的樞紐是 Apple Ecosystem Series,而若想在這套基礎上建構代理式功能,請參閱 iOS Agent Development 指南

參考資料


  1. Apple,WWDC26 session 330,“Optimize custom machine learning operations with Metal tensors”。每個 shader core 內部的 M5 neural accelerator;作為矩陣乘法與卷積用 Metal Shading Language API 的 TensorOps;原生量化資料型別(macOS/iOS 26 更新中的 4 位元與 8 位元整數;macOS/iOS 27 中的 4 位元與 8 位元浮點、2 位元整數,外加 FP8 E8M0 區塊式縮放因子);縮放平面與輔助平面映射;newTensorWithDescriptormatmul2d_descriptormatmul2dtensor_handle/tensor_inline;cooperative tensor;FlashAttention kernel(execution_simdgroup 範圍、reduce_rowsmap_iteratorget_left_input_cooperative_tensoris_compatible_as_left/right_inputop.run);以及透過 TorchMetalKernel 的 SAM 3 / Core AI 整合。Apple 引導開發者前往 Metal Performance Primitives 文件與程式設計指南查閱完整的 API 參考。 

  2. Apple,WWDC26 session 359,“Build real-time neural rendering pipelines with Metal”。Metal 4 中 neural rendering 的三個層級(MetalFX、ML command encoder、shader 中的 TensorOps);MetalFX 去噪/upscaling、它的輔助輸入、透明度覆疊與去噪器強度遮罩,以及 Maxon 的 Redshift Live 所採用的三條最佳實踐(乾淨的輸入、primary surface replacement 與 Fresnel 混合的 albedo、去抖動的 motion vector);透過匯出為 MTLPackage 的 HDRNet 進行 neural tone mapping;具備線上訓練的 sky-probe MLP(3-4-4-3);SIMD-group 執行範圍與 cooperative tensor;以及對 A19 Pro GPU neural accelerator 的提及。Apple 引導開發者前往 Metal Performance Primitives(MPP)程式設計指南查閱程式碼細節。 

  3. Apple,WWDC26 session 388,“Find and fix performance issues in your Metal games”。iOS 與 macOS 27 中對 Metal 效能與資源指標持續開啟的背景記錄;在 macOS 上透過 metalperftrace 命令列工具(collect --lastoverview--json--include-state-transitions)以及在 iOS 上透過控制中心「Performance Trace」按鈕進行的 look-back trace 收集;在 Instruments 中的分析;StateReporting API(作為有限狀態機的 domain、reportTransition、穩定與揮發性中繼資料、reportVolatileMetadataUpdate)及其與 Metal Performance HUD、metalperftrace 與 Instruments 的整合;以及 MetricKit 依 StateReporting 狀態拆解的 Metal 幀率回報。 

  4. Apple,WWDC26 session 328,“Explore numerical computing in Swift with MLX”。作為類 NumPy n 維陣列框架的 MLX Swift;惰性求值,建構一張在 eval 或讀值時才運行的計算圖;用於自動微分的 grad;預設 GPU 執行,相較於純量 CPU 程式碼可達十倍;Mandelbrot、熱分布(透過 conv2d 的 Jacobi 與 SOR)與曲線擬合等範例;更廣的工具組(線性代數、FFT、卷積、歸約、scan、亂數生成);以及 MLX 採 MIT 授權的開源,其 Swift、Python、C++ 與 C 前端。另見 Apple Machine Learning Research,MLX Swift。 

相關文章

Apple Silicon TBDR:應用程式開發者實際獲得的能力

Apple silicon GPU採用基於圖塊的延遲渲染(TBDR)。Imageblocks、tile shaders、raster order groups以及A11+的強化功能,改變了Metal應用程式的設計方式。

1 分鐘閱讀

Metal 4 精要:全新核心 API 究竟改變了什麼

Metal 4 在 iOS 26 中與 Metal 並行推出 MTL4 前綴類型。多執行緒命令編碼、統一運算,以及作為一等 GPU pass 的機器學習。

2 分鐘閱讀

建構 AI 系統:從 RAG 到 Agent

我建構了一個 3,500 行的 Agent 系統,包含 86 個 Hook 和共識驗證機制。以下是我在 RAG、微調和 Agent 編排方面的經驗分享。

3 分鐘閱讀