Dockerを使用した機械学習モデルの展開-パート2



. OTUS Machine Learning: . , -, : « ML» « ».
最初の部分、このチュートリアル、我々は成功したローカルディレクトリに分類モデルを保存しJupyterノートブックに関連するすべてのモデルの開発作業を完了しました。今後は、モデルの展開に焦点を当てます。モデルを予測に再利用するには、モデルをロードしてpredict()、JupyterNotebookで通常行うようにメソッド呼び出すだけです。



モデルをテストするには、ファイルと同じフォルダーに、次のコードでmodel.pklファイルmain.py作成します



import pickle
#   ,     
import numpy as np
from sklearn.neighbors import KNeighborsClassifier

#    
with open('./model.pkl', 'rb') as model_pkl:
   knn = pickle.load(model_pkl)

#   (    )
unseen = np.array([[3.2, 1.1, 1.5, 2.1]])
result = knn.predict(unseen)

#    
print('Predicted result for observation ' + str(unseen) + ' is: ' + str(result))


予測のためにモデルを再利用します。



トレーニングプロセスを再開せずに、不明な観測に対して予測メソッドを複数回呼び出すことができます。ただし、このpyファイルをターミナルで実行すると、次のようなエラーが発生する場合があります。



Traceback (most recent call last):
 File "main.py", line 4, in <module>
   from sklearn.neighbors import KNeighborsClassifier
ImportError: No module named sklearn.neighbors


これは、使用しているパッケージが、ファイルを実行する環境で使用できないためです。これは、モデルの開発に使用される環境(conda)がランタイム(conda外のpython環境)と同一ではないことを意味し、これは他の環境でコードを実行するときに潜在的な問題と見なされる可能性があります。特に、このエラーを確認し、問題を理解し、そのような問題を回避するためにコンテナを使用してコードをデプロイすることの重要性を再強調してほしいと思いました。今のところ、「pip install」コマンドを使用して、必要なすべてのパッケージを手動でインストールできます。これを自動的に行うために、後でここに戻ります。



すべてのパッケージをインストールしてファイルを正常に実行すると、モデルはすぐに次のメッセージを返すはずです。



Predicted result for observation [[3.2 1.1 1.5 2.1]] is: [1]


ここでわかるように、ハードコードされた未知のデータを使用してモデルをテストします。これらの数字は、それぞれ、セパールの長さ、幅、花びらの長さ、幅を表しています。ただし、モデルをサービスとして公開する必要があるため、これら4つのパラメーターを含む要求を受け入れ、予測結果を返す関数として公開する必要があります。この関数は、APIサーバー(バックエンド)に使用することも、Google CloudFunctionsなどのサーバーレスランタイムに展開することもできますこのチュートリアルでは、APIサーバーを一緒に構築し、Dockerコンテナーに配置してみます。






APIはどのように機能しますか?



今日のWebアプリケーションの仕組みについて話しましょう。ほとんどのWebアプリケーションには、アプリケーションに必要なほぼすべての機能をカバーする2つの主要なコンポーネント(フロントエンドとバックエンド)があります。フロントエンドはユーザーのインターフェイス(Webページ)の提供に重点を置いていますが、フロントエンドサーバーは、HTML、CSS、JS、および画像や音声などの他の静的ファイルを保存することがよくあります。一方、バックエンドサーバーは、フロントエンドから送信されたすべての要求に応答するすべてのビジネスロジックを処理します。





Webアプリケーションの構造の図



これは、ブラウザでMediumを開いたときに発生することです。



  1. HTTP- medium.com. DNS-, , . ., .
  2. * .html, * .css, * .js , - .
  3. Medium . , «clap» () .
  4. (javascript) HTTP- id . URL- , . id XXXXXXX.
  5. (, ) .
  6. .
  7. , .


もちろん、これはMedium Webアプリケーションを使用するときに発生するプロセスとまったく同じではない可能性があり、実際にはこれよりもはるかに複雑になりますが、この簡略化されたプロセスはWebアプリケーションの動作を理解するのに役立ちます。



