FastAPI入門2026|PythonでAI推論APIを30分で構築
目次
機械学習モデルを作った。精度も出た。だが「他の人が使える形」にできていない――このボトルネックでプロジェクトが止まるケースは想像以上に多い。
FastAPIは、PythonでREST APIを高速に構築するためのフレームワークだ。型ヒントを書くだけでバリデーションとAPIドキュメントが自動生成される。Flaskから乗り換える開発者が増えている理由を、実際にMLモデルをAPI化する手順を通じて実感してもらう。
1. なぜFastAPIか|Flask/Djangoとの比較
| 比較 | FastAPI | Flask | Django REST |
|---|---|---|---|
| 速度 | Node.jsに匹敵 | 普通 | 普通 |
| 型バリデーション | Pydantic(自動) | 手動 | Serializer |
| APIドキュメント | 自動生成(Swagger UI) | 手動 | 手動 |
| 非同期処理 | ネイティブ対応 | 限定的 | 限定的 |
| 学習コスト | Flask経験者なら1日 | 低い | 高い |
FlaskからFastAPIに移行してみて一番驚いたのは、APIドキュメントの自動生成だ。/docs にアクセスするだけでSwagger UIが表示され、ブラウザからAPIのテスト呼び出しまでできる。Flaskでは別途Swagger用のライブラリを入れて設定ファイルを書く必要があった。その差は地味だが、開発速度に直結する。
FlaskとFastAPIの詳しい比較は「Flask vs Next.js比較」でも触れている。
2. インストールから最初のAPI(10分)
pip install fastapi uvicorn
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello, FastAPI!"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "query": q}
# 起動
uvicorn main:app --reload
# ブラウザで確認
# http://localhost:8000 → {"message": "Hello, FastAPI!"}
# http://localhost:8000/docs → Swagger UI(自動生成)
item_id: int と型ヒントを書くだけで、文字列が渡されたときに自動で422エラーを返してくれる。Flaskなら try/except で手書きしていたバリデーションが、FastAPIでは不要になる。
3. Pydanticでリクエスト/レスポンスを型安全にする
FastAPIの真価はPydanticとの統合にある。リクエストボディの構造をPythonクラスとして定義するだけで、バリデーション・ドキュメント生成・シリアライズが全て自動化される。
from pydantic import BaseModel
class PredictRequest(BaseModel):
text: str
max_length: int = 100
temperature: float = 0.7
class PredictResponse(BaseModel):
prediction: str
confidence: float
@app.post("/predict", response_model=PredictResponse)
def predict(req: PredictRequest):
# MLモデルの推論処理
result = model.generate(req.text, max_length=req.max_length)
return PredictResponse(prediction=result, confidence=0.95)
PredictRequest に合わないJSONが来たら、FastAPIが自動でエラーレスポンスを返す。フィールドが足りない、型が違う、範囲外――全部Pydanticが捕捉する。バリデーション漏れでデバッグに半日溶かした経験があるなら、この一行の意味がすぐ分かる。
4. MLモデルをAPIとして公開する(30分)
ここからがFastAPIの本領発揮だ。scikit-learnで学習済みのモデルをAPI化する実例を示す。
# ml_api.py
from fastapi import FastAPI
from pydantic import BaseModel
import pickle
import numpy as np
app = FastAPI(title="住宅価格予測API")
# 学習済みモデルをロード
with open("model.pkl", "rb") as f:
model = pickle.load(f)
class HouseFeatures(BaseModel):
area: float # 面積(㎡)
rooms: int # 部屋数
age: int # 築年数
station_min: int # 最寄駅(分)
class PriceResponse(BaseModel):
predicted_price: int # 万円
features_used: dict
@app.post("/predict-price", response_model=PriceResponse)
def predict_price(features: HouseFeatures):
X = np.array([[features.area, features.rooms,
features.age, features.station_min]])
price = int(model.predict(X)[0])
return PriceResponse(
predicted_price=price,
features_used=features.dict()
)
このコードで「面積・部屋数・築年数・駅距離」を入力すると住宅価格を予測するAPIが完成する。/docs を開けばフォーム入力でテストも可能。モデルの精度検証から本番デプロイまで、FastAPIひとつで回せるのが強みだ。
MLOpsの全体像については「MLOps入門ガイド」で整理している。
5. 非同期処理で大量リクエストをさばく
FastAPIはASGI(Asynchronous Server Gateway Interface)ベースで、async/awaitによる非同期処理をネイティブサポートする。外部APIの呼び出しやDB接続で待ち時間が発生するエンドポイントでは、非同期にすることでスループットが大幅に向上する。
import httpx
@app.get("/external-data")
async def get_external_data():
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com/data")
return response.json()
注意点が一つ。scikit-learnのようなCPUバウンドな推論処理は async にしても効果がない。非同期が効くのは外部API呼び出し・DB接続・ファイルI/Oなど、I/Oバウンドな処理のみだ。
6. Dockerでデプロイする
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
docker build -t my-api .
docker run -p 8000:8000 my-api
このDockerfileをそのままCloud Run、ECS、Renderなどにデプロイできる。Python独学ロードマップのStep 4でポートフォリオを作る際、「動くものを見せてください」という質問に、URLを貼り付けて答えられる。
7. よくある質問
Q. FlaskからFastAPIに移行すべき?
新規プロジェクトならFastAPI一択。既存のFlaskアプリをわざわざ移行する必要はないが、APIの型安全性やドキュメント自動生成が欲しい場合は検討の価値がある。
Q. 本番運用に耐えるか?
Microsoft、Uber、Netflixなどが本番環境で採用している実績がある。Uvicornの前段にNginxを置くのが定番構成だ。
FastAPI関連の書籍
※ 上記はAmazonアソシエイトリンクです