MLモデルの読み込みと提供
起動時のjoblib/kerasモデルの読み込み、スレッドセーフな推論、バッチ予測エンドポイントについて学習します。
「MLモデルの読み込みと提供」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
読み込みの問題
ディスクからモデルを読み込む処理には時間がかかります。リクエストごとに再読み込みすると、レイテンシーが急増します。解決策は、起動時にモデルを一度だけ読み込み、すべてのリクエストで再利用することです。
startupイベント
@app.on_event("startup")フックは、サーバーの起動時に一度だけ実行されます。どのリクエストよりも前にモデルを読み込むのに最適な場所です。
from fastapi import FastAPI
import joblib
app = FastAPI()
@app.on_event("startup")
def load_model():
app.state.model = joblib.load("model.joblib")スレッドセーフな保存に使うapp.state
app.stateは、モデルのような共有オブジェクトを保存する推奨場所です。起動時に一度だけ保存し、リクエスト中は読み取りだけを行うため、可変なモジュールレベルのグローバル変数に伴う問題を避けられます。
from fastapi import Request
@app.post("/predict")
def predict(req: PredictRequest, request: Request):
model = request.app.state.model
return {"prediction": model.predict([req.features])[0]}グローバル変数ではいけない理由
単純なモジュールグローバルでも動作しますが、読み込みがインポート時に行われるため、テストや差し替えが難しくなります。app.stateならオブジェクトのライフサイクルをアプリケーションに結び付けられるため、よりすっきりした、FastAPI推奨のパターンになります。
最新のlifespanアプローチ
新しいFastAPIでは、on_eventの代わりにlifespanコンテキストマネージャーを使います。これにより、起動と終了の両方を一か所で管理できます。
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app):
app.state.model = joblib.load("model.joblib") # startup
yield
app.state.model = None # shutdown
app = FastAPI(lifespan=lifespan)モデルのウォームアップ
フレームワークは初回呼び出し時に遅延初期化を行うことが多いため、最初の予測には時間がかかりがちです。起動時にダミー予測を実行してモデルをウォームアップすると、最初の実際のユーザーリクエストにもすぐ応答できます。
@app.on_event("startup")
def load_and_warm():
app.state.model = joblib.load("model.joblib")
app.state.model.predict([[0.0, 0.0, 0.0, 0.0]]) # warm-upウォームアップが重要な理由
ウォームアップを行わないと、デプロイ後の最初のリクエストが何倍も遅くなり、テールレイテンシーが悪化したり、ヘルスチェックに失敗したりする可能性があります。起動時に1回ダミー推論を行えば、このコストをクリティカルパスの外で処理できます。
バッチ予測エンドポイント
モデルはバッチに対してベクトル化して処理できるため、多数の行を1回の呼び出しで予測する方が、多数の単一呼び出しを行うよりはるかに効率的です。特徴量ベクトルのリストを受け取り、予測結果のリストを返します。
class BatchRequest(BaseModel):
items: list[list[float]]
@app.post("/predict/batch")
def predict_batch(req: BatchRequest, request: Request):
model = request.app.state.model
preds = model.predict(req.items)
return {"predictions": preds.tolist()}単一とバッチの違い
- 単一: 入力は1件で、呼び出しごとのレイテンシーが最も低く、クライアントもシンプルです。
- バッチ: 多数の入力を一度に処理でき、スループットが大幅に高く、オフラインスコアリングに適しています。
両方を提供することで、リアルタイム処理と一括処理のユースケースに対応できます。
エンドポイントでstateから読み取る
各エンドポイントはrequest.app.state.modelを通じて共有モデルを読み取ります。再読み込みは行わないため、すべてのリクエストが1つのメモリ上のインスタンスを共有します。
全体を組み立てる
本番環境に対応した構成では、lifespan/startupでモデルを読み込んでウォームアップし、app.stateに保存します。そして、stateからモデルを読み取る単一予測とバッチ予測の両方のエンドポイントを公開します。これによりレイテンシーを最小限に抑え、スループットを最大化できます。
クイックチェック
モデルサービングに関する知識を確認しましょう。
まとめ
startup/lifespanを使ってモデルを一度だけ読み込み、スレッドセーフに再利用できるようapp.stateに保存しました。また、ウォームアップ用のダミー予測を追加し、スループット向上のためにバッチエンドポイントを公開しました。次は、APIをDocker化します。
よくある質問
「MLモデルの読み込みと提供」レッスンは無料ですか?
はい。「MLモデルの読み込みと提供」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「MLモデルの読み込みと提供」で何を学びますか?
起動時のjoblib/kerasモデルの読み込み、スレッドセーフな推論、バッチ予測エンドポイントについて学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「MLモデルの読み込みと提供」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。