コンテンツにスキップ

7. コスト、トラブルシューティング、受け入れ基準

この章は順番に読む必要はありません。マシンを起動する前に 7.1 節を読んで予算を見積もり、エラーに遭遇したら 7.2 節を調べ、すべて終わったら 7.3 節と照らし合わせて確認してください。

7.1 まず速度を測ってからコストを見積もる

まずプロバイダーの時間単価、ストレージ料金、インスタンス停止後の課金ルールを確認してから、この実験の予算を決めます。以下の計算では仮の単価として 1 時間あたり US$0.74 を使っています。実際の価格は、インスタンス作成時に提示される金額に従ってください。

GPU 费用 = 小时单价 × 开机计费时长
总成本 = GPU 费用 + 存储 + 其他服务 + 数据制作/审核投入
训练时间估算 ≈ 预热后每个 optimizer step 耗时 × 预计更新步数

(訳:GPU 費用 = 時間単価 × 課金対象の稼働時間、総コスト = GPU 費用 + ストレージ + その他のサービス + データ作成/レビューの工数、推定学習時間 ≈ ウォームアップ後のオプティマイザーステップ 1 回あたりの所要時間 × 想定される更新ステップ数。)

メインパス(環境構築、ダウンロード、1 エポックの学習、マージ、デプロイ、負荷テスト)にはマシン稼働時間で 2~3 時間かかる見込みです。第 6 章の比較実験とレビューを加えると 10~20 時間かかることがあります。例の単価では、それぞれおよそ US$1.5~2.2 と US$7.4~14.8 です。実際には、セットアップ、転送、アイドル、ストレージのコストも計上する必要があります。

ノートブックの training-complete.json(CLI では metrics-step-N.json)には、学習時間と、allocated/reserved の VRAM のピーク値が記録されます。PyTorch の統計には他のプロセスやドライバーのオーバーヘッドすべては含まれないので、nvidia-smi や請求書と照らし合わせてください。実測した時間で予算を更新しましょう。

7.2 トラブルシューティング表

症状 まず確認すること やってはいけないこと
CUDA unavailable ホスト、ドライバー、Torch の wheel、現在の仮想環境 Mac に CUDA を何度も再インストールする
Python モジュールが見つからない Python のパス、有効化している環境、インストール結果 複数の環境でライブラリを手当たり次第にアップグレードする
トークナイザーは動くがモデルが失敗する トークナイザーだけをダウンロードしていないか、重みがそろっているか いつも VRAM 不足だと決めつける
長さの上限を超える ファクト、履歴、ターゲットのトークン長 参考回答を黙って切り詰める
loss は低いが結果が悪い ターゲットの漏洩、ほぼ重複したデータ、実際に読み込まれているアダプター エポックを増やすだけ
loss が下がらない マスク、学習対象パラメータ、学習率、データ すぐに GPU を替える
思考やロールのマーカーが出力される モデルのバリアント、テンプレート、学習ターゲット、停止トークン バックエンドで特殊なテキストを闇雲に削除する
繰り返す/止まらない EOS の教師信号、重複データ、過学習、出力上限 繰り返された文をフィルタで除くだけ
OOM 他のプロセス、長さ、バッチ、KV キャッシュ、量子化 RAM を VRAM と同等とみなす
再開が拒否される データ/コード/環境/モデルが変わっていないか manifest のチェックを回避する
作り話が増える フィクションが事実として書かれていないか、誠実に応答するサンプルが不足していないか 面白さのスコアで事実の誤りを覆い隠す
マージ後に劣化する リビジョン、量子化していないベースモデル、テンプレート、精度 NF4/BF16 の差をすべて LoRA のせいにする
API がタイムアウトする サービスの正常性、モデルの読み込み、コンテキスト、同時実行数、ログ 際限なくリトライする
API が 400 を返す 入力 + max_tokens が --max-model-len を超えていないか、model の名前が /v1/models と一致しているか 同じリクエストをリトライし続ける
負荷テスト中にレイテンシが急増する 同時実行数が --max-num-seqs を超えていないか、KV キャッシュが満杯でないか(/metrics とログを確認) キューイングを見ずに平均値だけを見る
vLLM が起動しない 推論環境、ドライバー、モデルディレクトリ、他のプロセスによる GPU の使用 学習環境の依存関係を上書きする

7.3 最終学習チェックリスト

  • このプロジェクトが SFT+QLoRA を使う理由を説明できる。
  • 1 つのサンプルの完全なコンテキストと、実際の教師ターゲットを示せる。
  • 1 エポックの学習を完了し、loss 曲線を読み取り、完了記録を確認し、アダプターを保存して再読み込みした。
  • 学習中の VRAM の内訳を挙げ、nvidia-smi の数値と対応づけられる。
  • 4.6 節の小さなサンプルでの過学習と、チェックポイントからの再開の演習を完了した。
  • 1 エポックの学習と 1 回の rank 比較を完了し、再確認できるチェックリストを保存した。
  • 学習中の性能、検証結果、凍結後のテスト結果を区別できる。
  • 改善、退行、または「不確か」を報告し、根拠の限界を説明できる。
  • マージ、エクスポート、vLLM の起動を行い、マルチターンとストリーミングの呼び出しができる。
  • KV キャッシュの容量を見積もって vLLM の起動ログと比較でき、--gpu-memory-utilization、--max-model-len、--max-num-seqs を説明できる。
  • アダプターをマウントして同じサービス内でベースモデルと LoRA を比較でき、マージ済みデプロイとのトレードオフを説明できる。
  • 異なる同時実行数で負荷テストを行い、TTFT、TPOT、スループットの表を埋め、スループットとレイテンシのトレードオフを説明できる。

プロンプトのベースラインに対する LoRA の改善または退行を記録し、他の人が再確認できるようにデータと出力を添付してください。