MLX微调示例指南
摘要
一份关于在 Apple Silicon 上使用 MLX 和 LoRA 微调 7B 指令模型的详细指南,附有显示风格适应高奇幻文学语域的示例输出。
一个本地的 MLX 微调实验
刚刚在 Apple Silicon 上通过 MLX 完成了一个 7B 指令模型的本地 LoRA 微调,教会它一种高等奇幻文学语体(Gene Wolfe 和 Tolkien 的风格)。这是我两年前尝试过的一个更严格、数据更多的版本,想分享一些学到的经验。目标是让输出在风格、语体和措辞上产生可见的变化,而不是叙事质量。
**示例输出:**
**提示:** 写一个场景,关于一位站在海边的女子,用 Tolkien 的高等奇幻风格回忆她失去的某个人。
**基础模型:**
在群山之外的暮色中,夕阳染上金色和琥珀色的光影,那里伫立着一个孤独的身影。艾琳,人类疆域中最后的精灵族裔,发现自己站在大海的边缘,目光投向太阳正栖息的远方地平线。微风吹来隐秘森林里盛开的花朵的香气,带着一段回忆,让她唇边泛起一抹怀念的微笑。广阔而永恒的大海映照着天空,海浪低语着过去时代的故事。她记得第一次看到大海的那一天,她遇见他的那一天。埃奥利尔,一位西方的凡人,唇边是航海之歌,眼中带着笑意。他们在莉苏伊的银色月光下跳舞,他向她承诺他们将一起环游世界,他们的心因共同的爱而相连……
**奇幻微调:**
然后他对她谈起贝伦和露西恩,以及他们在曼督斯之地所见到和忍受的一切,还有在阿门洲厅堂里的漫长年月。她流泪了,他沉默了一会儿,最后说:“现在你来到了海边,大海将把你带到我身边;我会把你送回中土大陆,越过大海;因为凡人的命运,疲惫归者,终究要来到海港,从那里他们出发。但首先我要带你看看隐秘王国,以及提利昂城,那里住着泰勒瑞族;因为此后埃尔达和凡人将再也看不见维林诺的土地。你要去那里,住上一段日子,直到你该终结的时候。” 但当塔尔-米瑞尔站在海边时,她心中充满了巨大的恐惧,她转向乌欧牟说:“我不想去海港。我内心有个巨大的空虚,大人,我很害怕。因为我是一个女人,女人的命运就是遗忘……”
**提示:** 写一个外部动作和描写的场景,一个孤独的士兵返回发现自己村庄被烧毁。
**基础模型:**
标题:被遗忘家园的回响
在曾经葱郁的土地的荒芜地带,太阳低垂,投下长长的、诡异的阴影,在一个曾经繁华的村庄的残骸上舞动。空气中弥漫着灰烬和烟雾的气味,令人心头发紧,提醒着这里曾经发生的毁灭。一个孤独的身影,披着渐暗的光线,拖着脚步走过曾经是家的焦黑残骸。他的靴子在漆黑的废墟上回响,每一步都伴随着沉重的心跳。士兵名叫伊桑,是一个高大瘦削的二十多岁男人,脸上刻着千场战斗的纹路和千种悲伤的重负……
**奇幻微调:**
哨兵都死了,我担心最坏的情况。走近时,我看到村庄的主街上堆满了木头,茅草屋顶还在冒烟。空气中弥漫着燃烧的木头和血肉的臭味。街上没有人,也没有动物的叫声或吠声。我看到一具男人的尸体,半埋在废墟堆里,半在街上。他被从一间房子里掉下来的横梁压死了。我看了他一眼,但没有停下来检查。我匆匆往前,呼唤着阿斯基安的名字,他是村里的一个好朋友。但我没有听到任何回应,除了燃烧木头的噼啪声,没有别的声音。我听到一个女人的尖叫,我停下来,侧耳倾听。是阿斯基安妻子的尖叫声,我跑向她。她吓得半疯,紧紧抓住我,好像我能保护她免受阿斯基安的鬼魂伤害……
**我的主要收获**是,在一个小型本地模型上进行微调现在只需在单个 Mac 上花费几个小时,离线且边际成本几乎为零,微调数据集也足够小、便于管理。作为 AI 研究者,这反映了实证文献(LIMA, LIMO):非常小的数据集,如果精心策划以保证质量和多样性,可以有力地改变输出。
1. 流程:量化基础模型(Mistral-7B-Instruct-v0.3)→ 生成数据(通过 LM Studio 本地)→ 训练 → 评估 → 融合基础+适配器 → 导出为 GGUF。
2. 数据:约 1,200 个样本,训练不到 2 个 epoch
3. 只训练了 0.145% 的权重,但模型从通用的“帮助型助手”明显转变(困惑度下降 −35%)为一个特定的文学语体。
4. 大部分工作在于数据策划:清洗、按句子边界分块、提示词生成、以及语体框架构建。
**注意:** 这是在 4 位量化的 7B 模型上进行的 QLoRA,所以没有什么突破性的进展。但我认为如果有更多硬件、想处理更大的开源权重模型,这种方法是可扩展的。
**环境:**
- 硬件:Apple M2,64 GB 统一内存。
- 操作系统 / Python:macOS (Sonoma),Python 3.12.4,虚拟环境通过 `uv` 管理。
- 框架:Apple MLX 通过 `mlx-lm`(`mlx_lm.convert`, `mlx_lm.lora`, `mlx_lm.fuse`, `mlx_lm.generate`)。
量化:
```bash
mlx_lm.convert --hf-path mistralai/Mistral-7B-Instruct-v0.3 --q-bits 4 --quantize \
--mlx-path ./mistral-7b-instruct-v0.3-4bit
```
数据:1,181 条记录,按 95/5 分割(种子 42)为 1,122 训练 / 59 验证,从 Tolkien 的《精灵宝钻》《努门诺尔与中土未完的传说》以及 Gene Wolfe 的《新日之书》四部曲中提取。MLX 对话格式(每行一个 JSON 对象):
```json
{"messages": [{"role": "user", "content": "<提示词>"}, {"role": "assistant", "content": "<目标语体段落>"}]}
```
训练使用了 `--mask-prompt`,因此损失只计算在助手的完成部分(目标语体),从不计算在提示词上。
数据清洗与提示词生成通过 Python 脚本完成:移除数字、换页符、重新连接连字符分割的单词、将 PDF 换行重新流式化为连续散文。修剪非叙事的前言/后记(作者简介、电子书校对注释、译者度量附录),修复 OCR 错误(代词“I”被误读为数字“1”),移除章节标题,保留破折号和省略号(Wolfe 风格的核心)。在早期的 659 个样本版本中,将每个现有完成修剪为完整句子边界。**句感知分块**:用 `nltk`(Punkt)对清洗后的文本进行切分,并在完整句子边界上累积成约 500 词的块。**提示词生成**:将清洗/处理后的上下文块传递给在 LM Studio 中运行的 Mistral Small 24b Instruct,指令是从段落中反向写一个提示词,总是以“写一个故事段落……”开头。
**MLX 训练框架与参数**
LoRA(QLoRA 风格,适配器在 4 位基础模型上),使用 `mlx_lm.lora` 训练:
```bash
mlx_lm.lora \
--model ./mistral-7b-instruct-v0.3-4bit \
--train --data ./data_v4 --mask-prompt \
--fine-tune-type lora --num-layers 16 \
--batch-size 2 --iters 1000 \
--max-seq-length 2048 --learning-rate 1e-5 \
--steps-per-report 10 --steps-per-eval 100 --val-batches -1 \
--save-every 100 --adapter-path ./adapters_v2 \
--grad-checkpoint --seed 42
```
- 微调类型:LoRA,作用于顶部 16 个 Transformer 层。
- 可训练参数:10.49 M / 7.25 B(0.145%);4 位基础模型保持冻结。
- 优化器 / 学习率:Adam,学习率 `1e-5`(恒定)。
- 序列长度:2048 个 token;启用梯度检查点以节省内存。
- 验证:每 100 次迭代对整个验证集进行验证(`--val-batches -1`);适配器检查点每 100 次迭代保存一次。
- 种子:42(可重现)。
训练后,将适配器融合成一个独立的可部署模型:
```bash
mlx_lm.fuse --model ./mistral-7b-instruct-v0.3-4bit
```
(翻译完毕)
相似文章
从零开始使用MLX构建大语言模型
一份关于使用Apple的MLX框架从零开始构建大语言模型的指南。
@ActuallyIsaak:这是一个实际运行的端到端过程,从训练到在LM Studio中使用训练好的LLM,由@lmstudio的MLX-LoRA-Studio提供
MLX-LoRA-Studio 是一款原生的macOS应用,用于在Apple Silicon上微调LLM,提供用户友好的界面,支持多种训练算法,包括SFT、DPO和QAT。它完全开源,允许本地私有微调,无需依赖云端。
@_rohit_tiwari_: 这本115页的书揭示了LLM微调的秘密。https://drive.google.com/file/d/1cS5sWZw9XUDRI4uRh02-28Xq4-P…
一本全面介绍大语言模型微调的115页指南,涵盖理论与实践。
如何在 AMD Strix Halo 及其他非主流 AMD 硬件上微调大语言模型 (LLMs)
本文提供了在 AMD Strix Halo 硬件上使用监督微调 (SFT) 和 LoRA 方法微调大语言模型 (LLMs) 的教程,涵盖 Linux 及原生 Windows 环境。
@akshay_pachaar: 如果要定制LLM,我会学习的微调技术:收藏此推。1. LoRA 2. QLoRA 3. Prefix Tuning 4. A…
该推文列出了15种LLM微调技术,并介绍了ART(Agent Reinforcement Trainer),这是OpenPipe的一个开源框架,用于使用GRPO训练多步骤代理,并通过W&B Training提供无服务器强化学习支持。