Flaskで学習した機械学習のモデルを使えるようにする方法

スポンサーリンク

この記事では、Flaskを使ってMLモデルをデプロイする方法について説明します。

この記事では、Flaskのライブラリに関する予備知識はないものとします。

スポンサーリンク

デプロイメントとは

デプロイメントとは、簡単に言うと、あなたのコードをエンドユーザーが利用できるようにすることです。

ここで例を挙げてみましょう。

あなたは、社会に大きな価値をもたらすと思われるアプリを設計しました。

そのアプリをテストしたところ、あなたのローカルマシンでは完璧に動作しました。

しかし、他のユーザーはどのようにあなたのアプリを使うことができるでしょうか?簡単です。

ユーザーがアクセスできるコンピュータ(サーバー)上でアプリを実行する必要があります。

このように、サーバー上でコードをテストして実行するプロセス全体を、デプロイメントと呼びます。

今回のケースでは、機械学習モデルをローカルマシンにデプロイすることはありません。

Flaskとは?

「Flask は軽量な WSGI Web アプリケーションフレームワークです。

これは、複雑なアプリケーションにスケールアップする能力を持つ、迅速かつ簡単に始めることができるように設計されています。

WerkzeugとJinjaのシンプルなラッパーとして始まり、最も人気のあるPythonのWebアプリケーションフレームワークの1つになっています。

Flaskのもう一つの重要な特徴は、追加の依存関係を強制しないことで、開発者に使用するライブラリの選択肢を与えていることです。

Flaskのインストールやアップデートは、ターミナルからpipコマンドで行うことができます。

pip install -U Flask

Note: Linux ユーザーは、python 3 バージョンの pip3 を使用するとよいでしょう。

Flaskを使ったMLモデルのデプロイ手順

さっそくFlaskライブラリを使って機械学習モデルをデプロイする手順を紹介します。

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. ワークフローを設計する

学習済みモデルができたので、サーバーがどのようにユーザーリクエストを処理すべきかを設計することができます

以下は、提案されたモデルです。

  1. ユーザーはHTTP POSTリクエストを使用してサーバーに画像をアップロードします。
    1. 画像は受信され、サーバーに保存される。また、画像に潜在するセキュリティ上の脅威をチェックすることができます。
    1. 保存された画像は、モデルを通過します。
  2. モデルの結果がテキストの形でユーザーに返される。

それをまとめたフローチャートがこちらです。

# 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__)

注:これは過度に単純化されたモデルです。

実際のモデルは、設計や実装が非常に難しく、この記事の範囲外である複雑なデータパイプラインを作成する必要があります。

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 "
[+] The number is : "
+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

注:この部分は、他の部分とは異なり、クライアントからのリクエストごとに何度も実行されます。

4. アプリを実行する

curl -X POST -H "Content-Type: multipart/form-data" -F "file=@<file location>"  http://127.0.0.1:5000/

サーバーを立ち上げる

Model Working
Fig 1: Working of our model : The model takes in an image as input and returns result which is an integer.
Workflow
Fig 2: A flowchart describing the working of our model

サーバーは、アプリのエンドポイントである http://127.0.0.1:5000/ で実行されていることに注意してください。

アプリがローカル マシンで実行されているので、URL を使用するだけでアプリにアクセスできます。

画像をアップロードする

私たちは、エンドユーザーの生活を楽にするために、フロントエンドを使用していません。

一方、バックエンドとフロントエンドを分離するこのアプローチは、他のスタンドアロンなフロントエンドアプリとのやりとりを容易にします。

フロントエンドがなくても、画像をアップロードするために古き良きcurlコマンドを使用することができます

Server Output
Fig 3: Staring the server

を画像の場所に置き換えてください。

Term Output
Fig 4: Accessing the app using curl command from a terminal

結論

機械学習モデルをローカルマシンに簡単にデプロイできるため、ネットワークに接続しているユーザーがアプリサービスを利用できるようになることがわかりました。

アプリサービスを24時間365日稼働させるためには、アプリをコンピュータ上で24時間稼働させる必要があります。

この場合、Heroku、DigitalOcean、Azureなどのサーバーでコードを実行することを検討してもよいでしょう。

サーバーへのコードのデプロイについては、後日、解説する予定です。

ご期待ください。

タイトルとURLをコピーしました