本文詳細介紹如何在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。
- 運行或合并微調模型,優化地理信息系統相關任務。