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
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 调用 newTensorWithDescriptor。1
缩放因子也有了利落的安身之处。在 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 提供三个控制层级,而你所挑选的层级,是一种刻意的取舍。
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
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
Apple 的 David Koski 谈 MLX Swift 在 Accelerate、BNNS、Metal Performance Shaders 与 Swift Numerics 之间的定位(WWDC26,session 328)。
MLX 以 n 维数组作为其核心抽象,如同 NumPy,因此多数 NumPy 代码只需极少改动即可转换,且代码读起来就像你正在实现的那个数学式。4有两项特性撑起整个框架:惰性求值,其中运算会构建一张计算图,唯有在你调用 eval 或读取某个值时才会运行;以及惰性求值所驱动的函数转换,当中包含用于自动微分的 grad。4默认情况下由 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 AI 与 Core 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」按钮。3以 metalperftrace 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 指南。
参考资料
-
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 分块缩放因子);缩放平面与辅助平面映射;
newTensorWithDescriptor、matmul2d_descriptor、matmul2d、tensor_handle/tensor_inline;cooperative tensor;FlashAttention kernel(execution_simdgroup范围、reduce_rows、map_iterator、get_left_input_cooperative_tensor、is_compatible_as_left/right_input、op.run);以及通过TorchMetalKernel的 SAM 3 / Core AI 整合。Apple 引导开发者前往 Metal Performance Primitives 文档与编程指南查阅完整的 API 参考。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
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)编程指南查阅代码细节。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple,WWDC26 session 388,“Find and fix performance issues in your Metal games”。iOS 与 macOS 27 中对 Metal 性能与资源指标持续开启的后台记录;在 macOS 上通过
metalperftrace命令行工具(collect --last、overview、--json、--include-state-transitions)以及在 iOS 上通过控制中心「Performance Trace」按钮进行的 look-back trace 收集;在 Instruments 中的分析;StateReporting API(作为有限状态机的 domain、reportTransition、稳定与易变元数据、reportVolatileMetadataUpdate)及其与 Metal Performance HUD、metalperftrace与 Instruments 的整合;以及 MetricKit 按 StateReporting 状态拆解的 Metal 帧率报告。 ↩↩↩↩↩↩↩↩↩↩↩↩ -
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。 ↩↩↩↩↩↩↩↩↩