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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/04cbdef3-4ec8-53d9-946a-a0827dd0f1a8.png)

*Image generated by OpenAI's DALL·E-3.*


## はじめに

機械学習モデルをAPI化することで、Webアプリケーションや他のシステムから簡単に利用できるようになります。本記事では、Pythonの軽量で高速なWebフレームワーク**FastAPI**を使って、機械学習モデルをAPI化する手順を解説します。**これでもかと言うほど**簡単にクイックスタートできるように心掛けました！


ソースコードやディレクトリ構成は、下記のGitHubレポジトリを参考にしてください。

https://github.com/Isaka-code/fastapi-ml-quickstart

**ディレクトリ構成**
```
├── src/
│   ├── hello.py
│   ├── main.py
│   ├── train.py
├── models/
│   ├── model.joblib
```



## 目次
1. [必要な環境とライブラリの準備](#1-必要な環境とライブラリの準備)  
2. [機械学習モデルの作成](#2-機械学習モデルの作成)  
3. [FastAPIのセットアップ](#3-fastapiのセットアップ)  
4. [モデルをAPIに組み込む](#4-モデルをapiに組み込む)  
5. [APIを動かしてみよう！](#5-apiを動かしてみよう)  
6. [まとめ](#6-まとめ)  
7. [参考にしたもの](#7-参考にしたもの)




## 1. 必要な環境とライブラリの準備

まずは環境構築から始めましょう。以下のライブラリをインストールします。

```bash
pip install fastapi uvicorn scikit-learn numpy
```

- **FastAPI**: 軽量で使いやすいWebフレームワーク。
- **uvicorn**: FastAPIアプリケーションを動かすためのASGIサーバー。
- **scikit-learn**: 機械学習モデルの作成と管理。
- **numpy**: データ処理用。



## 2. 機械学習モデルの作成
機械学習APIの構築には、学習済み機械学習モデルが保存されていることが必要です。
本記事では線形回帰モデルを作成し、それをAPI化します。以下のコードでモデルを保存します。

```python
"""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
```python
"""src/hello.py"""

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Welcome to the FastAPI ML API!"}
```

このコードを保存して、以下のコマンドでサーバーを起動します。

```bash
uvicorn src.hello:app --reload
```

※`python src/hello.py`のように、ソースコードを直接実行しても何も起こりません。


ブラウザで `http://127.0.0.1:8000` にアクセスすると、以下のメッセージが表示されます。

```json
{"message": "Welcome to the FastAPI ML API!"}
```

### Swagger UI
FastAPIは自動でAPIドキュメントを生成します。`http://127.0.0.1:8000/docs` にアクセスすると、インタラクティブに、APIの仕様を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/b9f97444-03cb-eff5-5c4d-8699e472c9dc.png)

このように、APIの仕様から自動的にUIを生成してくれるのは、FastAPIの大きなメリットの一つです。


## 4. モデルをAPIに組み込む

保存したモデルを使って、予測機能を持つ[エンドポイント](https://kinsta.com/jp/knowledgebase/api-endpoint/)を作成します。

### main.py 
```python
"""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/`**: 入力データを受け取り、予測結果を返すエンドポイント。



このコードを保存して、以下のコマンドでサーバーを起動します。

```bash
uvicorn src.main:app --reload
```

`http://127.0.0.1:8000/docs` に再度アクセスすると、APIドキュメントが自動的に更新されていることがわかります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/0b93c44e-89fe-e872-0411-6b7d1bf7a000.png)

## 5. APIを動かしてみよう！

サーバーを起動している状態で、ターミナルをもう一つ立ち上げ、以下のようなリクエストを送ります。

### curlコマンドでリクエストを送る場合

```bash
curl -X POST "http://127.0.0.1:8000/predict/" \
-H "Content-Type: application/json" \
-d '{"value": 3.5}'
```

### 結果例
```json
{
  "input": 3.5,
  "prediction": 7.0
}
```

しっかりと、`y = 2x` の関係を予測できていることがわかります。


## 6. まとめ

FastAPIを使うことで、Pythonの機械学習モデルを簡単にAPI化することができます。この記事は『クイックスタート』を目的としていました。本記事で紹介したステップを応用すれば、より高度なモデルや複雑な機能も追加できます。

次のステップとしては、以下を試してみてください：
- データバリデーションを強化して、入力の安全性を向上させる（参考：[Pydantic](https://docs.pydantic.dev/latest/)）
- エラーハンドリングを追加して、予期せぬ動作への対応を強化する
- APIコードを疎結合に分離して、メンテナンス性を向上させる
- 複数のエンドポイントを追加し、モデル管理の柔軟性を高める
- Dockerを活用して、デプロイ環境を効率化する
- より高度な機械学習モデルを導入して、APIの性能を向上させる

この記事が、FastAPIでの機械学習API構築を始めるきっかけになれば嬉しいです。

## 7. 参考にしたもの

https://fastapi.tiangolo.com/

[『Python FastAPI本格入門』](https://www.amazon.co.jp/Python-FastAPI%E6%9C%AC%E6%A0%BC%E5%85%A5%E9%96%80-%E6%A8%B9%E4%B8%8B-%E9%9B%85%E7%AB%A0/dp/4297144476/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)

[『動かして学ぶ！Python FastAPI開発入門』](https://www.amazon.co.jp/%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6%EF%BC%81Python-FastAPI%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E4%B8%AD%E6%9D%91-%E7%BF%94/dp/4798177229/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)

[『現場のPython──Webシステム開発から、機械学習・データ分析まで』
第9章 FastAPIによるWeb API開発 型ヒントを活用したAPI仕様中心の開発手法](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%AEPython%E2%94%80%E2%94%80Web%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%96%8B%E7%99%BA%E3%81%8B%E3%82%89%E3%80%81%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%BE%E3%81%A7-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%93%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A6%E3%83%89/dp/4297144018/ref=sr_1_3?dib=eyJ2IjoiMSJ9.SnJFWnXPu5pYXohIPHuHlBoTHgW3frkszdI89i5CLwKwoYB-AmG34VTJyLRPF_6KnT1rdp3CzCcnadfJ8q_bmMgADK8DP70rPFWu61kcQi72Uukv9-3YQb-o3_BFSafMRZe-QBZzCxMOwbBdF8x3xDn20vdD68fC2XanOD89UdvAHACmIDr8qK0OZw5Af3ho_46gD340L6Xx-vyHo_HAxS7c2kT16XxzRW6sVztKSWU.cwQywl7yOz0e4qMj9fgqCrBm43CvvZAZYlpRwcg_Xbs&dib_tag=se&qid=1732940399&s=books&sr=1-3&text=%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%93%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A6%E3%83%89)

[『Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方』](https://www.amazon.co.jp/Python-Flask%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E7%89%A9%E4%BD%93%E6%A4%9C%E7%9F%A5%E3%82%A2%E3%83%97%E3%83%AA-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92API%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E4%BD%90%E8%97%A4/dp/4798166464)

[『AIエンジニアのための機械学習システムデザインパターン』](https://www.amazon.co.jp/AI%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-AI-TECHNOLOGY-%E6%BE%81%E4%BA%95-%E9%9B%84%E4%BB%8B/dp/4798169447/ref=tmm_pap_swatch_0?_encoding=UTF8&dib_tag=se&dib=eyJ2IjoiMSJ9.1g8xw2ii1YQVPBaUNdIBSMnUYz9nBZU8ubSwCr6m0TRmdmZ040A8ibCDXvjTk9IHAecmViCqjWE6G3zeuMOr20vXw50XGxRRHEmLhPMUwrULwMqhBBKNNhf9ovR8EOGQXXSlwYTErkD8_kvI6oiuIHRrdwtCZF6fCZIFBMtV3IghfYXS7kGuk7fvvJxfIWo8DzTgqni37dq2cYt4T36bCF9BFC372088KP-v1NtWTnv1dqnASou-vTLnHgZ_9Hx_Wk9d_eRpwvBtVcGctdOcyWwGkcotdwD6NvEp2fXWzk4.CE-CQ9AfREnd6BbkUTrVJ0d49UVIQgdZJuoNIQ3oI2A&qid=1732945281&sr=8-1)

[『現場で使える！機械学習システム構築実践ガイド デザインパターンを利用した最適な設計・構築・運用手法』](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%EF%BC%81%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E7%AF%89%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E6%9C%80%E9%81%A9%E3%81%AA%E8%A8%AD%E8%A8%88%E3%83%BB%E6%A7%8B%E7%AF%89%E3%83%BB%E9%81%8B%E7%94%A8%E6%89%8B%E6%B3%95-%E6%BE%81%E4%BA%95-%E9%9B%84%E4%BB%8B/dp/4798173401)

https://qiita.com/fam_taro/items/1464c42324f15d7b8223

https://qiita.com/bee2/items/9803f6b44527989496d0

https://qiita.com/sergicalsix/items/a4462f9625237a969c16

https://zenn.dev/yag_ays/articles/eef1a8c8e1ee39

https://nigimitama.hatenablog.jp/entry/2020/02/10/050000

https://engineering.mobalab.net/2019/01/10/develop-api-server-with-pre-trained-ml-model/

https://techblog.cccmkhd.co.jp/entry/2022/07/26/155900

https://www.medi-08-data-06.work/entry/machine-learning-api

https://www.slideshare.net/slideshow/fastapi-api/250066671

<iframe width="560" height="315" src="https://www.youtube.com/embed/ZMEC1r7xuWw?si=2GN4k93nAQkna3ad" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>