この記事では、Flaskを使ってMLモデルをデプロイする方法について説明します。
この記事では、Flaskのライブラリに関する予備知識はないものとします。
デプロイメントとは
デプロイメントとは、簡単に言うと、あなたのコードをエンドユーザーが利用できるようにすることです。
ここで例を挙げてみましょう。
あなたは、社会に大きな価値をもたらすと思われるアプリを設計しました。
そのアプリをテストしたところ、あなたのローカルマシンでは完璧に動作しました。
しかし、他のユーザーはどのようにあなたのアプリを使うことができるでしょうか?簡単です。
ユーザーがアクセスできるコンピュータ(サーバー)上でアプリを実行する必要があります。
このように、サーバー上でコードをテストして実行するプロセス全体を、デプロイメントと呼びます。
今回のケースでは、機械学習モデルをローカルマシンにデプロイすることはありません。
Flaskとは?
「Flask は軽量な WSGI Web アプリケーションフレームワークです。
これは、複雑なアプリケーションにスケールアップする能力を持つ、迅速かつ簡単に始めることができるように設計されています。
WerkzeugとJinjaのシンプルなラッパーとして始まり、最も人気のあるPythonのWebアプリケーションフレームワークの1つになっています。
Flaskのもう一つの重要な特徴は、追加の依存関係を強制しないことで、開発者に使用するライブラリの選択肢を与えていることです。
Flaskのインストールやアップデートは、ターミナルからpipコマンドで行うことができます。
pip install -U Flask
|
Note: Linux ユーザーは、python 3 バージョンの pip3 を使用するとよいでしょう。
この記事もチェック:Ubuntu LinuxでターミナルからAudaciousをインストールする
Flaskを使ったMLモデルのデプロイ手順
さっそくFlaskライブラリを使って機械学習モデルをデプロイする手順を紹介します。
この記事もチェック:Pythonで機械学習をライブラリや概要をまとめてみた
1. モデルを準備する
Flaskがインストールされたので、次はデプロイするモデルです。
notebook/IDEでモデルを鍛えたのであれば、今こそ鍛えたモデルを保存する時です。
注意点として、デプロイ時にはモデルの学習は行われません。
MNISTデータセットの画像を分類するために、多層知覚を使用する予定です。
TensorFlowモデルを保存するには、次のようにします。
model.save( '<path to the model>/my_model.h5' )
|
このモデルは画像を入力として受け取り、その画像のラベルを返す。
# os to handle saving/deleting images import os
# Import the required functions from flask from flask import Flask, request, flash, redirect, send_file
# TensorFlow for loading the model import tensorflow as tf
|
2. ワークフローを設計する
学習済みモデルができたので、サーバーがどのようにユーザーリクエストを処理すべきかを設計することができます。
以下は、提案されたモデルです。
- ユーザーはHTTP POSTリクエストを使用してサーバーに画像をアップロードします。
-
- 画像は受信され、サーバーに保存される。また、画像に潜在するセキュリティ上の脅威をチェックすることができます。
-
- 保存された画像は、モデルを通過します。
- モデルの結果がテキストの形でユーザーに返される。
それをまとめたフローチャートがこちらです。
# Creates a flask app with a name same as the file name # we can refer to this flask app as 'app' in our program app = Flask(__name__)
|
注:これは過度に単純化されたモデルです。
実際のモデルは、設計や実装が非常に難しく、この記事の範囲外である複雑なデータパイプラインを作成する必要があります。
この記事もチェック:Pythonとsklearnを使って機械学習パイプラインを実装する方法
3. Flask API のコーディング
アプリを実行するpythonファイルapp.pyを作成します。
インポート文です。
# uploaded images are stored in 'images' folder UPLOAD_FOLDER = './images'
# Setting a environment variable app.config[ 'UPLOAD_FOLDER' ] = UPLOAD_FOLDER
|
アプリの作成
# Assuming the model is saved in folder models as model_1.h5 model = tf.keras.models.load_model( 'models/model_1.h5' )
|
画像アップロードフォルダの設定
@app .route( '/' , methods = [ 'POST' ])
def upload_file():
if 'file' not in request.files:
flash( 'No file part' )
return redirect(request.url)
file = request.files[ 'file' ]
if file .filename = = '':
flash( 'No selected file' )
return redirect(request.url)
if file :
filename = secure_filename( file .filename)
filename = os.path.join(app.config[ 'UPLOAD_FOLDER' ], filename)
file .save(filename)
# Read from file and convert to tensor
img_tensor = tf.io.decode_image(filename)
results = model.predict(img_tensor)
# Delete the file
os.remove(filename)
return " + str (results) + "
|
モデルの読み込み
# If this file is run as standalone file # The app will run in debug mode if __name__ = = '__main__' :
app.run(debug = True )
|
弊社アプリのREST API
私たちのアプリは、ユーザーに対してデータを送受信します。
そのために、ある一定のルールを指定する必要があります。
アプリデコレーターは、関数upload_file()をアプリにバインドします。
この関数はベースURL(’/’として指定)にルーティングされ、許可される唯一のメソッドはPOST、つまりユーザーがベースURLにアップロードすることができます。
upload_file()は、ファイルがない状態から正しいファイルまで、様々なファイルアップロードの条件を引き受けます。
# If your file server name is app.py python3 app.py |
注:この部分は、他の部分とは異なり、クライアントからのリクエストごとに何度も実行されます。
この記事もチェック:Flaskにおけるアプリケーションコンテキストとリクエストコンテキストを解説する
4. アプリを実行する
curl -X POST -H "Content-Type: multipart/form-data" -F "file=@<file location>" http: //127 .0.0.1:5000/
|
サーバーを立ち上げる
サーバーは、アプリのエンドポイントである http://127.0.0.1:5000/ で実行されていることに注意してください。
アプリがローカル マシンで実行されているので、URL を使用するだけでアプリにアクセスできます。
画像をアップロードする
私たちは、エンドユーザーの生活を楽にするために、フロントエンドを使用していません。
一方、バックエンドとフロントエンドを分離するこのアプローチは、他のスタンドアロンなフロントエンドアプリとのやりとりを容易にします。
フロントエンドがなくても、画像をアップロードするために古き良きcurlコマンドを使用することができます。
を画像の場所に置き換えてください。
結論
機械学習モデルをローカルマシンに簡単にデプロイできるため、ネットワークに接続しているユーザーがアプリサービスを利用できるようになることがわかりました。
アプリサービスを24時間365日稼働させるためには、アプリをコンピュータ上で24時間稼働させる必要があります。
この場合、Heroku、DigitalOcean、Azureなどのサーバーでコードを実行することを検討してもよいでしょう。
サーバーへのコードのデプロイについては、後日、解説する予定です。
ご期待ください。
この記事もチェック:機械学習の4つの種類について解説していく