容易にPythonマシン学習モデルを提供する
26329 ワード
今まで新しいモデルを訓練し、すぐにAPIを介してそれを使用したいですか?時々、あなたはフラスココードを書いたり、モデルをコンテナ化したり、Dockerでそれを実行したりしたくないでしょう.それはあなたのように聞こえる場合は、間違いなくチェックアウトしたいMLServer . Pythonベースの推論サーバーですrecently went GA そして、それについて本当にきちんとしていることは、それがあまりにも生産環境のために設計された非常に性能の高いサーバーであるということです.それは、ローカルにモデルを提供することによって、彼らが生産に着くとき、彼らが全く同じ環境で動いていることを意味します.
このブログは、例としてイメージモデルのカップルを使用してMLServerを使用する方法をご案内します.
私たちが働く予定のデータセットはFashion MNIST dataset . それは10種類のクラス(トップ、ドレス、コート、ズボンなど…)間でグレースケール28 x 28ピクセルの服の70000画像が含まれています.
あなたがこのブログからコードを再現したいならば、あなたはファイルをダウンロードして、名前
まず最初に、我々はサポートベクトルマシン(SVM)モデルをscikit-learn フレームワーク.次に、モデルを名前付きファイルに保存します
ので、保存したモデルファイルを持っている
まず、MLServerをインストールする必要があります.
こうすると、2つの設定ファイルを追加する必要があります. 我々のために
それは、2つの小さな設定ファイルと私たちはコマンドを使用してモデルを提供する準備が整いました
ブーム、今我々のモデルをローカルに生産準備サーバー上で実行している.HTTPとGRPCのリクエストを受け入れる準備ができました
今私たちのモデルは、稼働している.行動でそれを見るために若干の要請を送りましょう.
モデルを予測するには、次のURLにポストリクエストを送信する必要があります.
以下のコードは、テストデータのインポート方法を示し、モデルサーバーに要求を行い、結果を実際のラベルと比較します.
また、MLServerは、
上の例では、モデルの予測は
MLServerを使用して単一のモデルを作成し、提供する方法を見た今、さまざまなフレームワークで訓練された複数のモデルを処理する方法を見てみましょう.
私たちは同じファッションMNISTデータセットを使用しますが、今回は、我々は列車をXGBoost 代わりにモデル.
MLServerについてのクールなことの一つは、それがサポートすることですmulti-model serving . これは、展開するMLモデルごとに新しいサーバーを作成または実行する必要がないことを意味します.我々は上記のモデルを使用して、我々は一度にそれらを提供するためにこの機能を使用します.
MLServerが起動すると、
注:あなたはまだ
参照のために私のディレクトリ構造の内訳があります
我々は今ちょうど実行することができます
両方のモデルを今すぐとMLServer上で実行して、我々は我々のモデルのどれだけ正確な検証するために我々のテストセットからのサンプルを使用することができます.
次のコードは、すべてのモデルにバッチリクエスト(完全なテストセットを含む)を送信し、真のラベルに受信した予測を比較します.全体のテストセット全体でこれを行うと、最後に印刷される各モデルの精度の合理的に良い測定を与える.
うまくいけば今ではどのように簡単にモデルを提供するために使用されて理解を得てMLServer . 更なる情報のために、それは価値がありますdocs そして、見てくださいexamples for different frameworks .
For MLFlow 今すぐ提供するユーザーmodels directly in MLFlow using MLServer そして、あなたがあるならばKubernetes ユーザーは間違いなくチェックアウトする必要がありますSeldon Core - Kubernetes(カバーの下でMLServerを使用する)にモデルを展開するオープンソースツール.
この例のコードはすべて見つかりますhere .
このブログは、例としてイメージモデルのカップルを使用してMLServerを使用する方法をご案内します.
データセット
私たちが働く予定のデータセットはFashion MNIST dataset . それは10種類のクラス(トップ、ドレス、コート、ズボンなど…)間でグレースケール28 x 28ピクセルの服の70000画像が含まれています.
あなたがこのブログからコードを再現したいならば、あなたはファイルをダウンロードして、名前
data
. 彼らは非常に大きいので、Githubレポから省略されている.Scikit学習モデルのトレーニング
まず最初に、我々はサポートベクトルマシン(SVM)モデルをscikit-learn フレームワーク.次に、モデルを名前付きファイルに保存します
Fashion-MNIST.joblib
.import pandas as pd
from sklearn import svm
import time
import joblib
#Load Training Data
train = pd.read_csv('../../data/fashion-mnist_train.csv', header=0)
y_train = train['label']
X_train = train.drop(['label'], axis=1)
classifier = svm.SVC(kernel="poly", degree=4, gamma=0.1)
#Train Model
start = time.time()
classifier.fit(X_train.values, y_train.values)
end = time.time()
exec_time = end-start
print(f'Execution time: {exec_time} seconds')
#Save Model
joblib.dump(classifier, "Fashion-MNIST.joblib")
注意:SVMアルゴリズムは、それが二次性のため、大規模データセットに特に適していません.この例のモデルは、ハードウェアによって、電車に数分かかります.Scikitの学習モデルに役立つ
ので、保存したモデルファイルを持っている
Fashion-MNIST.joblib
. MLServerを使用してどのようにサービスを提供できるかを見てみましょう.まず、MLServerをインストールする必要があります.
pip install mlserver
追加のランタイムはオプションですが、モデルを提供するときに本当に簡単に人生を作る、我々はpip install mlserver-sklearn mlserver-xgboost
すべての推論ランタイムの詳細を見つけることができますhere こうすると、2つの設定ファイルを追加する必要があります.
settings.json
- これはサーバ自身の設定を含んでいます.model-settings.json
- 名前が示すように、このファイルには実行するモデルの設定が含まれます.settings.json
単一のパラメータを定義するだけで十分です.{
"debug": "true"
}
The model-settings.json
ファイルは、私たちが提供しようとしているモデルについて知る必要があるので、情報の数ビットを必要とします:{
"name": "fashion-sklearn",
"implementation": "mlserver_sklearn.SKLearnModel",
"parameters": {
"uri": "./Fashion_MNIST.joblib",
"version": "v1"
}
}
The name
パラメータは自明です.それはMLServerは、複数のモデルを提供するときに特に便利であるユニークな識別子を与えます(私たちは少しそれに来るでしょう).The implementation
使用するビルド済みのサーバを定義します.それはあなたのモデルを訓練するために使用される機械学習フレームワークに大きく結合されています.私たちの場合、私たちは、Scikit Learningを使用してモデルを訓練しました.モデル用parameters
私たちはちょうど私たちのモデルファイルの場所とバージョン番号を提供する必要があります.それは、2つの小さな設定ファイルと私たちはコマンドを使用してモデルを提供する準備が整いました
mlserver start .
ブーム、今我々のモデルをローカルに生産準備サーバー上で実行している.HTTPとGRPCのリクエストを受け入れる準備ができました
8080
and 8081
).モデルのテスト
今私たちのモデルは、稼働している.行動でそれを見るために若干の要請を送りましょう.
モデルを予測するには、次のURLにポストリクエストを送信する必要があります.
http://localhost:8080/v2/models/<MODEL_NAME>/versions/<VERSION>/infer
それは、我々が以前訓練した我々のSciKit Learningモデルにアクセスすることを意味しますMODEL_NAME
with fashion-sklearn
and VERSION
with v1
. 以下のコードは、テストデータのインポート方法を示し、モデルサーバーに要求を行い、結果を実際のラベルと比較します.
import pandas as pd
import requests
#Import test data, grab the first row and corresponding label
test = pd.read_csv('../../data/fashion-mnist_test.csv', header=0)
y_test = test['label'][0:1]
X_test = test.drop(['label'],axis=1)[0:1]
#Prediction request parameters
inference_request = {
"inputs": [
{
"name": "predict",
"shape": X_test.shape,
"datatype": "FP64",
"data": X_test.values.tolist()
}
]
}
endpoint = "http://localhost:8080/v2/models/fashion-sklearn/versions/v1/infer"
#Make request and print response
response = requests.post(endpoint, json=inference_request)
print(response.text)
print(y_test.values)
実行時test.py
上のコードでは、次のように応答します.{
"model_name": "fashion-sklearn",
"model_version": "v1",
"id": "31c3fa70-2e56-49b1-bcec-294452dbe73c",
"parameters": null,
"outputs": [
{
"name": "predict",
"shape": [
1
],
"datatype": "INT64",
"parameters": null,
"data": [
0
]
}
]
}
あなたは、MLServerがリクエストIDを生成し、自動的に私たちの要求に役立つために使用されたモデルとバージョンに関するメタデータを追加したことに気づくでしょう.この種のメタデータをキャプチャすることは、我々のモデルが生産に到達すると、非常に重要ですこれは、監査とトラブルシューティング目的のすべての要求をログに記録することができます.また、MLServerは、
outputs
. 我々の要求では、我々はデータの1行だけを送りました、しかし、MLServerもバッチ要求を扱い、一緒に彼らを返します.あなたも呼ばれる技術を使用することができますadaptive batching 複数のリクエストが生産環境で処理される方法を最適化します.上の例では、モデルの予測は
outputs[0].data
これは、モデルがこのサンプルをカテゴリでラベルしたことを示します0
(値0はカテゴリに対応するt-shirt/top
). そのサンプルの真のラベルは0
あまりにもモデルは、この予測を正しい得た!XGBoostモデルのトレーニング
MLServerを使用して単一のモデルを作成し、提供する方法を見た今、さまざまなフレームワークで訓練された複数のモデルを処理する方法を見てみましょう.
私たちは同じファッションMNISTデータセットを使用しますが、今回は、我々は列車をXGBoost 代わりにモデル.
import pandas as pd
import xgboost as xgb
import time
#Load Training Data
train = pd.read_csv('../../data/fashion-mnist_train.csv', header=0)
y_train = train['label']
X_train = train.drop(['label'], axis=1)
dtrain = xgb.DMatrix(X_train.values, label=y_train.values)
#Train Model
params = {
'max_depth': 5,
'eta': 0.3,
'verbosity': 1,
'objective': 'multi:softmax',
'num_class' : 10
}
num_round = 50
start = time.time()
bstmodel = xgb.train(params, dtrain, num_round, evals=[(dtrain, 'label')], verbose_eval=10)
end = time.time()
exec_time = end-start
print(f'Execution time: {exec_time} seconds')
#Save Model
bstmodel.save_model('Fashion_MNIST.json')
上記のコードは、xgboostモデルを訓練するために使用され、以前に使用したScikit Learningモデルを使用したコードに似ていますが、今回はモデルとしてXGBoost互換形式で保存されましたFashion_MNIST.json
.複数のモデルを提供
MLServerについてのクールなことの一つは、それがサポートすることですmulti-model serving . これは、展開するMLモデルごとに新しいサーバーを作成または実行する必要がないことを意味します.我々は上記のモデルを使用して、我々は一度にそれらを提供するためにこの機能を使用します.
MLServerが起動すると、
model-settings.json
ファイル.あなたが複数を持っているならばmodel-settings.json
ファイルを自動的にすべてのサービスがあります.注:あなたはまだ
settings.json
ルートディレクトリにある参照のために私のディレクトリ構造の内訳があります
.
├── data
│ ├── fashion-mnist_test.csv
│ └── fashion-mnist_train.csv
├── models
│ ├── sklearn
│ │ ├── Fashion_MNIST.joblib
│ │ ├── model-settings.json
│ │ ├── test.py
│ │ └── train.py
│ └── xgboost
│ ├── Fashion_MNIST.json
│ ├── model-settings.json
│ ├── test.py
│ └── train.py
├── README.md
├── settings.json
└── test_models.py
2つあることに注意してくださいmodel-settings.json
ファイル- Scikitを学ぶモデルとXgBoostモデルのための1つ.我々は今ちょうど実行することができます
mlserver start .
そして、両方のモデルの要求を処理し始めます.[mlserver] INFO - Loaded model 'fashion-sklearn' succesfully.
[mlserver] INFO - Loaded model 'fashion-xgboost' succesfully.
多重モデルの試験精度
両方のモデルを今すぐとMLServer上で実行して、我々は我々のモデルのどれだけ正確な検証するために我々のテストセットからのサンプルを使用することができます.
次のコードは、すべてのモデルにバッチリクエスト(完全なテストセットを含む)を送信し、真のラベルに受信した予測を比較します.全体のテストセット全体でこれを行うと、最後に印刷される各モデルの精度の合理的に良い測定を与える.
import pandas as pd
import requests
import json
#Import the test data and split the data from the labels
test = pd.read_csv('./data/fashion-mnist_test.csv', header=0)
y_test = test['label']
X_test = test.drop(['label'],axis=1)
#Build the inference request
inference_request = {
"inputs": [
{
"name": "predict",
"shape": X_test.shape,
"datatype": "FP64",
"data": X_test.values.tolist()
}
]
}
#Send the prediction request to the relevant model, compare responses to training labels and calculate accuracy
def infer(model_name, version):
endpoint = f"http://localhost:8080/v2/models/{model_name}/versions/{version}/infer"
response = requests.post(endpoint, json=inference_request)
#calculate accuracy
correct = 0
for i, prediction in enumerate(json.loads(response.text)['outputs'][0]['data']):
if y_test[i] == prediction:
correct += 1
accuracy = correct / len(y_test)
print(f'Model Accuracy for {model_name}: {accuracy}')
infer("fashion-xgboost", "v1")
infer("fashion-sklearn", "v1")
その結果、XGBoostモデルはSVM SciKit Learning 1をわずかに上回ることがわかった.Model Accuracy for fashion-xgboost: 0.8953
Model Accuracy for fashion-sklearn: 0.864
概要
うまくいけば今ではどのように簡単にモデルを提供するために使用されて理解を得てMLServer . 更なる情報のために、それは価値がありますdocs そして、見てくださいexamples for different frameworks .
For MLFlow 今すぐ提供するユーザーmodels directly in MLFlow using MLServer そして、あなたがあるならばKubernetes ユーザーは間違いなくチェックアウトする必要がありますSeldon Core - Kubernetes(カバーの下でMLServerを使用する)にモデルを展開するオープンソースツール.
この例のコードはすべて見つかりますhere .
Reference
この問題について(容易にPythonマシン学習モデルを提供する), 我々は、より多くの情報をここで見つけました https://dev.to/ukcloudman/serving-python-machine-learning-models-with-ease-37khテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol