統計ロードマップ
2026-04-30·実装·⏱ 約 6

FastAPI 入門 ─ ML モデルを 5 分で API にする

Python の高速 Web フレームワーク FastAPI を使って、ML モデルを REST API として公開する最短ルート。型ヒント・自動ドキュメント・非同期対応の 3 拍子。

FastAPI は Python の Web フレームワークの中で最も勢いがあるツール。型ヒントベースの設計で、書きやすく ・ 速く ・ ドキュメント自動生成という 3 拍子が揃っています。

Hello World

main.py
from fastapi import FastAPI

app = FastAPI()

@app.get('/')
def root():
    return {'message': 'Hello, World!'}
実行
uvicorn main:app --reload

ブラウザで `http://localhost:8000` → `{"message": "Hello, World!"}`、`/docs` で Swagger UI が見られます。

型ヒントで自動検証

Pydantic でリクエストモデル
from pydantic import BaseModel

class Features(BaseModel):
    age: int
    income: float
    is_member: bool

@app.post('/predict')
def predict(features: Features):
    return {'prediction': features.age * 2 + features.income}

型が違うリクエストは自動的に 422 エラー で弾かれる。バリデーション不要。

ML モデルのサービング

scikit-learn モデルを API 化
import joblib
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI(title='Housing Price API')
model = joblib.load('model.pkl')

class HousingFeatures(BaseModel):
    rooms: int
    age: int
    area: float
    distance_to_station: int

@app.post('/predict')
def predict(f: HousingFeatures):
    pred = model.predict([[f.rooms, f.age, f.area, f.distance_to_station]])
    return {'predicted_price': float(pred[0])}

非同期エンドポイント

OpenAI API のような外部呼び出しは async で
import httpx

@app.post('/llm')
async def call_llm(prompt: str):
    async with httpx.AsyncClient() as client:
        resp = await client.post(
            'https://api.openai.com/v1/chat/completions',
            headers={'Authorization': f'Bearer {API_KEY}'},
            json={'model': 'gpt-4o-mini', 'messages': [{'role': 'user', 'content': prompt}]},
        )
        return resp.json()

依存性注入

認証チェック
from fastapi import Depends, HTTPException, Header

def verify_token(x_api_key: str = Header()):
    if x_api_key != 'secret':
        raise HTTPException(401)
    return x_api_key

@app.post('/protected', dependencies=[Depends(verify_token)])
def protected():
    return {'ok': True}

Streaming Response

ChatGPT 風ストリーミング
from fastapi.responses import StreamingResponse

@app.post('/stream')
def stream(prompt: str):
    def gen():
        for chunk in llm_stream(prompt):
            yield chunk
    return StreamingResponse(gen(), media_type='text/event-stream')

デプロイ

  • Vercel: FastAPI を Functions として動かせる(Fluid Compute)
  • Cloud Run(GCP): Docker + 自動スケール、寿命 60 分
  • Lambda + API Gateway(AWS): サーバレス王道
  • Render / Fly.io: 個人開発向け

Flask との比較

  • 速度: FastAPI は Flask の 2〜3 倍速い(Starlette + Uvicorn)
  • 型検証: FastAPI は型ヒントで自動、Flask は手動
  • ドキュメント: FastAPI は OpenAPI 自動生成、Flask は別途作成
  • 非同期: FastAPI ネイティブ async、Flask は別途設定

学習リソース

  • [scikit-learn 入門](/blog/sklearn-introduction)
  • [OpenAI API 実装入門](/blog/openai-api-implementation)
  • [Slack Bot を LLM で作る](/blog/slack-bot-with-llm)
  • [Docker 入門](/blog/docker-for-ml)
Related Articles

関連記事