HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Show HN: 4GBラップトップGPUで8Bモデルをファインチューニングする

Show HN: Fine-tune an 8B model on a 4 GB laptop GPU (github.com)

57 pointsby MakazhanAlpamys8 コメント

要約

Soupは、SSHや複雑な設定なしに、単一のコマンドでLLMのファインチューニングとポストトレーニングを可能にするツールです。特に、v0.72.4では、レイヤーストリーミング技術により、4GBのVRAMを持つラップトップGPUでもDPO、ORPO、SimPO、KTOといった高度なファインチューニング手法を実行できるようになりました。これにより、ローカル環境でのLLM開発が大幅に簡素化されます。

全文翻訳

Soupは、LLMのファインチューニングをシンプルなワークフローに変えます。1つの設定ファイル、1つのコマンドで完了します。 pip install "soup-cli[train]" # ファインチューニングには[train]を追加。ベアな`soup-cli`は軽量CLIです soup init --template chat soup train なぜSoupなのか? LLMのトレーニングは依然として困難です。経験豊富なチームでさえ、モデルの改善ではなく、インフラとの格闘に30-50%の時間を費やしています。Soupはそれを解決します。 ゼロSSH。 壊れたGPUボックスにSSHで接続する必要はもうありません。 1つの設定。 シンプルなYAMLファイルがあれば十分です。 すべて自動。 バッチサイズ、GPU検出、量子化 — すべて処理されます。 ローカルで動作。 QLoRAを使用して自分のGPUでトレーニングできます。クラウドは不要です。 新着情報 v0.72.4 — ラップトップでのアライメント: DPO、ORPO、SimPO、KTOをレイヤーストリーミングで実行。レイヤーストリーミングは、凍結されたベースモデルをVRAMから外し、一度に1つのデコーダーレイヤーずつGPUに供給します。以前は教師ありファインチューニングのみをサポートしていましたが、現在は選好損失も実行できます。 DPOの参照モデルは無料です。DPOは比較対象となる参照モデルを必要としますが、モデルのコピーをもう1つ用意するとメモリが倍増し、本来の目的が失われます。Soupは、アダプターを切り替えることで同じストリームベースを使用します — 重みは1セット、ストリームも1つです。RTX 3050 4GBで測定した結果、ストリームDPOは教師ありファインチューニングのピークの0.914倍を記録しました。同じテストで実際の2番目のモデルを強制すると、+730MBのコストがかかりました — これは重みのコピー1つ分に相当します。KTOは参照フリーではありませんが、通常説明されるように、DPOと同じ方法で参照を選択するため、同様の扱いを受けます。同じ損失の通常の非ストリーミング実行とビット単位で一致 — 差は0.0、これはこのシリーズの各リリースがクリアしなければならない基準です。ペアになった損失は行数が倍になるため、VRAMの事前チェックでは、選択されたテンソルと拒否されたテンソルがモデルを1つのテンソルとして通過することが認識されます。正直なコスト: 参照モデルはメモリ上では無料ですが、時間上では無料ではありません — DPOは、教師ありファインチューニングよりもステップあたり1.52倍多くレイヤースタックを読み取ります。grpo / ppoは意図的に除外されています: 生成はトークンごとにすべてのレイヤーを再読み取りしますが、これはストリーミングでは償却できません。 まだBETA版です。 # soup.yaml — その後、`soup train --config soup.yaml` を実行するだけです training: stream_layers: true # ベースモデルはVRAMからストリームされ、アダプターのみがトレーニングされます quantization: 4bit # NF4 — 約4倍のストレージ、8Bモデルが4GBカードに収まります batch_size: 4 # v0.72.3: より大きなバッチサイズで重みの読み取りを償却します stream_source: auto # RAMに収まる場合はRAM、そうでない場合はNVMeディスク v0.72.0で`stream_layers: true`を使用してトレーニングしましたか?そのアダプターは不活性です — 重みは追加の`.inner.`セグメントを持つキーの下に保存されたため、すべてのローダーがチューニングされていないベースモデルを返しました。v0.72.1で修正されました。再実行または再保存してください。確認方法: python -c "from safetensors.torch import load_file; print([k for k in load_file('adapter_model.safetensors') if '.inner.' in k][:3])" 前回のリリース — v0.71.40、Soup Reward Synth(データから報酬検証器を生成) Soup reward synthをJSONL形式の参照出力に向け、決定論的な検証器を推論し、読みやすくコミット可能な.py報酬関数を書き出します。そして、誰もがやっていないことですが、参照と不正解を区別できないものを生成することを拒否します(4つのファミリー: 数値 / json_schema / regex / tool_call。必須のキャリブレーションレポートが防御壁となります)。報酬アンサンブル(reward_fn: "accuracy,format")も現在トレーニング可能です。(#311) soup reward synth references.jsonl -o reward.py --output-report calib.json 前回のリリース — v0.71.39、重みに対するCI、プロンプトではない(シップの判定結果を生成 + プロビナンスバインド) Soup shipの判定結果が生成可能、コミット可能、プロビナンスバインド可能になりました — `--emit-evidence`は実行を同一の判定結果にリプレイし、`eval.ship`を`soup.yaml` + `--config`でポリシーレビュー可能にし、`--config`は証拠を生成した正確なレシピにバインドします(古い証拠 → 終了コード3)。`soup ship --push owner/repo#N`はPRにSHIP / DON'T-SHIPカードを投稿します。 前回のリリース — v0.71.38、ゲートに歯が生える(実際のレッグ2回帰ゲート) Soup shipの回帰レッグが現実のものとなりました。7つのバンドルされたオフラインスイート(MCQ · 算術 · ツール呼び出し · JSON妥当性 · 安全性/拒否)に対する固定された抽出ベースのスコアラーです。タスクに勝利してもツール呼び出しを静かに壊すチューニングは、DON'T SHIPになります。新規依存関係なし。 soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl # 終了コード 0 = SHIP · 2 = DON'T SHIP · 3 = 不正なフラグ · 1 = ランタイムエラー 前回のリリース — v0.71.33、Soup Draft(投機的デコーディングの測定) Soup draft measureは、ドラフトモデルの受け入れ率と実際のプレーン対アシストトークン/秒を報告します(CI向け終了コード0/2/1)。`soup draft distill`はターゲットを密な小さなドラフトに蒸留し、`soup serve --auto-spec`に自動配線します。小さな同系統ペアでの正直な結果: 蒸留は受け入れ率を変化させず(69.3% → 69.3%)、アシストデコーディングは全体として遅延しました — これは投機的デコーディングをリリースする前に知りたい数値です。 soup draft measure --target ./my-tuned-model --draft HuggingFaceTB/SmolLM2-135M-Instruct \ --prompts prod-prompts.jsonl # -> 受け入れ率%、実際のトークン/秒、シップ/ノット 完全な履歴: CHANGELOG.md · GitHub Releases。 クイックスタート 1. インストール # 軽量コア: CLI + 設定 + データツール、PyTorchなし pip install soup-cli # トレーニングスタックを追加(torch, transformers, peft, trl, datasets, …) pip install "soup-cli[train]" # すべて(トレーニング + サーブ + UI + データ)を一度に pip install "soup-cli[all]" # またはGitHubから(最新の開発版) pip install git+https://github.com/MakazhanAlpamys/Soup.git 完全な extras テーブル(fast, mlx, serve, eval, ui, vision, audio, …)は docs/models.md にあります。エクストラには二重引用符を使用してください。これらはすべてのシェル(cmd.exe、PowerShell、bash、zsh)で機能する唯一のスペルです。古いチュートリアルやビデオ(一部は弊社作成のものも含む)では、単一引用符で `pip install 'soup-cli[train]'` と表示されています。これはbash / zsh / PowerShellの構文であり、Windows cmd.exeでは失敗します。cmd.exeは単一引用符のクォーティングがなく、引用符をそのままpipに渡します: ERROR: Invalid requirement: "'soup-cli[train]'”: Expected package name at the start of dependency specifier もしこれに遭遇したら、' を " に置き換えてください — pipはリテラルの引用符文字を拒否しており、パッケージ自体に問題はありません。(引用符を完全に省略してもWindowsでは機能しますが、zshは[train]をグロブとして読み取り、失敗します。) soup init、soup data …、その他のデータ/検査コマンドは軽量インストールで動作します。ファインチューニング(soup train)には[train]エクストラが必要です。 2. 設定を作成 soup init # インタラクティブウィザード soup init --template chat # またはテンプレートから開始 テンプレート: chat, code, tool-calling, medical, reasoning, vision, kto, orpo, simpo, ipo, bco, rlhf, pretrain, moe, longcontext, embedding, audio。 3. トレーニング、テスト、シップ soup train --config soup.yaml # LoRA、量子化、バッチ処理 — すべて処理されます soup chat --model ./output # モデルと対話する soup push --model ./output --repo you/my-model soup merge --adapter ./output # LoRAをベースモデルにマージする soup export --model ./output --format gguf --quant q4_k_m # Ollama / llama.cpp 用のGGUF その他のエクスポートターゲット(ONNX、TensorRT、AWQ、GPTQ、BitNet)およびデプロイメントオプションは docs/serving-and-export.md にあります。 設定 完全な soup.yaml: base: meta-llama/Llama-3.1-8B-Instruct task: sft # backend: unsloth # 2-5倍高速、pip install "soup-cli[fast]" data: train: ./data/train.jsonl format: alpaca val_split: 0.1 training: epochs: 3 lr: 2e-5 batch_size: auto lora: r: 64 alpha: 16 quantization: 4bit output: ./output config/schema.py はすべてのフィールドの単一の真実の情報源です。高度なデータ、トレーニング、PEFTオプションはドキュメントの下に記載されています。 ドキュメント 完全な機能リファレンスは docs/ にあります。ここから開始してください: ガイド トレーニングタスクと方法 SFT、DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO、ツール呼び出し、PRM、事前トレーニング、蒸留、分類、ビジョン/オーディオ/TTS、アンラーニング、RAFT/RA-DIT、ループ硬化検出器 PEFT、長コンテキストと効率 DoRA、LoRA+、rsLoRA、VeRA、OLoRA、NEFTune、PiSSA、ReLoRA、オプティマイザーとPEFTのズー、LLaMA Pro、