Image generated by OpenAI's DALL·E-3.
はじめに
機械学習モデルをAPI化することで、Webアプリケーションや他のシステムから簡単に利用できるようになります。本記事では、Pythonの軽量で高速なWebフレームワークFastAPIを使って、機械学習モデルをAPI化する手順を解説します。これでもかと言うほど簡単にクイックスタートできるように心掛けました!
ソースコードやディレクトリ構成は、下記のGitHubレポジトリを参考にしてください。
ディレクトリ構成
├── src/
│ ├── hello.py
│ ├── main.py
│ ├── train.py
├── models/
│ ├── model.joblib
目次
1. 必要な環境とライブラリの準備
まずは環境構築から始めましょう。以下のライブラリをインストールします。
pip install fastapi uvicorn scikit-learn numpy
- FastAPI: 軽量で使いやすいWebフレームワーク。
- uvicorn: FastAPIアプリケーションを動かすためのASGIサーバー。
- scikit-learn: 機械学習モデルの作成と管理。
- numpy: データ処理用。
2. 機械学習モデルの作成
機械学習APIの構築には、学習済み機械学習モデルが保存されていることが必要です。
本記事では線形回帰モデルを作成し、それをAPI化します。以下のコードでモデルを保存します。
"""src/train.py"""
import joblib
import numpy as np
from sklearn.linear_model import LinearRegression
# ダミーデータを作成(y = 2x)
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 6, 8, 10])
# モデルのトレーニング
model = LinearRegression()
model.fit(X, y)
# モデルを保存
joblib.dump(model, "models/model.joblib")
このコードを実行すると、model.joblib
というファイルが保存されます。このファイルをAPIで利用します。
3. FastAPIのセットアップ
FastAPIの基本的なセットアップを行います。
動作確認として、下記のサンプルコードを用います。
hello.py
"""src/hello.py"""
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Welcome to the FastAPI ML API!"}
このコードを保存して、以下のコマンドでサーバーを起動します。
uvicorn src.hello:app --reload
※python src/hello.py
のように、ソースコードを直接実行しても何も起こりません。
ブラウザで http://127.0.0.1:8000
にアクセスすると、以下のメッセージが表示されます。
{"message": "Welcome to the FastAPI ML API!"}
Swagger UI
FastAPIは自動でAPIドキュメントを生成します。http://127.0.0.1:8000/docs
にアクセスすると、インタラクティブに、APIの仕様を確認できます。
このように、APIの仕様から自動的にUIを生成してくれるのは、FastAPIの大きなメリットの一つです。
4. モデルをAPIに組み込む
保存したモデルを使って、予測機能を持つエンドポイントを作成します。
main.py
"""src/main.py"""
import joblib
import numpy as np
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# モデルを読み込む
model = joblib.load("models/model.joblib")
# 入力データのスキーマ定義
class InputData(BaseModel):
value: float
@app.post("/predict/")
def predict(data: InputData):
# 入力データをモデルに渡す
prediction = model.predict(np.array([[data.value]]))
return {"input": data.value, "prediction": prediction[0]}
-
BaseModel
: 入力データのバリデーションを行うための仕組み。 -
/predict/
: 入力データを受け取り、予測結果を返すエンドポイント。
このコードを保存して、以下のコマンドでサーバーを起動します。
uvicorn src.main:app --reload
http://127.0.0.1:8000/docs
に再度アクセスすると、APIドキュメントが自動的に更新されていることがわかります。
5. APIを動かしてみよう!
サーバーを起動している状態で、ターミナルをもう一つ立ち上げ、以下のようなリクエストを送ります。
curlコマンドでリクエストを送る場合
curl -X POST "http://127.0.0.1:8000/predict/" \
-H "Content-Type: application/json" \
-d '{"value": 3.5}'
結果例
{
"input": 3.5,
"prediction": 7.0
}
しっかりと、y = 2x
の関係を予測できていることがわかります。
6. まとめ
FastAPIを使うことで、Pythonの機械学習モデルを簡単にAPI化することができます。この記事は『クイックスタート』を目的としていました。本記事で紹介したステップを応用すれば、より高度なモデルや複雑な機能も追加できます。
次のステップとしては、以下を試してみてください:
- データバリデーションを強化して、入力の安全性を向上させる(参考:Pydantic)
- エラーハンドリングを追加して、予期せぬ動作への対応を強化する
- APIコードを疎結合に分離して、メンテナンス性を向上させる
- 複数のエンドポイントを追加し、モデル管理の柔軟性を高める
- Dockerを活用して、デプロイ環境を効率化する
- より高度な機械学習モデルを導入して、APIの性能を向上させる
この記事が、FastAPIでの機械学習API構築を始めるきっかけになれば嬉しいです。
7. 参考にしたもの
『現場のPython──Webシステム開発から、機械学習・データ分析まで』
第9章 FastAPIによるWeb API開発 型ヒントを活用したAPI仕様中心の開発手法
『Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方』
『現場で使える!機械学習システム構築実践ガイド デザインパターンを利用した最適な設計・構築・運用手法』