Fine-tuning Language Models on Apple Silicon with MLX
TL;DR · AI 摘要
使用 MLX 框架可在 Apple Silicon 上本地微调语言模型,无需云 GPU 或成本。
核心要点
- MLX 是专为 Apple Silicon 设计的开源数组库,支持本地微调语言模型。
- 使用 MLX 可以在 16 GB Mac 上完成模型权重、优化器状态和训练批次的共享内存操作。
- MLX LM 提供了文本生成和微调功能,支持数千个开源模型。
结构提纲
按章节快速跳转。
- §引言
介绍使用 MLX 在 Apple Silicon 上本地微调语言模型的优势。
MLX 是专为 Apple Silicon 的统一内存架构设计的,无需在系统内存和 GPU 内存之间复制数据。
MLX LM 提供了文本生成和微调功能,支持数千个开源模型。
需要 Apple Silicon Mac、macOS Ventura 13.5 或更高版本以及 Python 3.10 或以上版本。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- MLX 与 Apple Silicon
- 设计原理
- 统一内存架构
- 无需复制数据
- MLX LM
- 文本生成
- 微调支持
金句 / Highlights
值得收藏与分享的关键句。
MLX 是专为 Apple Silicon 的统一内存架构设计的,无需在系统内存和 GPU 内存之间复制数据。
在 16 GB Mac 上,模型权重、优化器状态和训练批次可以共存于同一内存空间。
MLX LM 提供了文本生成和微调功能,支持数千个开源模型。
在 Apple Silicon 上使用 MLX 对语言模型进行微调 - KDnuggets
publ: 2026年6月26日
- 博客热门文章
- 话题 AI 职业建议 计算机视觉 数据工程 数据科学 语言模型 机器学习 MLOps NLP 编程 Python SQL
- 数据集
- 活动
- 资源 快速参考指南 推荐 技术简报
- 广告
加入新闻通讯
#header end
/ad_wrapper
在 Apple Silicon 上使用 MLX 对语言模型进行微调
使用 MLX 在你的 Mac 上本地微调开放的语言模型。不需要云 GPU 或成本。
作者:
Vinod Chugani
2026年6月26日 发布于
语言模型
<div class="addthis_native_toolbox"></div>
# 在 Apple Silicon 上使用 MLX 对语言模型进行微调
过去,微调语言模型意味着租用云 GPU 并看着计费器转动。如果你拥有一台搭载 Apple Silicon 芯片的 Mac,现在你可以使用专门为你的笔记本电脑中的硬件构建的框架,以零云成本将开放模型适应到你自己的数据中。
我从2014年开始从Windows和Dell机器转向Mac,此后再也没有回头。最初出于对更干净操作系统的兴趣,后来我逐渐对苹果如何紧密地整合硬件和软件产生了深深的欣赏。十多年后,这种整合带来了我从未预料到的回报,最近尤其体现在能够完全在设备上微调语言模型,而无需云账单或任何数据离开我的机器。
这种能力由 Apple 的机器学习研究团队开发的开源数组库 MLX 提供支持,以及其配套包 MLX LM,它通过一组简单的命令为数千个开放模型提供文本生成和微调功能。本教程将逐步介绍整个过程:安装工具、准备数据集、训练 LoRA 适配器、通过量化减少内存使用,然后测试和部署结果。到结束时,你将拥有一个在你自己的机器上运行的微调模型,并且有一个可以应用于任何数据集的可重复的工作流程。
# 了解为什么 MLX 适合 Apple Silicon
大多数本地推理工具最初是在 NVIDIA 硬件上开发的,后来才移植到 Mac 上。而 MLX 采取了相反的路线。Apple 的研究团队围绕 Apple Silicon 的统一内存架构从头开始设计了它,其中 CPU 和 GPU 共享一个单一的内存池。
这种设计消除了通常在系统内存和专用 GPU 内存之间传输数据的复制步骤。在一台 16 GB 的 Mac 上,模型权重、优化器状态和训练批次都共存于同一空间中,这正是使设备上的微调成为可能而非仅仅是理想的原因。该 API 与 NumPy 非常相似,增加了用于训练的自动微分功能,并使用 Metal 来加速 GPU 工作,同时保持对内存的共享视图。
在开始之前,你需要一台 Apple Silicon Mac(M1 或更新型号)、macOS Ventura 13.5 或更高版本,以及 Python 3.10 或以上版本。Intel Mac 不受支持。尝试在 Intel Mac 上安装会返回“没有匹配的发行版”错误。
在独立 GPU 上,训练数据在系统内存和专用 GPU 内存之间复制。Apple Silicon 保持一个共享的内存池,这正是为什么一台 16 GB 的 Mac 可以在本地微调模型的原因。
# 设置你的环境
考虑到这种架构,让我们开始安装工具。首先从包及其训练附加功能开始,它们会拉取所有微调命令所需的一切。
pip install "mlx-lm[train]"通过使用一个小模型进行快速生成测试,确认安装是否正常工作。
mlx_lm.generate \
--model mlx-community/Mistral-7B-Instruct-v0.3-4bit \
--prompt "Explain LoRA in two sentences." \
--max-tokens 120首次运行时,会从 Hugging Face 上的 MLX Community 组织下载一个 4 位量化 Mistral 模型,将其缓存到本地,然后流式传输响应。mlx-community 组织托管了数千个预先转换的模型,因此你很少需要自己转换权重。
一个值得早期注意的限制是:MLX 微调要求模型采用 Hugging Face safetensors 格式。其他本地工具中常见的 GGUF 文件可用于推理,但不能用于此处的训练。支持的架构包括 Llama、Mistral、Qwen2、Phi、Gemma 和 Mixtral 等,因此大多数流行的开源模型都可以开箱即用。
# 准备你的数据集
现在环境已经准备就绪,下一步是将数据整理成训练器可以使用的格式。MLX LM 从包含三个文件的文件夹中读取训练数据:train.jsonl、valid.jsonl 和一个可选的 test.jsonl。每一行包含一个 JSON 示例。训练文件是必需的,验证文件允许训练器在运行时报告验证损失,测试文件则在训练完成后对模型进行评分。
支持三种格式:chat、completions 和 text。chat 格式是最稳健的默认格式。它每行存储带有角色标签的消息,并允许 MLX LM 应用模型自身的聊天模板,因此你的数据与模型训练处理对话的方式相匹配。
{"messages": [{"role": "user", "content": "What is LoRA?"}, {"role": "assistant", "content": "An efficient way to fine-tune a model."}]}对于简单的输入和输出对,completions 格式更简单,适用于指令类任务。
{"prompt": "Summarize: The market rose sharply today.", "completion": "Markets gained."}
{"prompt": "Translate to French: good morning", "completion": "bonjour"}默认情况下,训练器会在整个示例上计算损失,这意味着模型会努力学习如何重现提示和答案。传递 --mask-prompt 参数会告诉它仅在完成部分上计算损失,因此训练专注于你真正关心的响应。这通常会产生一个更可靠遵循指令的模型,并且适用于 chat 和 completions 格式。对于 chat 数据,列表中的最后一条消息被视为完成。
请确保每个示例都位于单行上,且没有内部换行,因为读取器会将每一行视为单独的记录。将数据拆分,使大约 80% 的数据进入 train.jsonl,10% 到 20% 的数据进入 valid.jsonl。大约 200 到 500 个示例是改变模型行为的合理最低数量(远少于这个数量的示例往往会过拟合和记忆,而不是泛化)。
# 训练你的第一个 LoRA 适配器
当你的数据准备就绪后,事情变得有趣起来。与更新模型中的每个权重不同,低秩适配(LoRA)会冻结原始权重,并在它们旁边训练小型适配矩阵。这将内存和存储需求降低到完整微调的一小部分,同时保持大部分质量。这种方法源自 Hu 及其同事的 LoRA 论文。
LoRA 保持大型预训练权重冻结,仅训练小型矩阵 A 和 B。由于只有这两个适配器接收更新,内存和存储需求保持较低。
使用一条命令启动训练,指向一个模型和你的数据文件夹。
mlx_lm.lora \
--model mlx-community/Mistral-7B-Instruct-v0.3-4bit \
--train \
--data ./data \
--iters 600 \
--batch-size 1在运行过程中,MLX LM 会打印训练损失、验证损失、处理的 token 数量和每秒迭代次数。默认情况下,适配器权重会保存到一个 adapters 文件夹中。一些重要的标志:--fine-tune-type 接受 lora(默认)、dora 或 full;--num-layers 设置接收适配器的变压器层数(默认:16);--iters 控制训练时长。
示例中特意将 --batch-size 设置为 1,以尽可能降低内存使用。这可以防止在 16 GB 的机器上发生崩溃。如果你有 64 GB 或更多内存,将其提高到 2 或 4 可以缩短总的训练时间。当内存紧张但你又希望使用较大批次的平滑效果时,--grad-accumulation-steps 可以在不增加内存使用的情况下提高有效批次大小。
如果你更喜欢实时图表而不是终端输出,可以添加 --report-to wandb 将指标记录到 Weights & Biases。如果你遇到内存压力,可以将 --num-layers 降低到 8 或 4,或者添加 --grad-checkpoint 以用计算换取较低的内存使用。这两个标志通常足以让一个原本会因内存不足而无法运行的任务顺利执行。
# 选择基础模型和适配器设置
在上述训练机制的基础上,两个早期的决定将影响你整个运行过程:从哪个模型开始,以及要适配多少部分。对于第一个项目,一个 8B 参数的 4-bit 模型是最佳选择。一旦工作流程变得熟悉,你可以升级到 13B 或 14B 模型,这些模型需要 14 到 18 GB 的工作内存,并且在 32 GB 的机器上运行良好。
训练的层数和适配器的秩共同控制容量。更多的层和更高的秩为适配器提供了更多的学习空间,但代价是内存和时间。一个常见的起点是使用 16 层和中等秩,然后根据验证损失是否仍在下降进行调整。如果训练损失下降而验证损失上升,适配器正在记忆你的示例。
学习率也很重要。对于大多数 LoRA 运行,1e-5 到 5e-5 的范围是有效的。太高会导致训练不稳定;太低则模型几乎不会移动。一次只改变一个设置,这样你可以将任何改进归因于特定的选择。
# 使用量化减少内存使用
请注意,上面的基础模型已经以 4bit 结尾。在量化模型上训练一个 LoRA 适配器就是人们所说的 QLoRA,这在 QLoRA 论文中有所描述。由于量化已经集成到 MLX 中,因此相同的 mlx_lm.lora 命令可以直接在量化权重上训练适配器,无需额外设置。
收益是具体的。一个 4-bit 的 7B 模型相比全精度模型,权重内存减少了大约 3.5 倍,使 7B 的微调在 8 GB 的工作内存中运行良好。在 16 GB 的 MacBook 上,这为操作系统和训练批次提供了充足的余量。
如果你希望在训练之前自己对全精度模型进行量化,convert 命令可以处理。
mlx_lm.convert \
--hf-path mistralai/Mistral-7B-Instruct-v0.3 \
--mlx-path ./mistral-4bit \
-q这会将一个 4-bit 版本写入本地文件夹,然后你将其传递给 --model。
mlx_lm.lora \
--model mlx-community/Mistral-7B-Instruct-v0.3-4bit \
--adapter-path ./adapters \
--data ./data \
--test要看到模型的响应,请将相同的适配器路径传递给生成命令。MLX LM 会加载基础模型,并在其上应用你的适配器。
mlx_lm.generate \
--model mlx-community/Mistral-7B-Instruct-v0.3-4bit \
--adapter-path ./adapters \
--prompt "Summarize: Our quarterly revenue grew twelve percent."在不使用适配器的情况下运行相同的提示,进行比较。如果数据集与目标任务匹配良好,那么经过适配的响应应比基础模型更接近训练示例。
# 融合与部署模型
适配器在实验过程中非常方便,但部署时你通常希望有一个单一、自包含的模型。融合命令会将适配器重新合并到基础权重中。
mlx_lm.fuse \
--model mlx-community/Mistral-7B-Instruct-v0.3-4bit \
--adapter-path ./adapters \
--save-path ./fused-model融合后的文件夹行为与任何其他 MLX 模型相同。你可以通过一个兼容 OpenAI 的端点来部署它,这使得现有客户端代码只需更改基础 URL 即可与本地模型通信。
mlx_lm.server --model ./fused-model --port 8080对于图形化替代方案,LM Studio 可以通过一键本地服务器和聊天界面运行 MLX 模型,特别适用于当你想要将微调后的模型与其它模型并排比较时。
# 总结
你现在拥有一个完整的本地微调工作流程:安装 MLX LM,将数据集格式化为 JSONL,使用单个命令训练一个 LoRA 或 QLoRA 适配器,测试它,然后融合并部署结果。所有操作都可以在你已拥有的 Mac 上运行,无需云账单,也不需要数据离开你的设备。
对我而言,这感觉像是从 2014 年我转向 Mac 时开始的旅程的自然延续。最初吸引我的紧密的软硬件集成,已经悄然演变为一种更强大的能力,一台可以在厨房桌面上进行严肃机器学习工作的机器。
接下来有几个方向值得探索。尝试使用 dora 微调类型,并将其结果与普通的 LoRA 进行比较。调整训练的层数和迭代次数,以在质量和速度之间取得平衡。更换一个不同的基础架构。Llama、Qwen、Phi 和 Gemma 都可以通过相同的命令进行操作。当硬件就在你的桌面上时,每次实验的成本都很低,这正是 MLX 在适应语言模型方面带来的实际变化。
Vinod Chugani 是一位人工智能和数据科学教育者,他弥合了新兴人工智能技术与实际应用之间的差距,为在职专业人士提供帮助。他的重点领域包括代理 AI、机器学习应用和自动化工作流程。通过他的技术导师和讲师工作,Vinod 已经帮助数据专业人士通过技能发展和职业转型获得支持。他将定量金融的分析专业知识带入其实践教学方法中。他的内容强调专业人士可以立即应用的实用策略和框架。
更多相关内容
- RAG 与微调:哪个是增强你的 LLM 应用的最佳工具?
- 利用 GPT 模型将自然语言转换为 SQL 查询
- 语言模型入门的 5 个技巧
- 将语言模型集成到现有软件系统中
- 什么是大型语言模型?2025 年初学者指南
- 通过大型语言模型实现被动收入的7种简单方法
<hr class="grey-line"><br> <div><h3>我们推荐的5门免费课程</h3><br> </div>
Mailchimp for WordPress v4.13.0 - https://wordpress.org/plugins/mailchimp-for-wp/
/ Mailchimp for WordPress 插件
你可以从这里开始编辑。
如果评论已关闭。
<= 上一篇
#content end
<script type="text/javascript">kda_sid_write(kda_sid_n);</script>
最新文章
- 在 Apple Silicon 上使用 MLX 微调语言模型 使用 Gemini 自动化你的数据科学流程的 5 个智能代理工作流 使用 Gemini 创建 Google Sheets 5 个开源的全能 AI 模型,能够处理文本、图像、音频和视频 2026 年成为 AI 架构师的路线图 2026 年你可以在本地运行的前 7 个编码模型
热门文章
- 2026 年你可以在本地运行的前 7 个编码模型
- 每一位有志成为数据科学家的人在编写第一行代码之前必须掌握的数学技能
- 2026 年成为 AI 架构师的路线图
- 使用 OpenAI Codex 的 5 个有趣项目
- 2026 年成为 LLM 工程师的路线图
- 我为什么(以及如何)构建了一个 AI 助手
- 为什么 WebMCP 非常令人兴奋
- 你应该始终记住的 Python 字典技巧和窍门
- 关于智能代理 AI,每个人都在误解的几点
- 使用 sktime 在 Python 中构建时间序列机器学习模型
#content_wrapper end
© 2026
Guiding Tech Media
|
关于
联系方式
广告
隐私
服务条款
发布于 2026 年 6 月 26 日
blank
不,谢谢!
/.main_wrapper
<script defer type="text/javascript" src="https://s7.addthis.com/js/300/addthis_widget.js#pubid=gpsaddthis"></script>
noptimize
/noptimize