DeepSeekモデルファインチューニングチュートリアル
DeepSeekモデルをあなた専用のAIアシスタントにカスタマイズ。データ準備からモデルデプロイまで、完全なファインチューニングの流れを、すぐ実行可能なコードと設定付きで紹介します。
学習を始めるファインチューニング概要
ファインチューニングを始める前に、ファインチューニングとは何か、いつ必要か、そしてファインチューニングの種類を理解しましょう。
モデルファインチューニングとは?
モデルファインチューニングとは、事前学習済みの大規模言語モデルを、特定のドメインのデータを使って追加学習し、特定のタスクでのパフォーマンスを向上させることを指します。DeepSeekモデルはすでに強力な汎用能力を備えていますが、医療診断、法律相談、金融分析、コードレビューなどの垂直領域でより専門的に動作させる必要がある場合、ファインチューニングが最も効果的な方法です。
ファインチューニングとプロンプトエンジニアリングの使い分け
これは多くの開発者が最初に抱く疑問です。判断基準は以下の通りです:
- モデルに特定のドメイン知識(医学、法律、金融など)を習得させる必要がある
- 特定の出力形式(JSON構造、特定のテンプレート)が必要
- 特定の文体やトーンを模倣する必要がある
- プロンプトが長すぎて、コンテキストで要件を完全に記述できない
- 推論コストを削減する必要がある(ファインチューニング後の小規模モデルで大規模モデルを代替可能)
- レイテンシを削減する必要がある(ファインチューニング後は複雑なプロンプトが不要)
- タスクが比較的単純で、数文で明確に記述できる
- データ量が不足している(高品質なサンプルが100件未満)
- 要件が頻繁に変わり、繰り返しトレーニングしたくない
- 一時的な使用のみで、長期的なメンテナンスが不要
- ファインチューニングによる他の能力の低下を懸念している
ファインチューニングの主な種類
LoRAファインチューニング
低ランク適応(Low-Rank Adaptation)は、元のモデルに小さなパラメータ行列を追加し、これらの新しいパラメータのみをトレーニングします。VRAM要件が低く、トレーニング速度が速く、単一GPUで7Bモデルのファインチューニングが可能です。現在最も主流で推奨されるファインチューニング方法です。
- VRAM要件:7Bモデルで約16GB
- トレーニング速度:速い(数時間)
- モデル品質:フルファインチューニングに近い
- 元のモデルにマージ可能
QLoRAファインチューニング
LoRAに4ビット量子化を追加し、モデルパラメータを4ビット精度に圧縮します。VRAM要件がさらに低減され、コンシューマー向けGPU(例:RTX 3090 24GB)で7Bモデルのファインチューニングが可能です。LoRAよりわずかに遅いですが、結果は同等です。
- VRAM要件:7Bモデルで約8-10GB
- トレーニング速度:中程度(数時間)
- モデル品質:LoRAと同等
- コンシューマー向けGPUに適しています
フルファインチューニング
モデルの全パラメータを更新し、理論上最も良い結果が得られますが、大量のGPUメモリが必要です。7Bモデルには約60-80GBのVRAMが必要で、通常は複数GPUトレーニングまたはDeepSpeed ZeRO最適化が必要です。十分な計算リソースを持つチームに適しています。
- VRAM要件:7Bモデルで約60-80GB
- トレーニング速度:遅い(数日)
- モデル品質:最適
- 複数GPU/A100が必要
DeepSeekモデルファインチューニングの特別な利点
DeepSeekモデルはMoE(混合エキスパート)アーキテクチャを採用しており、ファインチューニングにおいて以下の利点があります:
- Denseモデル(例:DeepSeek-Coder-6.7B):標準アーキテクチャで、LoRA/QLoRAのサポートが充実し、コミュニティリソースが豊富
- MoEモデル(例:DeepSeek-V2-Lite):推論ごとに一部のエキスパートのみをアクティブ化し、推論効率が高く、ファインチューニング時に特定のエキスパートを対象に最適化可能
- 公式コードサポート:DeepSeek公式GitHubリポジトリに完全なファインチューニングコードが用意されており、すぐに使用可能
- MITオープンソースライセンス:ファインチューニング後のモデルは制限なく商用利用可能
DeepSeekモデルアーキテクチャの詳細については、DeepSeekモデルアーキテクチャ詳細 および DeepSeekオープンソースモデル一覧 をご覧ください。
環境準備
ファインチューニングを開始する前に、必要なPython依存ライブラリのインストールとGPU環境の設定が必要です。
ハードウェア要件
| ファインチューニング方法 | 1.5Bモデル | 7Bモデル | 16Bモデル | 推奨GPU |
|---|---|---|---|---|
| QLoRA (4-bit) | ~4GB | ~8-10GB | ~16-20GB | RTX 3060 12GB以上 |
| LoRA (FP16/BF16) | ~8GB | ~16-20GB | ~32-40GB | RTX 3090/4090 24GB |
| 全パラメータファインチューニング | ~20GB | ~60-80GB | ~120-160GB | A100 80GB / マルチGPU |
依存ライブラリのインストール
新しいPython仮想環境を作成し、以下の依存関係をインストールします:
環境の検証
インストール後、以下のPythonスクリプトを実行して環境が正常かどうかを検証します:
環境に関する注意事項
- bitsandbytes のインストール:Windowsユーザーはソースからコンパイルする必要がある場合があります。WSL2またはLinux環境を推奨します
- CUDAバージョンの一致:PyTorchのCUDAバージョンは、システムにインストールされているCUDAドライババージョンと互換性がある必要があります
- クラウドGPUの推奨:ローカルGPUがない場合は、AutoDL、恒源云などの国内GPUクラウドプラットフォームを推奨します
データセット準備
高品質なデータは微調整成功の鍵です。この節では、データ形式、データ品質要件、データ準備のベストプラクティスを紹介します。
データ形式
微調整データは通常、JSONまたはJSONL形式を使用します。各データは命令(instruction)と対応する出力(output)を含み、オプションで入力(input)フィールドを含むことができます。
Alpaca形式(推奨)
Alpaca形式は微調整コミュニティで最も一般的に使用されるデータ形式であり、DeepSeekモデルとの互換性が最も高いです:
チャット形式(会話データ)
会話データがある場合は、ShareGPT形式またはconversations形式を使用できます:
データ品質の推奨事項
- 最低100〜200件の高品質サンプル
- 推奨500〜2000件
- 簡単なタスクは500件で十分
- 複雑なタスクは2000件以上を推奨
- 異なる難易度とシナリオをカバー
- 重複または類似性の高いサンプルを避ける
- 長文と短文を混在させる
- エッジケースを含める
- 出力は正確でなければならない
- コード例は実行可能であること
- 専門分野の知識は検証が必要
- フォーマットを一貫させる
- 統一された出力形式
- 一貫したトーンとスタイル
- 同じ用語の使用
- 統一された句読点規則
データの品質は量よりも重要
高品質なデータ500件は、低品質なデータ5000件よりもはるかに効果的です。各サンプルは手動でレビューし、出力が正確で形式が整っていることを確認する必要があります。データ品質が悪いと、ファインチューニングはモデルの元の能力を損なう可能性があります。
DeepSeekを使用したトレーニングデータの生成
DeepSeek自体を利用して高品質なトレーニングデータを生成できます。以下は実用的なデータ生成戦略です:
DeepSeek APIの詳細な使用方法は、DeepSeek使用チュートリアルを参照してください。
LoRA ファインチューニング(推奨)
LoRA は現在最も推奨され、実用的なファインチューニング方法です。このセクションでは、QLoRA ファインチューニングの完全なコードと詳細なパラメータ説明を提供します。
LoRA ファインチューニングの原理
LoRA(Low-Rank Adaptation)の核となる考え方は、事前学習モデルの重みに低ランク行列を追加し、これらの新しい行列パラメータのみを訓練し、元のモデルの重みは変更しないことです。これにより、訓練するパラメータ数とメモリ要件が大幅に削減されます。
具体的には、元の重み行列 W(d x k)に対して、LoRA はその更新を2つの小さな行列の積に分解します:W + delta_W = W + B * A。ここで、A は r x k 行列、B は d x r 行列、r はランクで、通常 8〜64 です。r が d や k よりはるかに小さいため、訓練パラメータ数が大幅に削減されます。
QLoRA ファインチューニングの完全なコード
以下は、QLoRA(4ビット量子化 + LoRA)を使用して DeepSeek モデルをファインチューニングするための完全な Python スクリプトです:
主要パラメータの説明
| パラメータ | 推奨値 | 説明 |
|---|---|---|
| r (rank) | 8-64 | ランクが大きいほど表現力が高まりますが、学習パラメータとGPUメモリも増加します。単純なタスクではr=8で十分ですが、複雑なタスクではr=32-64を使用できます。 |
| lora_alpha | rの2倍 | スケーリング係数。LoRAの重みが元のモデルに与える影響を制御します。通常はrの2倍に設定します。 |
| learning_rate | 1e-4 ~ 5e-4 | 学習率。LoRAは通常、全パラメータ微調整よりも高い学習率を使用します。推奨は2e-4です。 |
| num_train_epochs | 2-5 | エポック数。データ量が少ない場合はエポック数を増やし、多い場合は2-3エポックで十分です。過学習を防ぐため、損失曲線に注意してください。 |
| max_seq_length | 2048-4096 | 最大シーケンス長。長いテキストの学習にはより多くのGPUメモリが必要です。DeepSeek-Coderは16Kコンテキストをサポートしています。 |
トレーニングの実行
上記のコードを train_lora.py として保存し、実行します:
トレーニング高速化のヒント
- gradient_checkpointingを使用:計算とメモリをトレードオフします。TrainingArgumentsで
gradient_checkpointing=Trueを設定します。 - batch_sizeを調整:GPUメモリが不足している場合は、per_device_train_batch_sizeを減らし、gradient_accumulation_stepsを増やします。
- Flash Attention 2を使用:flash-attnライブラリをインストールし、モデル読み込み時に
use_flash_attention_2=Trueを設定すると、2〜3倍高速化できます。
モデルのダウンロードとデプロイの詳細は、DeepSeekモデルダウンロード と DeepSeekデプロイチュートリアル を参照してください。
全パラメータ微調整
全パラメータ微調整は理論上最も良い結果が得られますが、大量のGPUメモリが必要です。このセクションでは、DeepSpeed ZeROを使用した全パラメータ微調整の方法を紹介します。
全パラメータ微調整の要件
全パラメータ微調整ではモデルのすべてのパラメータを更新するため、モデル全体をGPUメモリにロードする必要があります。7Bモデルの場合、モデルの重みだけで約14GB(FP16)が必要で、オプティマイザの状態と勾配を加えると、合計で約60〜80GBのGPUメモリが必要です。そのため、通常は複数GPUでのトレーニングや、A100/H100などの大容量メモリを備えたGPUが必要です。
DeepSpeed ZeROの設定
DeepSpeed ZeROは、オプティマイザの状態、勾配、モデルパラメータを複数のGPUに分散することで、GPUあたりのメモリ要件を大幅に削減します。以下は、DeepSeekモデルの全パラメータ微調整のためのDeepSpeed設定です:
全パラメータ微調整のトレーニングスクリプト
マルチGPUトレーニングの開始
全パラメータ微調整 vs LoRA 選択の推奨事項
- LoRAを優先: ほとんどのシナリオで、LoRAの効果は全パラメータ微調整と差がほとんどありません(通常 < 2%)が、コストははるかに低いです
- 全パラメータ微調整が適している場面: 新しい分野でモデルの動作を大幅に変更する必要がある場合、十分な計算リソースがある場合、究極のパフォーマンスを追求する場合
- ハイブリッド戦略: まずLoRAで迅速に実験し、最適なデータとハイパーパラメータを見つけてから、最終版には全パラメータ微調整を使用します
DeepSeek公式ファインチューニングコードの使用
DeepSeekはGitHubで完全なファインチューニングコードを提供しており、ゼロからトレーニングスクリプトを書くことなく直接使用できます。
公式ファインチューニングコードの取得
DeepSeek公式GitHubリポジトリには、トレーニングとファインチューニングに必要なすべてのコードが含まれています。例としてDeepSeek-Coderを取り上げます:
公式ファインチューニングコマンド
DeepSeekは、LoRAと全パラメータファインチューニングをサポートする簡潔なコマンドラインインターフェースを提供しています:
DeepSeek公式ファインチューニングコードが期待するデータ形式はJSONLで、各行にinstructionフィールドとoutputフィールドが含まれます:
公式コードの利点
- DeepSeekモデルアーキテクチャに最適化され、トレーニング効率が高い
- DeepSeek固有のトークナイザーとモデル設定を自動処理
- データ処理と評価ロジックが組み込まれている
- 継続的に更新され、最新のモデルバージョンと互換性がある
その他のDeepSeekエコシステムツールについては、DeepSeekエコシステムツールをご覧ください。
トレーニング監視
トレーニング中にloss曲線、学習率の変化、GPU使用状況をリアルタイムで監視し、異常を早期に発見してパラメータを調整するのに役立ちます。
TensorBoard 監視
TensorBoard は PyTorch に組み込まれたトレーニング可視化ツールです。トレーニングコードで report_to="tensorboard" を設定した後、TensorBoard を起動します:
Wandb 監視
Wandb(Weights & Biases)は、よりリッチなクラウドベースのトレーニング監視機能を提供し、チームコラボレーションをサポートします:
主要な監視指標
- トレーニング loss は継続的に減少する必要があります
- loss が減少しない場合は、学習率を確認してください
- loss が激しく振動する場合は、学習率を下げてください
- loss が急速に減少した後にプラトーになるのは正常です
- GPU 使用率は 90-100% に近い必要があります
- 使用率が低い = データロードのボトルネック
- num_workers を増やしてデータロードを高速化
- nvidia-smi でリアルタイムに確認
- cosine スケジューラで自動減衰
- warmup フェーズで学習率を段階的に上げる
- loss が減少しない場合は学習率を上げてみる
- loss が振動する場合は学習率を下げてみる
- 定期的に checkpoint を保存
- save_total_limit で保存数を制御
- トレーニング中断時は checkpoint から再開可能
- loss が最も低い checkpoint を保持
Checkpoint からトレーニングを再開
トレーニングが予期せず中断された場合、最新の checkpoint から再開できます:
過学習の警告サイン
トレーニング loss が継続的に減少しているが検証 loss が上昇し始めた場合、モデルは過学習しています。この場合は、トレーニングエポック数を減らす、データ量を増やす、lora_dropout を増やす、またはより小さい learning_rate を使用してください。
モデル評価
ファインチューニング後、ターゲットタスクでのモデルの性能を評価し、ファインチューニングが期待どおりの効果を達成したことを確認する必要があります。
評価方法
モデル評価は、自動評価と手動評価の2つの方法に分けられます。
定量的指標
- Perplexity(困惑度)
- ROUGE / BLEU スコア
- 正確率 / F1 スコア
- HumanEval(コードタスク)
- MMLU(知識Q&A)
定性的評価
- 出力品質のスコアリング
- 指示への従順性
- 回答の正確性
- スタイルの一貫性
- A/B 比較テスト
テストセット評価スクリプト
ベンチマーク比較
同じテストセットでファインチューニング前後のモデルの出力を比較し、ファインチューニングによる改善を評価することをお勧めします:
- 横方向の比較:ファインチューニング後のモデル vs 元のモデル vs 他の同種モデル
- 縦方向の比較:異なるチェックポイント間の効果の違い
- アブレーション実験:異なるハイパーパラメータ組み合わせの効果比較
- 境界テスト:極端な入力でのモデルの性能をテスト
評価の推奨事項
自動評価指標だけを見ないでください。実際のシナリオでモデルをテストし、特にエッジケースやエラーが発生しやすい状況を確認してください。ファインチューニング後のモデルが一般的な能力で大幅に低下している場合は、元のデータとファインチューニングデータを混ぜて再トレーニングすることを検討してください。
モデルのマージとエクスポート
ファインチューニング後、LoRAウェイトを元のモデルにマージし、デプロイ用にさまざまな形式でエクスポートする必要があります。
LoRAウェイトのマージ
LoRAトレーニングではアダプターウェイトが生成されるため、スタンドアロンモデルとして使用するには元のモデルにマージする必要があります:
GGUF形式へのエクスポート(Ollama / llama.cpp)
GGUFはllama.cppとOllamaで使用されるモデル形式で、エクスポート後はローカルで効率的に実行できます:
Ollama Modelfileの作成
GGUFをエクスポートした後、Modelfileを作成するとOllamaで使用できます:
Hugging Faceへのプッシュ
ファインチューニングしたモデルをHugging Faceコミュニティと共有します:
その他のデプロイ方法については、DeepSeekデプロイチュートリアルを参照してください。
デプロイ
ファインチューニング後の最後のステップ:モデルを本番環境にデプロイし、APIサービスを提供します。
デプロイ方法の比較
Ollama ローカルデプロイ
個人利用や小規模チームに適しており、ワンクリックでファインチューニング済みモデルをデプロイできます。GGUF形式にエクスポート後、Ollamaで実行し、API呼び出しをサポートします。
- 1コマンドで起動
- OpenAI API形式と互換性あり
- リソース消費が少ない
- 単一マシンでのデプロイに適している
vLLM デプロイ
本番環境に適した高性能推論エンジン。PagedAttention、連続バッチ処理、マルチGPU並列推論をサポートし、スループットはOllamaをはるかに上回ります。
- 高スループット
- OpenAI APIと互換性あり
- マルチGPU対応
- 本番レベルの安定性
Hugging Face Inference
モデルをHugging Faceにプッシュ後、Inference Endpointsを使用してデプロイでき、サーバー管理は不要です。
- 運用不要
- 自動スケーリング
- 従量課金
- グローバルノード
vLLM デプロイコマンド
vLLMは現在、本番環境で最も推奨される高性能推論エンジンです:
Docker デプロイ
Dockerデプロイを使用すると、環境の一貫性が確保され、移行や拡張が容易になります:
API呼び出し例(Python)
本番環境での注意点
- ヘルスチェック:/healthエンドポイントを設定し、サービス可用性の監視を確保
- レート制限:NginxやAPIゲートウェイでリクエスト頻度制限を設定
- 同時実行制御:vLLMはmax_num_seqsパラメータで同時リクエスト数を制御可能
- ログ記録:すべてのAPIリクエストとレスポンスを記録し、問題のトラブルシューティングを容易にする
- モデルのホットアップデート:ブルーグリーンデプロイ戦略を使用し、ダウンタイムなしでモデルを更新
デプロイの詳細は、DeepSeekデプロイチュートリアル と DeepSeek使用チュートリアル を参照してください。
DeepSeekモデル微調整のよくある質問
DeepSeek完全チュートリアルインデックス
以下は、初心者から上級者まで、ワンストップで学べるDeepSeek関連チュートリアルのすべてです。