🐈
Python製APIをCloud Runへデプロイする方法 PoC環境
Python製APIをCloud Runへデプロイする方法
今回は、高速で手軽にAPIを作成できるPythonのフレームワークであるFastAPIを使って作成したAPIを、GCPのCloud Runにデプロイする手順をまとめました。
FastAPIとは?
FastAPIは、2018年12月に登場した比較的新しいPythonのWEBフレームワークです。Djangoに比べて小規模なAPIを開発するのに適しており、人気を集めています。
特徴
- API作成の手軽さ : .pyファイル1つでAPIを作成できます。
- 高速な動作: ASGI(Asynchronous Server Gateway Interface)を採用しているため、Flaskと比べて高速に動作します。
- 自動でドキュメントを生成: Swagger形式のドキュメントを自動生成してくれるため、開発効率が向上します。
開発環境の準備
まずは、Pythonの仮想環境を作成し、FastAPIと関連パッケージをインストールします。
- 仮想環境の作成: プロジェクト用のディレクトリを作成し、仮想環境を構築します。
$ mkdir fastapi_sample
$ cd fastapi_sample
$ python -m venv environments
$ source environments/bin/activate
- FastAPIのインストール: FastAPIと必要なパッケージをインストールします。
(environments) $ pip install fastapi[all]
シンプルなAPIの作成
"hello world" を返すだけのシンプルなGETメソッドのAPIを作成します。
-
main.pyの作成: 以下のコードを記述した
main.py
を作成します。
from fastapi import FastAPI
# FastAPIのインスタンスを作成
app = FastAPI()
# GETのメソッドで/helloのエンドポイントを指定
@app.get("/hello")
async def sample(): # 関数名は任意
return "hello world"
- APIの起動: uvicornを使ってAPIを起動します。
(enviroments) $ uvicorn main:app --reload
- 動作確認: curlコマンドでAPIを呼び出し、レスポンスを確認します。
(environments) $ curl http://localhost:8000/hello -X GET
"hello world --FastAPIより愛を込めて--"
学習済みモデルを使った推論APIの作成
ここでは、事前に学習させた機械学習モデルを使って推論を行うAPIを作成します。
-
機械学習モデルの準備: ここでは、例としてirisデータセットを使った品種分類モデルを作成し、
iris_model.pkl
というファイル名で保存しておきます。
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
import pickle
iris_datasets = load_iris()
model = LogisticRegression(C=100)
# 推論時に使用するためデータを1つだけ学習対象から除去
model.fit(iris_datasets.data[:-1], iris_datasets.target[:-1])
pickle.dump(model, open('iris_model.pkl','wb'))
- FastAPIを使ったAPI作成: 学習済みモデルを読み込み、推論結果を返すAPIを作成します。
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
import numpy as np
import pickle
# 学習済みモデルの読み込み
model = pickle.load(open("iris_model.pkl", "rb"))
app = FastAPI()
# リクエストボディの定義
class PredictRequestBody(BaseModel):
input: List[float]
@app.post("/predict")
async def iris(req: PredictRequestBody):
# リクエストボディの値をnumpy配列に変換
to_predict = np.array(req.input)
# 推論結果を返却
return { "output": int(model.predict([to_predict])) }
- 動作確認: curlコマンドでAPIを呼び出し、レスポンスを確認します。
(environments) $ curl -X POST -H "Content-Type: application/json" -d '{"input": [5.9, 3.0, 5.1, 1.8]}' http://localhost:8000/predict
{"output":2}
Cloud Runへのデプロイ
作成したAPIをCloud Runにデプロイします。
-
Dockerイメージの作成: 以下の内容で
Dockerfile
,requirements.txt
,.dockerignore
を作成します。
# Dockerfile
FROM python:3.9.0-slim
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& pip install --upgrade pip
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 8080
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
# requirements.txt
scikit-learn
fastapi
uvicorn
# .dockerignore
/environments
- Cloud Runへのデプロイ: アップロードしたイメージを指定して、Cloud Runにデプロイします。
(environments) $ gcloud run deploy
-
動作確認: デプロイ後、Cloud Runの画面に表示されているサービスのホストURLを使ってAPIを呼び出し、レスポンスを確認します。
docsにアクセスするとそこからapi叩けるので簡単です。
まとめ
今回は、FastAPIで作成したAPIをCloud Runにデプロイする手順をまとめました。ソースによると、FastAPIは簡単にAPIを作成することができ、Cloud Runへのデプロイも容易なため、非常に効率的に開発を進めることができます。
Discussion