【Mac】MLX:Lora微調工作流

本文詳細介紹如何在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億參數)。關鍵步驟包括:

  1. 使用Git LFS或命令行工具從ModelScope/Hugging Face下載模型。
  2. 安裝mlx-lm并準備JSONL格式的訓練和驗證數據。
  3. 配置LoRA參數并執行微調,內存占用約8GB。
  4. 運行或合并微調模型,優化地理信息系統相關任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94865.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

潤乾報表、帆軟報表的開源替代品—JimuReport(積木報表)

國產報表工具選型指南&#xff1a;潤乾報表 vs 積木報表&#xff08;JimuReport&#xff09; 如果你在尋找潤乾報表、帆軟報表的替代產品&#xff0c;JimuReport&#xff08;積木報表&#xff09;是一個值得考慮的選擇。它不僅功能全面&#xff0c;而且操作簡單&#xff0c;非常…

Tiger任務管理系統-12

今天整了一個老虎網站介紹這套任務管理開源系統&#xff0c;防止鏈接丟失&#xff0c;體驗了一把AI編程&#xff0c;雖說確實省了很多事&#xff0c;但源碼確實不敢恭維&#xff0c;尤其是修改的時候&#xff0c;真心累&#xff0c;所以還是要自己掌握核心&#xff0c;AI一時爽…

智慧農業-無人機視角莊稼倒伏農作物倒伏識別分割數據集labelme格式541張1類別

數據集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;僅僅包含jpg圖片和對應的json文件)圖片數量(jpg文件個數)&#xff1a;541標注數量(json文件個數)&#xff1a;541標注類別數&#xff1a;1標注類別名稱:["fall"]每個類別標注的框數&#xff1a;fall co…

電子電氣架構 --- 電氣/電子架構遷移已拉開帷幕

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

PPT漏斗圖,讓數據更美觀!

PPT漏斗圖制作全攻略&#xff1a;從入門到精通的實用技巧和模板推薦 無論你是職場新人還是PPT老手&#xff0c;在做數據報告或者展示項目進度的時候&#xff0c;你總覺得圖表太單調&#xff0c;數據太復雜嗎&#xff1f;這時&#xff0c;一張邏輯清晰、結構簡單的漏斗圖&#…

深入解析C++流運算符(>>和<<)重載:為何必須使用全局函數與友元機制

目錄 一、為什么需要重載為全局函數 成員函數重載的問題 全局函數的優勢 二、實現細節 1、輸出運算符<<的重載 關鍵部分詳解 1. 類定義部分 2. 運算符重載實現 3. main函數中的使用 為什么這樣設計&#xff1f; 執行流程 輸出結果 2、輸入運算符>>的重…

ENS-317 Modbus TCP / 通用模式網關

在工業自動化的復雜網絡中&#xff0c;以太網設備與串口設備的 “語言不通” 常常成為數據流轉的阻礙。上海泗博自動化推出的 ENS-317 Modbus TCP / 通用模式網關&#xff0c;以強大的協議轉換能力、靈活的配置方式和工業級可靠性&#xff0c;為設備互聯提供一站式解決方案&…

AcWing 6478. 誰進線下了?III

原題鏈接 6478. 誰進線下了&#xff1f;III - AcWing題庫 這是一道睿抗&#xff08;省賽&#xff09;題 一開始睿抗是啥都不知道 然后一看是省賽嚇得我不輕 但讀完題簡簡單單 一道很水的模擬題&#xff08;誰能解釋一下睿抗啥意思&#xff09; 一起開康康 題目 Xepa Le…

openpnp - 不連接設備,只大概測試一下攝像頭是否好使

文章目錄openpnp - 不連接設備&#xff0c;只大概測試一下攝像頭是否好使概述筆記備注備注ENDopenpnp - 不連接設備&#xff0c;只大概測試一下攝像頭是否好使 概述 頂部相機攝像頭在拆裝過程中&#xff0c;可能被手上的靜電打壞了。 現在和電腦連接是正常的&#xff0c;但是…

使用Python提取PDF大綱(書簽)完整指南

&#x1f50d; 一、PDF大綱簡介&#x1f4cc; ?PDF大綱&#xff08;Outline&#xff09;?? 是PDF文檔中的導航結構&#xff0c;通常顯示在閱讀器的側邊欄中&#xff0c;方便用戶快速跳轉到文檔的不同部分。大綱通常以層級結構組織&#xff0c;包含標題和對應的頁面位置。本文…

