MLOpsとデプロイ
学習済みモデルが正しさを保ち続けるサービスになるまでを解説します。サービングスタックとバッチ処理、推論向けの量子化、監視とドリフト検出、モデルのCI、そしてそれらを結びつけるレジストリを扱います。
概要
ノートブックの中のモデルは実験です。エンドポイントの背後にあり、バージョン番号、ロールバック経路、レイテンシのアラート、入力分布が変化したときの計画をもつモデルはプロダクトです。MLOpsはこの2つの状態の間にあるエンジニアリングです。ツールの大半は通常のソフトウェア運用から借りてきたもので、そこにソフトウェアには不要だった3つのことが加わります。成果物がデータに依存すること、コードを一切変えなくても正しさが時間とともに劣化すること、そしてコストがミリ秒単位でオートスケールできないハードウェアに支配されることです。
このハブは、プロダクションのモデルを担当している、あるいはこれから担当するエンジニアのためのページです。サービングとバッチ処理、推論に適用する量子化、監視とドリフト、モデルの継続的インテグレーション、レジストリを扱います。量子化のより深い内容は/topics/efficient-ml/に、サービングスタックが動くハードウェアは/topics/hardware-and-acceleration/にあります。
重要な考え方
サービングはバッチ処理の問題
1つのリクエストでアクセラレータが飽和することはめったにありません。7 Bパラメータの順伝播を一度に1つずつ処理するGPUは、ほとんどすべての時間をメモリ待ちに費やします。トークンを1つ生成するたびに、すべての重みを一度読む必要があるからです。リクエストをバッチにまとめると、その読み出しを多数の系列で共有できます。GPUあたりのスループットがバッチサイズとともに1桁上がる一方で、リクエストあたりのレイテンシはわずかしか増えないのはこのためです。古典的なサービングでは静的バッチを使い、短い窓の間に集めてからまとめて実行していました。言語モデルのサービングでは連続バッチ処理を使います。新しいリクエストはどのステップでも実行中のバッチに加わり、完了したものは抜けるので、GPUが最長の系列を待ってアイドルになることがありません。vLLMの背後にあるアイデアであるPagedAttention(Kwon et al., 2023)は、各系列のキー・バリューキャッシュを固定サイズのブロックに格納し、メモリが断片化せず、より多くの系列が収まるようにします。
推論の量子化はサービング上の決定
重みを8ビットまたは4ビットの整数で保存するとメモリトラフィックは半分または4分の1になり、デコード中心のワークロードではそれがほぼそのままスループットに変換されます。重みのみのint8はほとんどのモデルでほぼ無損失で、最初に試すべきデフォルトです。4ビットの方式(GPTQ、AWQ、llama.cppのGGUF k-quants)は、より小さなデバイスにモデルを収める代わりに品質を少し犠牲にします。活性化とKVキャッシュも、より注意を払えば量子化できます。どの方式であれ、量子化したモデルはベンダーのタスクセットではなく自分のタスクセットで評価してください。精度の低下はタスクによって不均一だからです。フォーマットの一覧表は/reference/quantisation-formats/にあります。
モデルの監視とはデータの監視である
ソフトウェアの監視はレイテンシ、エラー率、飽和度を見ます。モデルの監視はそこに入力分布、出力分布、そしてラベルが届いたときには精度を加えます。入力のドリフト(共変量シフト)は、母集団安定性指標(PSI)や参照ウィンドウに対するKolmogorov-Smirnov検定のような特徴量ごとの統計量で即座に検出できます。入力と出力の関係のドリフト(コンセプトドリフト)は正解が届いて初めて見えるもので、それは数日後かもしれないし、永遠に届かないかもしれません。言語モデルのエンドポイントでは、トラフィックの一部をサンプリングし、判定モデルかルーブリックを適用し、そのスコアを時間とともに追跡してください。プロンプトと出力はモデルバージョンを付けてログに残し、保持期間と秘匿のルールはローンチ前に合意しておきます(/topics/safety-security-and-privacy/を参照)。
モデルのCIはコードだけでなくデータと振る舞いをテストする
モデルのパイプラインには通常のユニットテストに加えて、さらに3種類のテストが必要です。データテストは新しいバッチごとにスキーマ、値域、欠損率、行数を確認します。モデルテストは固定の小さなスライスで学習し、指標が許容範囲を超えて後退しないことを表明します。振る舞いのテストは名前の付いたケース(チームで議論になった不変性やエッジケース)を入力し、出力を表明します。レジストリは各候補をその指標、学習データのハッシュ、コードのコミットとともに記録し、ステージングからプロダクションへの昇格はレビューを経た手順です。カナリア、あるいは実トラフィックを受け取りつつ応答はしないシャドウデプロイでロールアウトし、現行版と比較し、ロールバックのために前バージョンをウォーム状態で保っておいてください。
どこから始めるか
まず/learn/beginner/10-from-notebook-to-service/を読み、次に監視することになる指標について/learn/beginner/06-evaluation-that-does-not-lie/を、データテストについて/learn/beginner/02-data-is-the-model/を読んでください。/projects/tabular-classifier-fastapi/プロジェクトを端から端まで作り、そこにリクエストログ、入力のドリフトチェック、レスポンスへのバージョンヘッダを追加してください。/topics/evaluation-and-benchmarks/ハブは、新バージョンを出荷するかどうかを決めるA/Bテストを扱っています。
ツールとプラットフォーム
| ツール | 用途 | ライセンス | プラットフォーム |
|---|---|---|---|
| vLLM | 連続バッチ処理とページ化KVキャッシュによる高スループットのLLMサービング | Apache-2.0 | /platforms/opensource/ |
| NVIDIA Triton Inference ServerとTensorRT-LLM | 動的バッチ処理を備えたマルチフレームワークのサービング、最適化されたLLMカーネル | BSD-3(Triton)、Apache-2.0(TensorRT-LLM) | /platforms/nvidia/ |
| Text Generation Inference | Hugging FaceのプロダクションLLMサーバー | Apache-2.0 | /platforms/huggingface/ |
| TorchServeとtorch.export | PyTorchモデルのサービング、他のランタイム向けのグラフのエクスポート | BSD-3(PyTorch) | /platforms/pytorch/ |
| ONNX Runtime | エクスポートしたグラフからのポータブルなCPUおよびGPU推論 | MIT | /platforms/microsoft/ |
| MLflow | 実験管理、モデルレジストリ、パッケージング | Apache-2.0 | /platforms/opensource/ |
| Evidently | 表形式データとテキストデータ向けのドリフトレポートと監視ダッシュボード | Apache-2.0 | /platforms/opensource/ |
| FastAPIとuvicorn | 小規模サービスのHTTP層 | MIT、BSD-3 | /platforms/opensource/ |
よくある間違い
- バッチサイズ1でレイテンシを計測し、そこからキャパシティを計画する。実際に見ることになるバッチサイズでスループットを測り、負荷下でのp99レイテンシを測ってください。
- リクエストハンドラの中でモデルを読み込む。起動時に一度だけ読み込み、ダミーリクエストでウォームアップし、それをヘルスチェックにしてください。
- 量子化したモデルで、タスク評価を再実行せずに出荷する。
- インフラの指標しか監視しない。すべての回答が間違っていても、サービスは200 OKで健全に見えます。
- レスポンスにもログにもモデルバージョンがなく、不良な出力をそれを生成した成果物まで追跡できない。
- レジストリをファイル置き場として扱う。データのハッシュ、コードのコミット、評価指標を記録していないなら、それはレジストリではありません。
さらに深く
- Kwon et al., Efficient Memory Management for Large Language Model Serving with PagedAttention, 2023。
- Sculley et al., Hidden Technical Debt in Machine Learning Systems, NeurIPS 2015。
- Leviathan, Kalman and Matias, Fast Inference from Transformers via Speculative Decoding, 2022。
- vLLMドキュメント。特にスケジューリングと量子化のページ。
- NVIDIA Triton Inference Serverドキュメント。
- MLflow Model Registryドキュメント。