SuperAPI AI 工具集

mlx-fine-tuning

智能体与模型

查看项目

更新于 10-15 07:54

技能介绍

用途

MLX Fine-Tuning 是一个用于在 Apple Silicon(M1/M2/M3/M4)上使用 MLX 框架微调大语言模型的综合技能。其目标是利用 MLX 的统一内存架构与 Metal GPU 加速,在 Apple Silicon 上高效完成 LLM 微调,重点采用 LoRA(低秩适配)实现参数高效微调,无需昂贵的 GPU 硬件。

适用时机

在以下情况调用该技能:

  • 在 Apple Silicon 上搭建 MLX 微调环境
  • 将模型从 HuggingFace 转换为 MLX 格式
  • 配置用于微调的 LoRA 适配器
  • 针对特定数据集优化超参数
  • 排查内存或性能问题
  • 对微调后的模型进行基准测试
  • 管理与导出适配器

平台要求

关键限制:MLX 仅能在原生运行 macOS 的 Apple Silicon(M1/M2/M3/M4)上工作。

  • 架构必须为 arm64(可用 uname -m 验证)
  • 无法在 Docker 或虚拟机中运行
  • 需要 macOS 11.0 或更高版本

工作流程

1. 环境校验

首先使用提供的脚本校验环境:

python scripts/validate_environment.py

该脚本检查:Apple Silicon 架构、MLX 安装、Metal GPU 可用性、内存容量。

2. 模型准备

将 HuggingFace 模型转换为 MLX 格式,或使用预转换模型:

# 选项 A:使用 MLX Community 的预转换模型
--model mlx-community/Qwen2.5-3B-Instruct-4bit

# 选项 B:从 HuggingFace 转换
uv run mlx_lm.convert \
    --hf-path Qwen/Qwen2.5-3B-Instruct \
    --mlx-path models/Qwen2.5-3B-Instruct-mlx \
    --quantize  # 可选:用于 4-bit 量化

3. 数据准备

以 MLX 聊天格式(JSONL)准备训练数据:

{"messages": [
  {"role": "system", "content": "You are a helpful assistant."},
  {"role": "user", "content": "What is machine learning?"},
  {"role": "assistant", "content": "Machine learning is..."}
]}

将 train.jsonl 与 valid.jsonl 保存到数据目录中。

4. 超参数选择

加载 references/hyperparameter_guidelines.md 获取基于数据集规模的详细指导。

快速参考:

  • 小数据集(<1k 样本):学习率 2e-5,200-500 次迭代,4-8 层
  • 中等数据集(1k-10k):学习率 1e-5,500-1000 次迭代,8-16 层
  • 大数据集(10k+):学习率 5e-6,1000-2000 次迭代,16-32 层

5. 训练执行

使用 mlx_lm 运行微调:

uv run python -m mlx_lm lora \
    --model models/Qwen2.5-3B-Instruct-mlx \
    --train \
    --data ./data \
    --batch-size 1 \
    --iters 500 \
    --learning-rate 1e-5 \
    --num-layers 8 \
    --adapter-path adapters/my-lora \
    --save-every 100 \
    --grad-checkpoint  # 启用可提升内存效率

6. 内存优化

若遇到内存问题,加载 references/memory_optimization.md 获取技术:

  • 梯度检查点(--grad-checkpoint)
  • 减小批量大小
  • 模型量化(4-bit)
  • 减少层数

7. 评估与测试

测试微调后的模型:

# 交互式生成
uv run python -m mlx_lm lora \
    --model models/Qwen2.5-3B-Instruct-mlx \
    --adapter-path adapters/my-lora \
    --prompt "Your test prompt"

# 基准对比
uv run python scripts/hyperparameter_optimizer.py \
    --model models/Qwen2.5-3B-Instruct-mlx \
    --adapter adapters/my-lora \
    --test-samples 20

8. 适配器管理

导出并合并适配器:

# 导出为 safetensors 格式
uv run mlx_lm.fuse \
    --model models/base-model \
    --adapter-path adapters/my-lora \
    --save-path models/fused-model

# 转换回 HuggingFace 格式
uv run mlx_lm.convert \
    --mlx-path models/fused-model \
    --hf-path models/hf-export

故障排查

常见问题可加载 references/common_issues.md。快速解决方案:

  • 内存错误:将批量大小减至 1,启用梯度检查点
  • 训练缓慢:用 mx.default_device() 验证 Metal GPU 使用情况
  • 训练不稳定:降低学习率,提高预热比例
  • 格式错误:验证数据格式与 MLX 聊天结构匹配

高级技术

多阶段训练与学习率衰减

# 渐进式学习率调度
--lr-schedule "400:2e-5,400:1e-5,200:2e-6"

A/B 测试配置

使用 scripts/hyperparameter_optimizer.py 测试多种配置:

python scripts/hyperparameter_optimizer.py \
    --config-file configs/experiment.yaml \
    --parallel-runs 4

监控训练

跟踪关键指标:训练/验证损失曲线、内存使用(mx.metal.get_active_memory())、Token 吞吐量、梯度范数。

最佳实践

  • 从小规模开始:在完整训练前先用少量迭代测试
  • 频繁检查点:使用 --save-every 避免丢失进度
  • 监控内存:全程跟踪统一内存使用
  • 经常验证:检查验证损失以尽早发现过拟合
  • 对比性能:始终与基础模型进行基准对比
  • 版本控制:为适配器目录使用描述性名称
  • 记录实验:记录所有超参数与结果

资源参考

  • 加载 references/hyperparameter_guidelines.md 获取详细参数选择
  • 加载 references/memory_optimization.md 获取内存管理技术
  • 加载 references/common_issues.md 获取故障排查指南
  • 加载 references/mlx_api_reference.md 获取 MLX 特定函数

输出产物

训练产生:

  • adapters/*/adapters.safetensors - LoRA 权重
  • adapters/*/adapter_config.json - 配置
  • 带损失曲线的训练日志
  • 按指定间隔保存的检查点

与流水线集成

对于程序化训练,可与流水线系统集成:

from training.mlx import TrainConfig, TrainPipeline

config = TrainConfig(
    model="mlx-community/Qwen2.5-3B-Instruct-4bit",
    train_data="data/train.jsonl",
    iters=500,
    learning_rate=1e-5,
    num_layers=8,
    grad_checkpoint=True
)

pipeline = TrainPipeline(config)
result = pipeline.execute()