上の写真の青い矢印に注目してほしい。これらは、HTTP要求(ブラウザーから送信される)とHTTP応答(ブラウザーによって受信されるか、ブラウザーに送信される)です。ブラウザからの要求を処理し、バックエンドサーバーに応答を返すコンポーネントは「API」と呼ばれます。



以下はAPIの定義です。





(API — application program interface) — , . , API , .

API!



Flask、Django、Pyramid、Falcon、Tornadoなど、PythonでAPIを構築するのに役立つフレームワークはたくさんあります。長所と短所、およびこれらの構造の比較をここに示しますこのチュートリアルではFlaskを使用しますが、テクニックとワークフローは他のチュートリアルと同じです。または、この時点でお気に入りのフレームワークを使用することもできます。



最新バージョンのFlaskは、次のコマンドを使用してpip経由でインストールできます。



pip install Flask


ここで行う必要があるのは、前のステップのコードを関数に変換し、Flaskアプリケーションを初期化した後でそのAPIエンドポイントを登録することだけです。デフォルトでは、Flaskアプリケーションはlocalhost(127.0.0.1)で実行され、ポート5000で要求をリッスンします。



import pickle
#   ,     
import numpy as np
import sys
from sklearn.neighbors import KNeighborsClassifier

#  Flask   API
from flask import Flask, request

#      
with open('./model.pkl', 'rb') as model_pkl:
   knn = pickle.load(model_pkl)

#   Flask
app = Flask(__name__)

#    API
@app.route('/predict')
def predict_iris():
   #     
   sl = request.args.get('sl')
   sw = request.args.get('sw')
   pl = request.args.get('pl')
   pw = request.args.get('pw')

#    predict 
#     
   unseen = np.array([[sl, sw, pl, pw]])
   result = knn.predict(unseen)
  #   
   return 'Predicted result for observation ' + str(unseen) + ' is: ' + str(result)
if __name__ == '__main__':
   app.run()


モデルをAPIとして表す



端末では、次のように表示されます。



* Serving Flask app "main" (lazy loading)
* Environment: production
  WARNING: This is a development server. Do not use it in a production deployment.
  Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)


ブラウザを開き、アドレスバーに次のクエリを入力します。



http://localhost:5000/predict?sl=3.2&sw=1.1&pl=1.5&pw=2.1


このようなものがブラウザに表示されたら、おめでとうございます!これで、マシン学習モデルをAPIエンドポイントを持つサービスとして公開しています。



Predicted result for observation [['3.2' '1.1' '1.5' '2.1']] is: [1]


Postmanを使用したAPIテスト



最近、ブラウザを使用してAPIをすばやくテストしましたが、これはあまり効率的な方法ではありません。たとえば、GETメソッドを使用できませんでしたが、代わりにヘッダーに認証トークンを指定してPOSTメソッドを使用し、ブラウザーにそのような要求を送信させるのは簡単ではありません。ソフトウェア開発では、PostmanはAPIのテストに広く使用されており、基本的な使用は完全に無料です。





(からポストマンユーザーインターフェースポストマンのダウンロードページ

ポストマンをダウンロードしてインストールした後、ツールを開いて、あなたの要求を提出するには、以下の手順に従ってください。





PostmanでGETリクエストを送信する



  1. , GET , API GET . , POST .
  2. URL .
  3. . , .
  4. «», API.
  5. .
  6. HTTP-. .


APIエンドポイントを介してマシン学習モデルをサービスとして公開し、Postmaでそのエンドポイントをテストする方法がわかったので、次のステップは、Dockerを使用してアプリケーションをコンテナ化することです。ここでは、Dockerがどのように機能し、どのように役立つかを詳しく見ていきます。以前に遭遇したすべての依存関係の問題を解決します。



最初の部分を読んでください。



All Articles