本文详细介绍如何在Mac电脑上使用Apple的MLX框架,通过LoRA(低秩适配)技术对大语言模型(如Qwen3-4B-Instruct)进行微调。以下流程适用于8月9日的Mac mini M4 16GB,涵盖模型获取、数据准备、微调、运行及模型合并等步骤。
获取模型
目前主流的大模型下载平台有 ModelScope(国内) 和 Hugging Face(国外),它们都提供了方便的命令行工具以及 Git 仓库下载方案,方便用户快速获取模型权重和相关资源。
使用 Git 下载模型
确保你的 Mac 电脑已经安装了 brew
,如果还没安装,可以访问 https://brew.sh/ 按照官方指南安装。
之后安装 Git 以及 Git LFS(Large File Storage)工具,方便管理大文件:
brew install git git-lfs
git lfs install
下载 ModelScope 上的模型仓库示例:
git clone https://www.modelscope.cn/Qwen/Qwen3-4B-Instruct-2507.git
下载 Hugging Face 上的模型仓库示例:
git clone https://huggingface.co/Qwen/Qwen3-4B-Instruct-2507
使用命令行工具下载模型
推荐使用独立的 Python 虚拟环境(virtualenv、venv 或 conda),避免污染基础环境。
使用 ModelScope 命令行工具下载:
# 安装 ModelScope
pip install modelscope
# 下载模型
modelscope download --model Qwen/Qwen3-4B-Instruct-2507 --local-dir ./Qwen3-4B-Instruct-2507
使用 Hugging Face Hub 命令行工具下载:
# 安装 Hugging Face Hub CLI
pip install -U "huggingface_hub[cli]"
# 下载模型
hf download Qwen/Qwen3-4B-Instruct-2507 --local-dir ./Qwen3-4B-Instruct-2507
安装 MLX-LM
为了确保后续内容可以正常展开,请你自行创建虚拟环境,安装mlx-lm及其训练依赖项
pip install "mlx-lm[train]"
-
MLX-LM直接支持Hugging Face格式模型(包含权重和配置文件),无需转换为MLX格式。
-
Hugging Face 格式是主流模型的“原始格式”,表现为一个文件夹,其中存储训练好的模型参数和配置信息,通常由多个文件组成,适合训练和跨平台使用,结构灵活,通用性强。
-
MLX 格式是针对 MLX 框架专门设计的“一体化格式”,表现为一个文件夹,把模型权重和部分信息打包成单个文件,更加轻量和高效,方便快速加载、微调和量化推理。
运行模型
MLX-LM 提供了命令行工具可以直接运行我们的大模型
mlx_lm.generate --model ./Qwen3-4B-Instruct-2507 --prompt "你谁"
MLX-LM 提供了python接口,可以通过脚本运行模型
from mlx_lm import load, generatemodel, tokenizer = load("./Qwen3-4B-Instruct-2507")prompt = "你谁"messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True
)text = generate(model, tokenizer, prompt=prompt, verbose=True)
运行结果示例
==========
我是通义千问,是阿里云研发的超大规模语言模型。我可以帮助你回答问题、创作文字、编程、表达观点等。有什么我可以帮你的吗?
==========
Prompt: 10 tokens, 42.522 tokens-per-sec
Generation: 38 tokens, 11.952 tokens-per-sec
Peak memory: 8.287 GB
准备微调数据
创建数据目录
mkdir data && cd data
这里新建一个专门存放训练和验证数据的文件夹,方便统一管理,避免杂乱。
创建训练数据文件 train.jsonl
cat > train.jsonl << 'EOL'
{"text": "<|im_start|>user\n你是谁?<|im_end|>\n<|im_start|>assistant\n你好,我是touken,一个专注于地理信息系统的智能助手,很高兴为你服务。<|im_end|>"}
{"text": "<|im_start|>user\n请介绍一下GIS。<|im_end|>\n<|im_start|>assistant\nGIS,全称地理信息系统,是一种用来采集、管理和分析空间数据的工具。需要帮助的话,告诉我!<|im_end|>"}
{"text": "<|im_start|>user\ntouken,什么是空间数据建模?<|im_end|>\n<|im_start|>assistant\n空间数据建模是将地理现象转化为数学模型,方便分析和预测地理变化。希望这个解释清楚明了。<|im_end|>"}
{"text": "<|im_start|>user\n有哪些常用的GIS软件?<|im_end|>\n<|im_start|>assistant\n常用的GIS软件包括ArcGIS、QGIS和MapInfo。这些工具可以帮助你处理空间数据。<|im_end|>"}
EOL
训练数据是模型学习的基础,格式为 JSONL,确保每行是一个完整的 JSON 对象,字段为
text
。
这里用 Qwen 规范的对话格式明确区分用户和助手,有助于模型理解上下文关系,提升微调效果。
创建验证数据文件 valid.jsonl
cat > valid.jsonl << 'EOL'
{"text": "<|im_start|>user\n你是谁?<|im_end|>\n<|im_start|>assistant\n我是touken,专业的地理信息助手,随时为你解答相关问题。<|im_end|>"}
{"text": "<|im_start|>user\n什么是GIS?<|im_end|>\n<|im_start|>assistant\nGIS是地理信息系统,用于管理和分析空间数据。<|im_end|>"}
{"text": "<|im_start|>user\ntouken,什么是空间数据建模?<|im_end|>\n<|im_start|>assistant\n空间数据建模是将地理现象转化为数学模型,用于空间分析。<|im_end|>"}
{"text": "<|im_start|>user\n有哪些常用的GIS软件?<|im_end|>\n<|im_start|>assistant\nArcGIS和QGIS是常见GIS软件。<|im_end|>"}
EOL
验证数据用于在训练过程中评估模型性能,帮助判断是否过拟合或欠拟合。
格式要求与训练数据一致,保证数据规范统一。
数据格式要求
- JSONL格式:每行一个完整JSON对象,包含text字段。
- Qwen对话格式:
- 用户:<|im_start|>user\n问题<|im_end|>
- 助手:<|im_start|>assistant\n回答<|im_end|>
- 必需文件:train.jsonl(训练集)和valid.jsonl(验证集)。
- 参考MLX官方文档(https://github.com/ml-explore/mlx-examples)获取更多格式支持。
创建微调参数配置
虽然我们可以通过命令行参数直接配置并开始微调,但是效果并不直观,下面给出了lora_config.yaml
用于从配置文件加载微调任务
# 基础模型路径
model: "./Qwen3-4B-Instruct-2507" # 预训练模型所在路径train: true # 是否进行训练,true 表示开始微调fine_tune_type: lora # 微调方法,使用 LoRA 轻量化微调optimizer: adamw # 优化器,AdamW 在大模型微调中表现良好# 数据集路径
data: "./data" # 训练和验证数据所在文件夹路径,需包含格式合适的数据文件# 随机种子,保证可复现
seed: 0# 模型层数,部分模型需要指定微调层数
num_layers: 16 # 微调的模型层数,建议根据模型规模调整# 训练参数
batch_size: 1 # 每个训练步骤使用的样本数,较小批量可节省显存,但训练不稳定
iters: 50 # 训练的迭代次数,次数过少会导致模型未充分学习learning_rate: 1e-5 # 学习率,较小学习率更稳定但训练慢,过小可能导致效果不明显steps_per_report: 1 # 每多少步打印训练日志steps_per_eval: 5 # 每多少步进行一次评估# LoRA 适配器路径,保存微调权重
adapter_path: "adapters"# 每多少步保存一次微调模型
save_every: 5# LoRA 相关超参数
lora_parameters:keys: ["self_attn.q_proj", "self_attn.v_proj"] # 选择微调的注意力层权重rank: 8 # LoRA 的秩,越大表示更强的适应能力,但显存和计算开销也增大scale: 20.0 # 缩放因子,控制 LoRA 参数的幅度dropout: 0.0 # dropout 比例,适当加大可防止过拟合
请注意,当前项目包含以下内容:
.
├── Qwen3-4B-Instruct-2507/ # 模型文件目录(通过 Git LFS 或 modelscope 等下载)
├── data/ # 数据文件目录
│ ├── train.jsonl # 训练数据集(JSON Lines 格式)
│ └── valid.jsonl # 验证数据集(JSON Lines 格式)
├── lora_config.yaml # LoRA 微调配置文件
进行 Lora 微调
输入下面的命令即可开始
mlx_lm.lora --config ./lora_config.yaml
微调完毕后将微调参数将会被放置在adapters
文件夹下
Loading configuration file ./lora_config.yaml
Loading pretrained model
Loading datasets
Training
Trainable parameters: 0.033% (1.311M/4022.468M)
Starting training..., iters: 20
Calculating loss...: 100%|██████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:00<00:00, 5.76it/s]
Iter 1: Val loss 7.973, Val took 0.708s
Iter 1: Train loss 7.321, Learning Rate 1.000e-05, It/sec 3.434, Tokens/sec 154.528, Trained Tokens 45, Peak mem 8.311 GB
略........................
Iter 50: Train loss 0.885, Learning Rate 1.000e-05, It/sec 3.658, Tokens/sec 135.350, Trained Tokens 1858, Peak mem 8.327 GB
Iter 50: Saved adapter weights to adapters/adapters.safetensors and adapters/0000050_adapters.safetensors.
Saved final weights to adapters/adapters.safetensors.
运行微调后的模型
在命令行后增加--adapter-path
指定即可
mlx_lm.generate --model ./Qwen3-4B-Instruct-2507 --adapter-path ./adapters --prompt "你谁"
代码同理
from mlx_lm import load, generatemodel, tokenizer = load("./Qwen3-4B-Instruct-2507", adapter_path="./adapters")prompt = "你谁"messages = [{"role": "user", "content": prompt}]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True
)text = generate(model, tokenizer, prompt=prompt, verbose=True)
运行结果如下
==========
你好,我是touken,一个专注于地理信息系统的智能助手。很高兴为你服务!
==========
Prompt: 10 tokens, 51.333 tokens-per-sec
Generation: 20 tokens, 12.392 tokens-per-sec
Peak memory: 8.296 GB
合并LoRA权重到基础模型
将微调权重合并,生成带微调结果的完整模型:
mlx_lm.fuse \--model ./Qwen3-4B-Instruct-2507 \--adapter-path ./adapters \--save-path ./Qwen3-4B-touken
--save-path
指定合并后的模型保存目录。
合并后可直接使用:
mlx_lm.generate --model ./Qwen3-4B-touken --prompt "你是谁?"
总结
通过MLX框架和LoRA技术,16GB的Mac电脑可高效微调Qwen3-4B-Instruct模型(约40亿参数)。关键步骤包括:
- 使用Git LFS或命令行工具从ModelScope/Hugging Face下载模型。
- 安装mlx-lm并准备JSONL格式的训练和验证数据。
- 配置LoRA参数并执行微调,内存占用约8GB。
- 运行或合并微调模型,优化地理信息系统相关任务。