模型 / 資料集
ARahim3/mlx-tune avatar
ARahim3/mlx-tune

mlx-tune:在 Apple Silicon 上以 Unsloth 相容 API 做微調,換來的是腳本可攜性而非效能

Fine-tune LLMs on your Mac with Apple Silicon. SFT, DPO, GRPO, Vision, TTS, STT, Embedding, and OCR fine-tuning — natively on MLX. Unsloth-compatible API.

1,406 個 Star92 個 ForkPythonApache-2.0

秒懂

它是什麼?
mlx-tune 把 Apple 的 MLX 包成 Unsloth 風格的介面,讓同一份 FastLanguageModel 訓練腳本在 Mac 上先跑通、再搬去 CUDA 叢集。它的賣點是流程可攜,不是訓練速度。
適合誰用?
如果你已經在用 Unsloth 的 FastLanguageModel 介面,而且需要在 Mac 上先驗證資料集與超參數再上雲,mlx-tune 值得裝起來試:它讓同一份腳本兩邊都能跑。反過來說,若你的目標是壓榨單機訓練吞吐、或需要多卡與 Triton 核心,這個專案幫不上忙,README 本身就寫明不是要取代 Unsloth。
可以商用嗎?
可以。Apache-2.0 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫最近一次提交在 84 天前。
用什麼語言寫的?
主要是 Python(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

它解決的是「同一份腳本換機器」的摩擦

專案作者在 README 的個人說明裡把動機講得很直白:他日常在雲端 GPU 上用 Unsloth,後來換到 MacBook M4 工作,想先在本地原型、再放大到雲端,卻不想整個訓練腳本重寫。Unsloth 依賴 Triton,而 Mac 上沒有 Triton,所以本地這條路走不通。mlx-tune 的定位就是補這個缺口,把 Apple 的 MLX 包成 Unsloth 相容的 API。

因此它的目標讀者不是「想在自己電腦上跑大模型」的一般使用者,而是已經熟悉 Unsloth 訓練流程、手上有一台 Apple Silicon 機器、需要快速迭代資料管線與超參數的工程師。README 把這條路徑畫成兩段:本地用 mlx-tune 做原型與小資料集實驗,雲端用 Unsloth 做全量訓練。這個分工決定了它的設計取向,也決定了它不該被拿來比訓練速度。

相容層的實際形狀:改 import 就結束

README 給的對照範例只有兩行 import 的差別。CUDA 端是 from unsloth import FastLanguageModel 與 from trl import SFTTrainer,Apple Silicon 端換成 from mlx_tune import FastLanguageModel 與 from mlx_tune import SFTTrainer,其餘程式碼不變。這是整個專案最核心的機制:它不是在 MLX 上重新發明一套訓練抽象,而是讓既有的 Unsloth 呼叫慣例成立。

值得注意的是專案原本叫 unsloth-mlx,後來改名為 mlx-tune。README 說明原因是它並非 Unsloth 官方專案,避免混淆。對既有使用者來說這是一次破壞性變更:套件名稱從 pip install mlx-tune 取代舊名,匯入路徑也從 unsloth_mlx 改成 mlx_tune。如果你的專案裡有舊的 import,升版時必須一併改掉,否則會在載入階段就失敗。

訓練方法覆蓋面在 README 的狀態表裡列得相當完整:SFT、DPO、ORPO、GRPO、KTO、SimPO 都標為 Stable,其中 DPO 標註完整 DPO loss、GRPO 標註多輪生成加獎勵、KTO 與 SimPO 各自有對應的 Config 類別。資料處理層面提供 train_on_responses_only()、to_sharegpt() 搭配 conversation_extension 做多輪合併,以及 apply_column_mapping() 自動改欄名。這些函式名稱與 Unsloth 生態重疊,正是可攜性的來源。

安裝與版本前提:Python 3.9+、MLX 0.20+

安裝指令依 README 為 pip install mlx-tune。版本前提寫在徽章列:Python 3.9 以上、MLX 0.20 以上、平台為 Apple Silicon。這三項是硬性的,MLX 本身只支援 Apple 晶片,所以 Linux 或 Intel Mac 不在支援範圍內,這不是設定問題而是後端限制。

匯出環節的關鍵函式是 save_pretrained_merged。README 的 v0.5.1 版本說明指出,這個函式在量化基底模型上曾經出錯,對應 issue #15,該版即為修正。這條線索值得記住:如果你的流程是「先載入量化模型、微調、再合併權重匯出」,請確認版本至少在 v0.5.1 之後。README 也把 GGUF 匯出列為支援,但同時在 Known Limitations 一節標註該路徑有已知限制,實際能涵蓋哪些模型架構,需要自行核對該節內容,不能預設所有模型都能順利轉出。

載入端聲稱支援任何 HuggingFace 模型,包含量化與非量化。這句話的邊界在於「任何」通常指架構已被 MLX 側實作涵蓋者,README 沒有給出完整的模型清單,因此採用前最好先用你要的模型跑一次載入,而不是先寫完整條訓練管線。

v0.6.0 把 JEPA 家族搬上 MLX,這是超出微調範圍的一步

最新版本 v0.6.0 的標題是 JEPA comes to Apple Silicon,內容涵蓋整個 JEPA 家族。LeJEPA 是從零預訓練 Vision Transformer,使用 README 所稱的無啟發式 SIGReg 目標,並強調不需要 EMA teacher、不需要 predictor、不需要 stop-gradient。I-JEPA 載入 Meta 的預訓練影像編碼器 facebook/ijepa_*,支援凍結、LoRA 與全量分類微調。V-JEPA 2 載入 facebook/vjepa2-*,支援影片分類、clip 特徵、masked-latent predictor(predict_latents 搭配 latent_energy)以及 Meta 微調過的 SSv2 動作分類器,README 稱其為 174 類、零訓練即可用。LLM-JEPA 則引用 arXiv 2509.14252,把 JEPA 目標加在 LLM 微調上,對同一筆資料的兩個視角(例如描述與其程式碼)做對齊,README 稱其為 MLX 上首見,產出物是普通的 LoRA 模型。

新增的進入點是 FastJEPAModel、FastVideoJEPAModel 與 LLMJEPATrainer。這一段值得獨立看待,因為它和「Unsloth 相容」的主線是兩件事:JEPA 系列不是 Unsloth 有的東西,而是這個專案自行擴充的範圍。對只想要 SFT 與 DPO 的使用者來說,這部分可以忽略;對做表徵學習或影片理解的人來說,這是 Mac 上少見的選項。但也要注意,README 對這些路徑的敘述集中在功能有無,沒有提供訓練成本或收斂行為的說明,實際可行性得自己驗證。

音訊與視覺的覆蓋範圍,以及它不打算做的事

README 列出 5 個 TTS 模型(Orpheus、OuteTTS、Spark、Sesame、Qwen3-TTS)與 7 個 STT 模型(Whisper、Moonshine、Qwen3-ASR、NVIDIA Canary、Voxtral、Voxtral Realtime、NVIDIA Parakeet TDT),視覺端則透過 mlx-vlm 做完整 VLM 微調,狀態表舉例提到 Gemma 3 系列。Chat template 支援 16 個模型,涵蓋 llama、gemma、qwen、phi、mistral 家族。這種廣度對照的是「一個 Mac 使用者手上可能出現的各種任務」,而不是深度最佳化。

專案自己劃的界線很清楚。README 有一段 What This Is (and Isn't),明白寫出這不是 Unsloth 的替代品,也不是要跟它競爭,並稱 Unsloth 是 CUDA 上高效微調的標準。作者在個人說明裡也重申目標不是效能超越,而是程式碼可攜性。這種自我定位在開源專案裡不常見,好處是期待管理明確:你不該拿它跟 Unsloth 比訓練吞吐,因為那從來不是它的宣稱。

什麼情況下它會是錯的工具

第一個明確的失敗模式是硬體。MLX 只跑 Apple Silicon,所以任何 Linux 訓練機、任何 NVIDIA 卡都不在範圍內。如果你的團隊已經有 CUDA 叢集,這個專案的角色僅限於個人筆電上的前置實驗,放進正式流水線沒有意義。

第二個是規模。README 把兩段流程的適用範圍寫成:本地端對應原型、小資料集、快速迭代;雲端端對應全量訓練、大資料集、正式執行。這等於承認本地這條路不適合當最終訓練環境。Mac Studio 的統一記憶體上限雖然在 README 裡被寫成最高 512GB,但記憶體容量不等於算力,長序列或大 batch 的訓練吞吐仍受晶片本身限制。

第三個是匯出。save_pretrained_merged 在量化基底上的問題要到 v0.5.1 才修掉,而 GGUF 匯出在 README 中被標為有已知限制。也就是說,如果你的下游是 Ollama 或 llama.cpp,這條路徑需要先實測,不能只看功能表上的勾選。

第四個是生態成熟度。這是一個由個人維護、自我描述為「非官方、由愛好者為愛好者所建」的專案。README 的狀態表把多數功能標為 Stable,但沒有給出測試覆蓋率或回歸測試的說明。把它放進需要長期維護的生產管線前,應該先評估自己是否願意承擔上游變動的風險。

替代方案:直接寫 MLX 或留在雲端,差別在抽象層

最直接的替代是 Apple 官方的 MLX 與其上的 mlx-lm、mlx-vlm。差別在抽象層級:MLX 給你的是陣列與模型層的原語,訓練迴圈、優化器排程、資料整理都要自己接;mlx-tune 則提供 FastLanguageModel、SFTTrainer 這一層,讓習慣 Unsloth 的人不必重寫。代價是你被綁在它的 API 表面上,若某個訓練方法在 mlx-tune 尚未支援,你仍得回到 mlx-lm 自己寫。

另一個替代是留在雲端。如果本地原型的目的是省錢與加快迭代,那麼用小型雲端 GPU 按時計費也是一條路,而且不需要處理 Mac 與 CUDA 之間的 API 差異。mlx-tune 的價值只在於「你本來就有 Mac、而且本來就寫 Unsloth 風格腳本」這個交集內。離開這個交集,它的優勢就消失了。

至於 Unsloth 本身,兩者不是同層級的競爭關係。Unsloth 在 CUDA 上提供 Triton 核心與最佳化,mlx-tune 在 Mac 上提供介面相容。真正的差異是硬體後端,而不是功能對等功能。理解這一點,才不會對它的訓練速度產生錯誤期待。

授權、維護成本與升級時要盯的地方

授權為 Apache-2.0,屬於寬鬆授權,允許修改與再散布,並包含專利授權條款。實際使用時仍須留意兩層上游:MLX 與 HuggingFace 上各模型的授權各自獨立,微調後的權重通常繼承基底模型的授權條件。這不是法律意見,採用前應自行核對基底模型與 MLX 的授權條款。

維護成本主要來自版本連動。這個專案追蹤 MLX 的演進,README 的徽章已經把 MLX 0.20 以上列為前提,而 v0.5.0 的版本說明是各訓練器的效能改進,v0.5.1 是修正 save_pretrained_merged 在量化基底上的問題,v0.6.0 則一次加入整個 JEPA 家族。這種節奏意味著 API 表面仍在擴張,升級時值得優先檢查三處:FastLanguageModel 的載入介面、save_pretrained_merged 的匯出行為、以及各 Trainer 對應的 Config 類別(KTOConfig、SimPOConfig 等)。從舊名 unsloth-mlx 遷移過來的人,還要記得把 import 從 unsloth_mlx 改成 mlx_tune。

最後一點關於專案狀態。README 的功能表把 SFT、模型載入、存檔匯出、DPO、ORPO、GRPO、KTO、SimPO、chat template、response-only 訓練、多輪合併、欄位映射、資料集設定、視覺模型都標為 Stable,這是一份相當樂觀的自評。由於沒有公開的測試數據可以對照,建議把它當成「作者目前認為可用」的訊號,而不是經過外部驗證的成熟度證明。

編輯結論

如果你已經在用 Unsloth 的 FastLanguageModel 介面,而且需要在 Mac 上先驗證資料集與超參數再上雲,mlx-tune 值得裝起來試:它讓同一份腳本兩邊都能跑。反過來說,若你的目標是壓榨單機訓練吞吐、或需要多卡與 Triton 核心,這個專案幫不上忙,README 本身就寫明不是要取代 Unsloth。動手前先確認三件事:你的 Python 是否 3.9 以上、MLX 是否 0.20 以上、以及你要匯出的格式是否落在 README 標示的 save_pretrained_merged 已知限制內。這三項任一不符,後面省下的重寫時間都會被抵銷。

官方來源

  1. ARahim3/mlx-tune on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
社群筆記

社群筆記