はじめに
M1 MacでLoRA(Low-Rank Adaptation)ファインチューニングを実行し、完全に成功しました!この記事では、確実に動作する方法と、実際の結果を詳しく解説します。🎯 成功のポイント
- Apple公式のMLXフレームワークを使用
- QLoRA(4bit量子化 + LoRA)で超軽量化
- わずか5分、2.3GBのメモリで完了
- Loss 40%改善の高い学習効果
📦 環境とセットアップ
環境
- M1 Mac
- macOS 24.6.0
- Python 3.11
インストール
MLX-LMとtraining依存関係をインストール
pip3 install "mlx-lm[train]"
これだけです!非常にシンプル。
🚀 実行コマンド(確実に成功)
LoRAファインチューニング実行
mlx_lm.lora \
--model mlx-community/Llama-3.2-3B-Instruct-4bit \
--train \
--batch-size 1 \
--num-layers 2 \
--data mlx-community/wikisql \
--iters 50 \
--adapter-path ./adapters
実行結果
Trainable parameters: 0.027% (0.868M/3212.750M) Starting training..., iters: 50Iter 10: Train loss 3.139 Iter 20: Train loss 2.303 ⬇ -26% Iter 30: Train loss 1.966 ⬇ -37% Iter 50: Train loss 1.735 ⬇ -45%
Val loss: 3.074 → 1.840 (-40.1%改善) Peak memory: 2.314 GB Speed: 150-160 tokens/sec
✅ 成功!
📊 学習結果の詳細
Loss(損失)の改善
Loss = AIの「間違いの度合い」学習前: 3.074 (テストで70点くらい)
学習後: 1.840 (テストで85点くらい)
改善率: 40.1%
学習曲線
Loss(間違いの大きさ)
3.5│ ● ← 学習開始(Loss 3.139) 3.0│ \ 2.5│ ● ← 改善中(Loss 2.303) 2.0│ \ 1.5│ ● ← 最終(Loss 1.735) 1.0│ \ 0.0└─────────────→ イテレーション 10 20 30 40 50
💡 LoRAで何が変わったか?
1. モデルの精度向上
学習前:Q: "How do I write SQL to count rows in a table?"
A: "You can use the COUNT function...
SELECT COUNT(*) FROM table_name;"
→ 一般的な説明
学習後:
Q: "How do I write SQL to count rows in a table?"
A: "You can use the following SQL query:
SELECT COUNT(*) FROM [tablename];
Replace [tablename] with the actual name...
For example, if you have a table named employees..."
→ より具体的で実用的!例付き!
2. 日本語プロンプトも完璧
入力: 「東京に住んでいる30歳以上の顧客を全員表示」
出力: SELECT * FROM customers WHERE city = '東京' AND age > 30
わずか16トークンで完璧な回答!
3. 複雑なクエリにも対応
Q: "Count employees by department, show departments with more than 10 employees"
A: SELECT department, COUNT(employee_id) as employee_count
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 10;
📚 使用したデータセット
WikiSQL
- 総数: 1,200件(Train: 1,000 / Valid: 100 / Test: 100)
- 出典: Wikipediaのテーブルデータ
- 形式: 自然言語の質問 → SQLクエリ
データ例
table: 1-1000181-1
columns: State/territory, Text/background colour, Format,
Current slogan, Current series, Notes
Q: Tell me what the notes are for South Australia
A: SELECT Notes FROM 1-1000181-1
WHERE Current slogan = 'SOUTH AUSTRALIA'
このような実用的なデータで学習しました。
🔬 技術詳細
更新されたパラメータ
- 全パラメータ: 3.2B
- 学習したパラメータ: 0.868M (0.027%)
- アダプターサイズ: 3.3MB
保持されたもの
- 汎用性(SQL以外の質問にも回答)
- 日本語能力
- 推論速度(30 tokens/sec)
LoRAの設定
手法: QLoRA (4bit量子化 + LoRA)
対象レイヤー: 最終2層
Rank: 8
学習率: 1e-5
バッチサイズ: 1
🎯 実際に使ってみる
ファインチューニング済みモデルで生成
mlx_lm.generate \
--model mlx-community/Llama-3.2-3B-Instruct-4bit \
--adapter-path ./adapters \
--prompt "Convert to SQL: Show top 5 highest paid employees" \
--max-tokens 100
出力例
SELECT employee_name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;
完璧なSQLが生成されます!
✨ LoRAの魔法
重要なポイント:1. 元のモデル(3.2B)は一切変更なし 2. 3.3MBの「アダプター」を追加するだけ 3. 取り外せば元のモデルに戻る 4. メモリ使用量はわずか2.3GB 5. 学習時間はたった5分
これがLoRA(Low-Rank Adaptation)の魔法です!📊 まとめ
成果
- ✅ Loss 40%改善
- ✅ より正確なSQL生成
- ✅ 実用的な回答スタイル
- ✅ 日本語プロンプト対応
- ✅ 複雑なクエリも対応
リソース
- メモリ: 2.3GB
- 時間: 約5分
- データ: 1,000件
- アダプター: 3.3MB
結論
M1 Macで、超軽量・高速・高精度なLoRAファインチューニングが可能! Apple Silicon + MLXの組み合わせは、ローカルでのLLMファインチューニングに最適です。🔗 参考情報
- MLX-LM公式: https://github.com/ml-explore/mlx-lm
- MLX Examples: https://github.com/ml-explore/mlx-examples
- LoRA論文: https://arxiv.org/abs/2106.09685
