34
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python Web FrameworksAdvent Calendar 2024

Day 1

FastAPIで機械学習モデルをAPI化!簡単クイックスタートガイド

Last updated at Posted at 2024-11-30

image.png

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. 必要な環境とライブラリの準備
  2. 機械学習モデルの作成
  3. FastAPIのセットアップ
  4. モデルをAPIに組み込む
  5. APIを動かしてみよう!
  6. まとめ
  7. 参考にしたもの

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の仕様を確認できます。

image.png

このように、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ドキュメントが自動的に更新されていることがわかります。

image.png

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 FastAPI本格入門』

『動かして学ぶ!Python FastAPI開発入門』

『現場のPython──Webシステム開発から、機械学習・データ分析まで』
第9章 FastAPIによるWeb API開発 型ヒントを活用したAPI仕様中心の開発手法

『Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方』

『AIエンジニアのための機械学習システムデザインパターン』

『現場で使える!機械学習システム構築実践ガイド デザインパターンを利用した最適な設計・構築・運用手法』

34
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?