目安: 50分。演習の状態: 未実行 (not-run)。本文は学習ガイドであり、動作や品質の実測記録ではありません。
前提となる章: RAG:知識を重みに詰め込まず参照する
独自の概念図。矢印は依存関係や判断の順序を示し、性能の実測を表さない。
- 1望ましい振る舞いの例
- 2SFTの目的
- 3全重みかLoRAの更新
- 4未学習の課題評価
- 1量子化したbase
- 2QLoRAのadapter学習
- 3推論ではbaseとadapterを併用
学習目標
- SFTとLoRAが対立する選択肢ではないと説明できる
- 小さなadapter実験の入出力と停止条件を決める
仕事の役割
- 学習者: 仮説・データ・評価を設計する
- モデル: 指定した変換を試す
- アプリ: 制限・検証・権限を保証する
入力 → 工程 → 出力
| 入力 | 工程 | 出力 |
|---|---|---|
| base model、train/valid/testのJSONL、学習設定 | baseを保持しadapterを更新、固定評価で比較 | adapter設定と重み、ログ、base参照、比較結果 |
目的と手段を分ける
SFTは望ましい入力と出力の例を使って振る舞いを調整する学習である。LoRAは更新対象を低ランクの小さな行列に絞る方法で、SFTをLoRAで行える。全重みを更新するSFTもある。QLoRAは量子化したbaseを利用しながらadapterを学習する経路で、メモリを節約するが、すべてのtensorが4bitになるわけではない。
RAGが資料を参照させる方法なのに対し、SFTは出力形式、用語の使い方、タスクの手順などを例から調整する用途で考える。FAQを暗記させるためだけにSFTを使うと、更新や出典追跡が難しくなる。RAGとSFTは必要に応じて併用できる。
LoRA原論文 は低ランクの更新を示し、QLoRA原論文 は凍結した量子化baseを通じるadapter学習を説明する。PEFTの量子化手順 は対応ライブラリの経路を示す。以下のApple Siliconコマンドの根拠は、別資料であるMLX LMのLoRA/QLoRA手順である。
少量のデータでも設計が必要
最初は自作した短い架空データで、学習の経路が動くことを確認する。正解のない質問で棄権する例、形式の境界例、誤字のある入力を含める。正例だけを増やすと、情報がないのに指定形式で断言する癖を強める場合がある。
train、valid、testを元問題単位で分ける。同じ質問を言い換えて別splitへ入れると漏洩になる。小規模なtoy実験は品質改善の証明ではない。まず基準モデルとadapter適用後に同じ固定評価を行い、目的の改善と一般能力の退行を見る。
MacとCUDAの学習経路を混ぜない
Macで試す候補はMLX LMのLoRA/量子化モデル対応である。CUDA環境ではTransformers・PEFT・TRLの組み合わせが候補になる。bitsandbytesを使う例をMacでそのまま実行できると仮定しない。各版のhardwareとquantization backendの対応を確認する。
以下のコマンドは小型MLX変換モデル、batch 1、学習対象4層、10 iterationの動作確認例で、効果検証の推奨学習量ではない。各例はchat template適用後512token以内に事前検査し、外部experiment trackerは使わない。10 iterationでも処理時間やメモリは保証できない。
手動で試すコード例
以下は未実行の例です。コピーやページの閲覧では実行されません。依存導入・モデルの初回ダウンロード・学習を伴う行は、容量、ライセンス、実行環境を確認してから自分で選んで実行してください。
手動準備したtoy-dataだけで学習経路を確認
状態: 未実行 (not-run)。
python -m pip install "mlx-lm[train]"
mlx_lm.lora --help
mlx_lm.lora --model mlx-community/Qwen2.5-0.5B-Instruct-4bit --train --data ./toy-data --iters 10 --batch-size 1 --num-layers 4 --adapter-path ./toy-adapter
mlx_lm.generate --model mlx-community/Qwen2.5-0.5B-Instruct-4bit --adapter-path ./toy-adapter --prompt "架空の商品について回答してください。" --max-tokens 128toy-data/train.jsonl、valid.jsonl、test.jsonlを事前作成。各例はtemplate適用後512token以下、個人情報なし。10 iterationはスモークテスト。初回モデル取得と依存導入が発生する。掲載コマンドは未実行。
JSONLの1レコード例
状態: 未実行 (not-run)。
{"messages": [{"role": "user", "content": "資料: 青いノートは80ページ。質問: 何ページですか。JSONで回答してください。"}, {"role": "assistant", "content": "{\"answer\":\"80ページ\",\"evidence\":\"青いノートは80ページ\",\"unknown\":false}"}]}1行1例。実在患者や顧客のデータは使わない。
自分で進める工程
- 学習前の評価を保存する
- 自作データの重複と権利を確認する
- 短い例でtoken上限を検査する
- 小型モデルで少数iterationだけ試す
- 改善が確認できたときだけデータと学習量を増やす
品質を確認する
- SFTとLoRAが対立する選択肢ではないと説明できる
- 小さなadapter実験の入出力と停止条件を決める
- 形式が良くなっただけで知識が増えたと断言していないか
失敗を切り分ける
| 注意すること | 具体的な確認方法 |
|---|---|
| adapterだけでは推論できない | 必要な基礎モデル、revision、対象モジュール、tokenizerを保存する。 |
| loss低下と用途の改善を同一視しない | 同じ未学習の課題で基準モデルと比べ、悪化した項目も確認する。 |
| 元のモデルと異なるrevisionへ無検証でadapterを適用しない | 基礎モデルのrevisionを確認し、固定した評価を再実行してから適用する。 |
演習: SFT・LoRA・QLoRAで振る舞いを変える
状態: 未実行 (not-run)。
架空の商品問い合わせを「answer」「evidence」「unknown」のJSONに変換する小さなデータセットを作る
提出するもの: 分割済みJSONLと、学習前後の形式遵守・根拠一致・棄権率
完了の確認: 形式が良くなっただけで知識が増えたと断言していないか
実験記録用ワークシートに計画・条件・観察を記録する。未測定値は null とし、推定値は式と仮定を残します。
MENTAL MODEL / メモリ
モデルの重さを、分けて考える。
重みとKVキャッシュは別々に増える。下の値は設計用の概算です。
GBは10⁹ byte。KVは32層・8 KV heads・128 head dim・FP16・batch 1の仮定。量子化メタデータ、実行バッファ、OS、モデル固有の構造は別途必要。MoEでは総重みとactive parametersを分けます。
出典
公開日は資料の日付、確認日は内容を参照した日です。コミュニティの観測は公式の確定事項と区別します。
01