容易にPythonマシン学習モデルを提供する


今まで新しいモデルを訓練し、すぐにAPIを介してそれを使用したいですか?時々、あなたはフラスココードを書いたり、モデルをコンテナ化したり、Dockerでそれを実行したりしたくないでしょう.それはあなたのように聞こえる場合は、間違いなくチェックアウトしたいMLServer . Pythonベースの推論サーバーですrecently went GA そして、それについて本当にきちんとしていることは、それがあまりにも生産環境のために設計された非常に性能の高いサーバーであるということです.それは、ローカルにモデルを提供することによって、彼らが生産に着くとき、彼らが全く同じ環境で動いていることを意味します.
このブログは、例としてイメージモデルのカップルを使用して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 .