← 所有文章

Apple Silicon 上的 MLX:当你需要自己的模型,而非 Apple 的模型

Apple 的 Foundation Models 框架只交给你一个模型:系统自带、完全封闭、免费,按 Apple 的节奏更新。对绝大多数端侧语言任务而言,它就是正确的工具,越过它反而是失误。但有些工作需要你自己挑选的模型——某个特定的开放权重 LLM、一个你锁定的版本、一份用自有数据训练出来的微调模型,或者系统模型根本不具备的某项能力。当你需要让自己的模型跑在设备上时,Foundation Models 下面那一层就是 MLX1

MLX 是 Apple 面向 Apple Silicon 机器学习的数组框架,配有可直接嵌入应用的 Swift API(MLX Swift)2。它不是你调用的系统框架,而是你连同模型权重一起打包发布的库。这个差别就是全部的取舍所在;想清楚它,你才知道该往下沉一层,还是留在 Apple 为你安排的位置上。

要点速览

  • MLX 是为 Apple Silicon 打造的类 NumPy 数组框架,具备惰性求值、可组合的函数变换以及 Metal 后端2
  • 统一内存模型正是它能在手机上跑起来的原因。数组存放在 CPU 与 GPU 共享的同一块内存池里,MLX 因此能在两种处理器上共用同一批缓冲区运行,不必支付主机到设备的拷贝开销3
  • LLMModelFactory 在设备上运行开放权重 LLM,指向 mlx-community/Llama-3.2-3B-Instruct-4bit 这类量化模型,再通过 ChatSession 生成内容4
  • LoRA 适配器做微调:训练一个小体量适配器,发布 adapters.safetensorsload(into:) 会在运行时把基础模型的 Linear 层换成 LoRALinear5
  • 自带模型的代价:应用体积(权重很大)、内存压力、没有系统集成,而且每一次更新都得你自己扛。Foundation Models 完全没有这些成本,因为账单是 Apple 付的。

MLX 是什么,以及 Apple Silicon 为何让它成为可能

MLX 提供的数组与运算与 NumPy 极为相似,再加上机器学习所需的各种变换:自动微分、向量化,以及先构建计算图、只在读取结果时才真正执行的惰性求值2。这个项目也保持着研究型框架的推进节奏:MLX 于 2026 年 7 月发布 0.32.0,MLX Swift 同周发布 0.31.6,大致每隔几周就有一次发布7。请锁定版本,并预期它的 API 还会不断扩展。仅凭这些描述,能对上号的框架有十几个。真正让 MLX 能在你口袋里的设备上跑动几十亿参数模型的,是内存模型。

在桌面 GPU 上,数据待在系统内存里,你得把它经总线拷贝到 GPU 独立的显存中做计算,再把结果拷回来。这次拷贝就是税,对大模型来说更是残酷。Apple Silicon 采用统一内存:CPU、GPU 和 Neural Engine 直接寻址同一块内存池。MLX 正是围绕这一事实构建的3。一个数组不存在“在 CPU 上”或“在 GPU 上”之分;它就在内存里,任何处理器都能就地对它做运算。没有拷贝,也没有总线税。一个量化到 4 位的 30 亿参数模型只占几个 GB,运行时不必来回搬运数据——而同样的工作放在内存容量相当的独立 GPU 机器上,正是这些搬运让它变得不切实际。Apple 多年前做出的硬件决策,才是真实模型能在端侧推理的根本前提,而基于图块的统一内存架构正是 MLX 立足的底座。

在设备上运行 LLM

从“我想要某个特定模型”到文字出现在屏幕上,路径很短。MLX Swift 的 LLM 层会从 Hugging Face Hub 加载量化模型并运行它4

let container = try await LLMModelFactory.shared.loadContainer(
    from: HubClient.default,
    using: TokenizersLoader(),
    configuration: .init(id: "mlx-community/Llama-3.2-3B-Instruct-4bit")
)

let session = ChatSession(container)
let response = try await session.respond(to: "Summarize this in one line: \(text)")

若要做逐 token 输出的 UI,改用流式生成,让文本块随到随渲染4

let input = try await container.prepare(input: UserInput(prompt: prompt))
let stream = try await container.generate(input: input, parameters: GenerateParameters())
for await event in stream {
    if case let .chunk(text) = event { /* append to UI */ }
}

真正有分量的实践细节有两个。其一,模型 ID 里的 4bit 不是可有可无的点缀:正是量化让模型塞得进内存,并在设备上跑出可用的速度。你发布的是 4 位(或更低)权重,而不是全精度。其二,即便量化过,权重依然庞大,所以你必须有意识地决定:是把它们打包进应用(即开即用,但下载包很大),还是首次启动时再拉取(二进制精简,但要让用户等待,还得处理失败路径)。Foundation Models 根本不会让你面对这个问题,因为模型早已躺在设备上。用了 MLX,权重就是你自己的麻烦。

微调:一个 LoRA 适配器,而不是一个新模型