第39周——訓練自己的數據集

目錄 1. 下載數據 2. 配置開發環境 3. 預處理數據 &#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 1. 下載數據 百度網盤&#xff1a;百度網盤 請輸入提取碼 壓縮文件中有兩個文件夾&#xff0c;分別是Annot…

CentOS7中Docker的安裝與卸載

CentOS7 從零開始:Docker 安裝與卸載全指南(新手友好版) 作為一名剛接觸 Linux 和容器技術的新手,你是否曾在安裝 Docker 時被各種命令和報錯搞得一頭霧水?比如執行 yum install docker 時提示 “倉庫不存在”,或者啟動 Docker 后用 docker version 只顯示 client 不顯示…

解決MinIO上傳圖片后返回URL無法訪問的問題

一、問題現象 上傳接口返回了文件的訪問路徑&#xff0c;比如&#xff1a; http://127.0.0.1:9005/lease/20250808/xxx-uuid.png但是用瀏覽器直接打開該地址卻顯示權限拒絕,前端也訪問不到:二、問題原因分析 桶權限設置不正確: MinIO默認桶權限是私有的&#xff0c;即使瀏覽器能…

系統網絡端口安全掃描腳本及詳解

#!/bin/bash # 系統服務端口安全掃描 - 修正版echo " 系統服務端口安全掃描報告 "# 1. 高風險端口識別 echo "?? 對外開放的高風險端口:" awk /0.0.0.0:21/ {print " 端口 21 - FTP (明文傳輸)\n &#x1f6a8; 嚴重安全風險&#xff0c;建議…

DAY 39 圖像數據與顯存

知識點回顧 圖像數據的格式&#xff1a;灰度和彩色數據模型的定義顯存占用的4種地方 模型參數梯度參數優化器參數數據批量所占顯存神經元輸出中間狀態 batchisize和訓練的關系 一、 圖像數據的介紹 1.1 灰度圖像 從這里開始我們進入到了圖像數據相關的部分&#xff0c;也是默認…

從大數據視角理解時序數據庫選型:為何選擇 Apache IoTDB?

目錄一、什么是時序數據庫&#xff1f;為什么你需要它&#xff1f;&#x1f527;典型應用場景&#xff1a;二、時序數據庫選型維度有哪些&#xff1f;三、為什么推薦 Apache IoTDB&#xff1f;&#x1f9e0; Apache 頂級項目&#xff0c;工業 IoT 場景原生支持&#x1f680; 性…

[ MySQL 數據庫 ] 環境安裝配置和使用

目錄 一. 數據庫(DataBase) 1.定義: 2. 常見的數據庫產品&#xff1a; 3. MySQL數據庫 (1). 介紹 : (2). cmd命令行方式連接 MySQL (3). MySQL的常用命令 二. MySQL數據庫 環境安裝及配置 三. SQL 1.定義 : 2. DDL (1)數據庫 (2)數據表 1. 字段(列)和記錄(行) 2. 表特征 3.…

Numpy科學計算與數據分析:Numpy布爾索引與花式索引實戰

Numpy高級索引 學習目標 通過本課程&#xff0c;學員將掌握Numpy中布爾索引和花式索引的使用方法&#xff0c;能夠靈活運用這些高級索引技術進行復雜的數據操作和處理。 相關知識點 Numpy高級索引 學習內容 1 Numpy高級索引 1.1 布爾索引 布爾索引是Numpy中一種非常強大…

【Linux】patch補丁的生成與使用方法總結

引言 在 Linux 和開源世界中&#xff0c;patch 是一個極其強大且常用的工具。它允許開發者和系統管理員以增量方式修改文件&#xff0c;特別適用于源代碼的更新、錯誤修復、功能補丁的分發與應用。 目錄 引言 一、patch介紹 二、生成補丁文件 三、補丁文件內容解析 四、p…

雜談 001 · VScode / Copilot 25.08 更新

原文鏈接https://www.castamerego.com/blog/talk-001 2025.08.08 , VS code 發布八月更新&#xff0c;同一天 Copilot 也更新了 GPT-5, 淺體驗一下 VS code 更新 發行說明更新頁面內跳轉顯示 AI 比例頁面內跳轉 Copilot 更新 對話回溯 checkpoints頁面內跳轉進度列表頁面內…