自带模型的理由,很少是基础模型本身,而是要把你的领域教给它。在设备上对几十亿参数模型做全量微调并不可取,LoRA(低秩自适应)才是正解:训练一小组适配器权重来调整基础模型的行为,基础模型本身纹丝不动。适配器的量级是 MB,不是 GB5

MLX Swift 从存放着 adapter_config.jsonadapters.safetensors 的目录中加载训练好的适配器,再把它应用到已加载进容器的模型上5

let adapter = try LoRAContainer.from(directory: adapterURL)
await container.update { context in
    try? adapter.load(into: context.model)   // swaps Linear layers for LoRALinear
}

load(into:) 会把模型标准的 Linear 层替换成 LoRALinear 层,将适配器的低秩增量折叠进去,于是推理结果就体现出你的微调。由于模型活在容器内部,适配器要通过 container.update 施加;而且可以在运行时热插拔适配器(unload(from:) 卸下一个,load(into:) 装上另一个),让同一个基础模型在不同功能里表现出不同行为。这套模式与 Apple 通过 Foundation Models 自定义适配器为系统模型提供的做法如出一辙:区别在于,这里基础模型、训练流程和最终结果都归你所有,而不是去适配一个你看不见的模型。

抉择:Foundation Models、MLX,还是云端

三层选择,选错了要么折损能力,要么白白背上一堆本可避免的工作量。

  • Foundation Models:当系统模型能胜任这项任务时。免费、私密、无需发布任何权重、无需你操心内存,而且白得一份系统集成。默认就选它。Apple 为它设计的那些端侧语言任务(摘要、分类、抽取、改写、结构化输出)就该归它管,没有例外。
  • MLX:当你需要一个系统不提供的模型时——某个特定的开放权重 LLM、一个不会随系统更新而漂移的锁定版本、一份领域微调,或者 Foundation Models 覆盖范围之外的架构(视觉语言模型、非文本模型)。你付出的是应用体积、内存和所有权,换回来的是控制权。
  • 云端:当模型确实必须足够大时——前沿推理、长上下文分析,以及任何只有最大模型才做得到、几十亿参数的端侧模型望尘莫及的事情。端侧不是前沿模型的替代品,它只是曲线上另一个点。

诚实的结论是:MLX 是为特定理由而有意识地下沉一层,不是更好的默认选项。如果你说不出 Foundation Models 究竟在哪项能力上满足不了你的功能,那你就不需要 MLX;把它发布出去,意味着你要背上数 GB 的权重和一份本来不必承担的内存预算。

iOS 27 在这张地图上又加了一层。Core AI 是 Apple 用于运行你自备模型的系统框架,能显式控制特化、缓存与计算单元调度。它在“自备模型、端侧运行”这一层与 MLX 有重叠,但方向相反:Core AI 是面向已备好的 .aimodel 的系统托管执行面,而 MLX 是你嵌入的库,训练循环、量化和迭代都在你自己手里。如果你的诉求是在系统托管下快速运行一个转换好的模型,Core AI 会来抢这份活;如果你的诉求是做实验、做微调,或掌控整条流水线,MLX 依然是那件趁手工具。6

什么时候不该动用 MLX

  • 系统模型已经能做到。把 Foundation Models 的任务清单再看一遍。如果你要做的事就在单子上,到此为止。
  • 你担不起权重的代价。量化后的小模型依然是个大件资产。如果应用体积或首次启动下载对你的用户构成实实在在的约束,那么这条约束本身就足以拍板。
  • 你需要固定模型在 Neural Engine 上的最低功耗路径。对于一个已知且不再变动的上线模型,Core ML 及其转换工具能以最低的功耗与最短的延迟直接命中 Neural Engine;在 iOS 27 上,Core AI 则是 Apple 明确指出的新神经网络工作方向,并带有显式的特化控制。MLX 的长处在于灵活性与研究级迭代,系统框架的长处在于锁定成型的生产模型。它们是不同的工具,“端侧机器学习”从来不是一个单一决策。
  • 你不打算维护它。自带模型意味着它的更新、安全和漂移都归你负责。系统模型则由 Apple 替你更新。如果你没有人力去养一个模型,就别领养。

MLX 最值得练就的本领是克制:知道何时才该动用它。这个框架确实了不起——一个真正的语言模型,按你的领域微调过,完全跑在设备上,无需服务器,也没有按 token 计费的成本,而承载它的硬件,其内存架构就是为此而生的。当你能说清理由时,这份能力值得伸手去够。说不清理由就伸手,你不过是把 Apple 那个免费、有人维护、深度集成的模型,换成了一份更沉重、无人维护、如今归你负责的副本。判断力本身,就是这份工作的全部。

常见问题

Apple 的 MLX 框架是什么?

MLX 是面向 Apple Silicon 机器学习的数组框架,具备类 NumPy 的 API、可组合的函数变换(自动微分、向量化)、惰性计算与 Metal 后端2。MLX Swift 是把它嵌入应用的 Swift API,让你能在设备上运行并微调自己的模型。

MLX 如何利用 Apple Silicon 的统一内存?

MLX 的数组存放在共享内存中,运算可以在 CPU 或 GPU 上执行,无需在彼此独立的内存池之间搬运数据3。正是这种零传输特性,让 Apple Silicon 的统一内存架构在端侧模型执行上高效可行。

我能用 MLX 在设备上运行开放权重 LLM 吗?

可以。LLMModelFactory.shared.loadContainer(from:using:configuration:) 会从 Hugging Face Hub 加载 mlx-community/Llama-3.2-3B-Instruct-4bit 这类量化模型;ChatSession 提供 respond(to:) 用于单次调用,container.generate(input:parameters:) 则以 .chunk(text) 事件流的形式输出增量内容4

怎样用 MLX 微调模型?

用 LoRA 适配器,而不是训练一个新模型。LoRAContainer.from(directory:) 从存放 adapter_config.jsonadapters.safetensors 的目录加载适配器;经由 container.update 施加后,它会把模型的 Linear 层换成 LoRALinear 层,并支持运行时热插拔适配器5

MLX、Foundation Models 与 Core ML:我该用哪个?

当 Apple 的系统模型能胜任任务时,默认选 Foundation Models(免费、私密、无需发布权重)1。只有在你需要一个系统不提供的模型时才动用 MLX:某个特定的开放权重 LLM、一个锁定的版本、一份领域微调,或者 Foundation Models 覆盖范围之外的架构。若是需要最低功耗 Neural Engine 路径的锁定生产模型,用 Core ML;若在 iOS 27 上希望以系统托管方式执行自备模型,并显式控制特化与调度,用 Core AI;而当模型确实必须达到前沿规模时,走云端

什么情况下不该动用 MLX?

当系统模型已经能做到时;当你担不起发布数 GB 权重的代价时;当一个固定模型交给 Core ML 的最低功耗 Neural Engine 路径更合适时;或者当你没有人力去承担一个模型的更新、安全与漂移时。MLX 是有明确理由才有意识下沉的一层,不是更好的默认选项。



  1. 关于 MLX 相对于 Foundation Models 框架的定位:Foundation Models 暴露的是 Apple 固定的端侧系统模型(参见 Apple Foundation Models:端侧 LLM 框架);MLX 运行的是你自行选择并微调的模型。两者在端侧技术栈的不同层面上,回应的是不同的需求。 

  2. Apple Machine Learning Research,MLXMLX Swift。MLX 是面向 Apple Silicon 机器学习的数组框架,具备类 NumPy 的 API、可组合的函数变换(自动微分、向量化)、惰性计算与 Metal 后端。MLX Swift 是用于把它嵌入应用的 Swift API。 

  3. MLX 文档,统一内存。MLX 的数组存放在共享内存中;运算可在 CPU 或 GPU 上执行,无需在彼此独立的内存池之间传输数据,正是这一特性让 Apple Silicon 的统一内存架构在端侧模型执行上高效可行。硬件层面的背景:Apple Silicon 的 TBDR 与统一内存。 

  4. Apple Machine Learning Research,MLX Swift Examples / MLX Swift LMLLMModelFactory.shared.loadContainer(from:using:configuration:) 从 Hugging Face Hub 加载量化模型(例如 mlx-community/Llama-3.2-3B-Instruct-4bit);ChatSession 提供 respond(to:) 用于单次调用,container.generate(input:parameters:) 则借助 GenerateParametersUserInput 产出 .chunk(text) 事件流,实现增量输出。 

  5. Apple Machine Learning Research,MLX Swift LM LoRA adapters referenceLoRAContainer.from(directory:) 从包含 adapter_config.jsonadapters.safetensors 的目录加载适配器;经由 container.update 施加后,adapter.load(into: context.model) 会把模型的 Linear 层替换为 LoRALinear 层,unload(from:) 则可将其卸下,从而实现运行时热插拔。可与 Apple 的系统模型路径对照:Foundation Models 自定义适配器。 

  6. 作者的 MLX 实操经历:一套自主 ML 研究循环,通过 MLX 在 Apple Silicon 上运行固定预算的训练实验,自主调整架构与超参数以最小化验证集 bits-per-byte,只保留有改进的结果。本文所述的统一内存与量化行为,即来自这些实验。 

  7. MLX releases(v0.32.0,2026 年 7 月 7 日;已与 PyPI 交叉核对)与 MLX Swift releases(0.31.6,2026 年 7 月 2 日)。该项目自发布以来已推出数十个版本,节奏大致为每隔几周一次。 

相关文章

Apple Foundation Models:端侧 LLM 框架详解

Apple 的 Foundation Models 框架:LanguageModelSession、@Generable 引导式生成、工具调用、可用性判断,以及何时该离开端侧模型。

4 分钟阅读

Apple Vision框架:大多数开发者忽略的设备端CV

Apple Vision提供两打以上的设备端CV操作。大多数开发者却默认使用OpenAI Vision处理那些Vision在毫秒内、免费、设备端就能完成的任务。

2 分钟阅读

构建AI系统:从RAG到智能体

我构建了一个3,500行代码的智能体系统,包含86个钩子和共识验证机制。以下是我在RAG、微调和智能体编排方面的经验总结。

2 分钟阅读