Pythonを使用して機械学習モデルを作成する方法

Pythonを使用して機械学習モデルを作成する方法

導入

新しいモデルをトレーニングしたときに、Flask コード (Python Web フレームワーク) を記述したり、モデルをコンテナ化して Docker で実行したりするのではなく、API を介してすぐにモデルを使用したいシナリオに遭遇したことはありませんか?

このような要件がある場合は、必ず MLServer について学習する必要があります。これは Python ベースの推論サーバーであり、最近、実稼働環境向けに設計された高性能サーバーである GA (遺伝的アルゴリズム) バージョンがリリースされました。

これを使用して、ローカルで構築したモデルが本番環境に導入したモデルと一致していることを確認します。

この記事では、いくつかの画像モデルを例として使用して、MLServer の使用方法を説明します。

データセット

使用するデータセットは Fashion MNIST です。 10 種類のカテゴリ (トップス、ドレス、ジャケット、パンツなど) をカバーする 70,000 枚のグレースケール 28 x 28 ピクセルの衣類画像が含まれています。

この記事のコードを再現したい場合は、必ずファイルをダウンロードし、data というディレクトリに解凍してください。ファイルは非常に大きいため、GitHub リポジトリからは省略されています。

1. Scikit-learn モデルのトレーニング

まず、scikit-learn フレームワークを使用してサポート ベクター マシン (SVM) モデルをトレーニングします。次に、モデルを Fashion-MNIST.joblib というファイルに保存します。

 pandaspd としてインポートする
sklearn からsvm をインポート
インポート時間
ジョブライブラリをインポートする

#トレーニングデータを読み込む
列車= pd . read_csv ( '../../data/fashion-mnist_train.csv'ヘッダー= 0 )
y_train = 列車[ 'ラベル' ]
X_train = train.drop ([ 'label' ], axis = 1 )
分類器= svm . SVC ( カーネル= "poly"次数= 4ガンマ= 0.1 )

#モデルのトレーニング
開始= 時間. 時間()
分類.fit ( X_train.values ​​, y_train.values ​​)
終了= 時間. 時間()
exec_time = 終了- 開始
print ( f'実行時間: { exec_time } 秒' )

#モデルを保存
joblib.dump ( 分類子"Fashion-MNIST.joblib" )

注: SVM アルゴリズムは二次関数の性質を持つため、大規模なデータセットには特に適していません。ハードウェアによっては、この例のモデルのトレーニングに数分かかる場合があります。

2. Scikit-learn モデルの提供

上記の手順により、モデル ファイル Fashion-MNIST.joblib が作成されます。次に、MLServer を使用してサービスを提供する方法を見てみましょう。

まず、次のコマンドを使用して MLServer をインストールします: pip install mlserver。

追加のランタイム コンポーネントはオプションですが、モデルの提供がよりスムーズになります。Scikit-Learn および XGBoost 拡張機能もインストールします。 。

pip install mlserver-sklearn mlserver-xgboost 操作を完了したら、次の 2 つの構成ファイルを追加する必要があります。

(1) settings.json - サーバー自体の設定が含まれています。

(2) model-settings.json - 名前の通り、このファイルには実行するモデルの設定が含まれています。

settings.json ファイルでは、次の 1 つのパラメータのみを定義するだけで十分です。

 {
「デバッグ」「true」
}

model-settings.json ファイルには、サービス モデル情報を知る必要があるため、さらに情報が必要です。

 {
「名前」 : 「ファッション・スクリアン」
「実装」 : 「mlserver_sklearn.SKLearnModel」
「パラメータ」 : {
「uri」 : 「./Fashion_MNIST.joblib」
「バージョン」 : 「v1」
}
}

name パラメータは MLServer の一意の識別子を提供します。これは、マルチモデル サービング シナリオ (後述) で特に役立ちます。事前構築されたサーバー (存在する場合) に使用する実装を定義します。これは、モデルのトレーニングに使用される機械学習フレームワークと密接に連携しています。私たちの場合、モデルのトレーニングには scikit-learn を使用するため、MLServer の scikit-learn 実装を使用します。パラメータ構成には、モデル ファイルの場所とバージョン番号が必要です。

上記の構成では、次のコマンドを使用してモデルを提供できます: mlserver start 。

とても簡単です。これで、モデルがローカル サーバー上で実行されるようになりました。この時点で、HTTP や gRPC などのリクエストをすでに受け入れることができます (デフォルトのポートは 8080 と 8081 です)。

3. モデルをテストする

モデルが起動して実行されたので、いくつかのリクエストを送信してテストしてみましょう。

次の URL を通じて POST リクエストを送信します。

http://localhost:8080/v2/models/<モデル名>/versions/<バージョン>/infer

この URL は、以前にトレーニングされた scikit-learn モデルにアクセスするためのものです。ここでは、MODEL_NAME を fashion-sklearn のモデル名に置き換え、VERSION を v1 に置き換えます。

次のコードは、テスト データをインポートし、モデル サーバーに要求を送信し、結果を実際のラベルと比較する方法を示しています。

 pandaspd としてインポートする
輸入リクエスト

#テストデータをインポートし、最初の行と対応するラベルを取得します
テスト= pd . read_csv ( '../../data/fashion-mnist_test.csv'ヘッダー= 0 )
y_test = テスト[ 'ラベル' ][ 0 : 1 ]
X_test = test.drop ([ 'label' ], axis = 1 )[ 0 : 1 ]

#予測リクエストパラメータ
推論リクエスト= {
「入力」 : [
{
「名前」「予測」
「形状」 : X_test . 形状
「データ型」 : 「FP64」
データ : X_test.values.tolist ( )
}
]
}
エンドポイント= "http://localhost:8080/v2/models/fashion-sklearn/versions/v1/infer"

#リクエストを作成し、応答を出力する
レスポンス= リクエスト. post ( エンドポイントjson = 推論リクエスト)
print ( 応答. テキスト)
print ( y_test . values ​​)

上記の test.py を実行すると、MLServer から次の応答が返されます。

 "モデル名" : "fashion-sklearn" ,
"モデルバージョン" : "v1"
「id」 : 「31c3fa70-2e56-49b1-bcec-294452dbe73c」
「パラメータ」 : null
「出力」 : [
{
「名前」「予測」
"形" : [
1
]、
「データ型」 : 「INT64」
「パラメータ」 : null
"データ" : [
0
]
}
]
}

応答から、MLServer がリクエスト ID を生成し、リクエストを処理するために使用されたモデルとバージョンに関するメタデータを自動的に追加したことがわかります。モデルが本番環境に導入されると、同様のメタデータを収集することが非常に重要になります。すべてのリクエストをログに記録できるため、監査とトラブルシューティングが容易になります。

MLServer が配列出力を返すことにも気づくかもしれません。リクエストでは 1 行のデータのみが送信されますが、MLServer はリクエストをバッチで処理し、まとめて返します。アダプティブ バッチングと呼ばれる手法により、運用環境で複数のリクエストを処理する方法を最適化することもできます。

上記の例では、モデルの予測結果も確認できます。 output[0].dataは、モデルがこのサンプルをカテゴリ0としてラベル付けしたことを示します(値0はカテゴリTシャツ/トップスに対応します)。このサンプルの真のラベルも 0 なので、モデルは正しい予測を行います。

4. XGBoostモデルのトレーニング

MLServer を使用して単一のモデルを作成する方法を確認したので、異なるフレームワークでトレーニングされた複数のモデルを処理する方法を確認しましょう。

引き続き Fashion MNIST データセットを使用しますが、今回は XGBoost モデルをトレーニングします。

 pandaspd としてインポートする
xgboostxgb としてインポートします
インポート時間

#トレーニングデータを読み込む
列車= pd . read_csv ( '../../data/fashion-mnist_train.csv'ヘッダー= 0 )
y_train = 列車[ 'ラベル' ]
X_train = train.drop ([ 'label' ], axis = 1 )
dtrain = xgb.DMatrix ( X_train.values ​​、 ラベル= y_train.values ​​)

#モデルのトレーニング
パラメータ= {
'最大深度' : 5 ,
'η' : 0.3
「冗長性」 : 1 ,
'目的' : 'マルチ:ソフトマックス' ,
'num_class' : 10
}
num_round = 50
開始= 時間. 時間()
bstmodel = xgb.train ( params dtrainnum_roundevals = [( dtrain'label' )]、 verbose_eval = 10 )
終了= 時間. 時間()
exec_time = 終了- 開始
print ( f'実行時間: { exec_time } 秒' )

#モデルを保存
bstmodel . save_model ( 'Fashion_MNIST.json' )

XGBoost モデルをトレーニングするための上記のコードは、以前に scikit-learn モデルをトレーニングするために使用されたコードと似ていますが、今回は、XGBoost と互換性を持たせるためにモデルを Fashion_MNIST.json ファイルとして保存します。

5. 複数のモデルを提供する

MLServer の大きな利点の 1 つは、マルチモデル サービングをサポートしていることです。つまり、デプロイする ML モデルごとに新しいサーバーを作成したり実行したりする必要がないということです。上記で構築したモデルを使用すると、この機能を使用して同時に提供されます。

MLServer が起動すると、ディレクトリ (およびサブディレクトリ) 内で model-settings.json ファイルを検索します。 model-settings.json ファイルが複数ある場合は、それらすべてが自動的に提供されます。

注: ルートディレクトリの(サーバー設定)ファイルsettings.jsonのみを指定する必要があります。

参考までに、ディレクトリ構造の内訳を以下に示します。


├── データ
├── ファッション- mnist_test . csv
└── ファッション- mnist_train . csv
├── モデル
├── スキル
├── Fashion_MNIST . joblib
├── モデル- settings.json
├── test.py
└── train.py
└── xgブースト
├── Fashion_MNIST . json
├── モデル- settings.json
├── test.py
└── train.py
├── README.md
├── 設定.json
└── test_models.py

model-settings.json ファイルが 2 つあることに注意してください。1 つは scikit-learn モデル用、もう 1 つは XGBoost モデル用です。

これで、 mlserver start . を実行すると、両方のモデルのリクエストの処理が開始されます。

 [ mlserver ] INFO - モデル'fashion-sklearn'正常にロードされました
[ mlserver ] INFO - モデル'fashion-xgboost'正常にロードされました

6. 複数のモデルの精度をテストする

両方のモデルが MLServer 上で実行されるようになったので、テスト セットのサンプルを使用して各モデルの精度を検証できます。

次のコードは、バッチ リクエスト (完全なテスト セットを含む) を各モデルに送信し、予測を実際のラベルと比較します。テスト セット全体に対してこれを行うと、各モデルの精度を測定し、最終結果を印刷できるようになります。

 pandaspd としてインポートする
輸入リクエスト
json をインポート

#テストデータをインポートし、ラベルからデータを分割します
テスト= pd . read_csv ( './data/fashion-mnist_test.csv'ヘッダー= 0 )
y_test = テスト[ 'ラベル' ]
X_test = test.drop ([ 'label' ], axis = 1 )

#推論リクエストを構築する
推論リクエスト= {
「入力」 : [
{
「名前」「予測」
「形状」 : X_test . 形状
「データ型」 : 「FP64」
データ : X_test.values.tolist ( )
}
]
}

#予測リクエストを関連モデルに送信し、応答をトレーニングラベルと比較し、精度を計算します
def infer ( モデル名, バージョン):
エンドポイント= f"http://localhost:8080/v2/models/ { モデル名} /versions/ { バージョン} /infer"
レスポンス= リクエスト. post ( エンドポイントjson = 推論リクエスト)

#精度を計算する
正解= 0
i の場合予測enumerate ( json . loads ( response . text )[ 'outputs' ][ 0 ][ 'data' ]):
y_test [ i ] == prediction の場合:
正解+= 1
精度= 正解/ 長さ( y_test )
print ( f'{ model_name } のモデル精度: { 精度} ' )

推論( "fashion-xgboost""v1" )
推論( "fashion-sklearn""v1" )

結果は、XGBoost モデルが SVM scikit-learn モデルよりもわずかに優れていることを示しています。

 ファッションモデル精度- xgboost : 0.8953
ファッションモデル精度- sklearn : 0.864

要約する

上記の説明を通じて、MLServer を使用してモデルを提供する一般的なプロセスを理解できたと思います。さらに詳しく知る必要がある場合は、ドキュメントを読んで、さまざまなフレームワークの例を確認する必要があります。

MLFlow ユーザーの場合は、MLServer を使用して MLFlow で直接モデルを提供できます。また、Kubernetes ユーザーの場合は、Kubernetes にモデルをデプロイするためのオープンソース ツールである Seldon Core について知っておく必要があります (内部では MLServer を使用します)。

翻訳者紹介

51CTO コミュニティ エディター兼シニア アーキテクトの Cui Hao 氏は、ソフトウェア開発とアーキテクチャで 18 年の経験があり、分散アーキテクチャでは 10 年の経験があります。元HPの技術専門家。彼は情報を共有することに積極的で、60 万回以上読まれている人気の高い技術記事を多数執筆しています。 『分散アーキテクチャの原則と実践』の著者。

参考リンク: https://dzone.com/articles/How-to-Utilize-Python-Machine-Learning-Models

<<:  世界初、常温量子コンピュータが実用化!絶対零度の温度は必要ありません。メインコアには実際に「ダイヤモンドがセットされています」

>>:  初心者のためのディープラーニングの10,000語レビュー

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

...

AIを慎重に導入するためのベストプラクティス

人工知能を正しく使用するために、いくつかの提案があります。人工知能を実際に使用する際にこれらの提案を...

MITとIBMが共同で「コンピュータービジョンの黄金時代に備える」ための新しいデータセットを発表

人工知能の分野における画像分類問題に関して言えば、トレーニングとテストに最もよく使用されるデータセッ...

...

2020 年のデータサイエンスのトレンド

企業が自社が所有するビッグデータを高速かつ効率的、コスト効率よく革新的な方法で活用することをますます...

PaddleOCRのスーパーパワーを解き放つ

光学文字認識 (OCR) は、機械が画像やスキャンされた文書からテキストを認識して抽出できるようにす...

全人代副代表の馬化騰氏は8つの書面提案を提出し、ブロックチェーンや人工知能など17の質問に答えた。

[[221404]] 3月3日午後9時30分、全国人民代表大会の代表でテンセント会長の馬化騰氏が黒...

AIの技術的負債の解消は急務

この流行は世界市場に衝撃をもたらしたが、人工知能(AI)企業への資本投資は増加し続けている。 CB ...

MIT の Jia Haojun 博士と Duan Chenru 博士への独占インタビュー: AI4S 時代の化学物質の発見 - 「AI 錬金術」

エジソンが何千もの材料をフィラメントとして試し、試行錯誤を繰り返し、決して諦めない精神でようやく日常...

AGI(汎用人工知能)は数年のうちに実現されるでしょうか? 3つのテクノロジー大手が判決を下す

2011年、Google DeepMindの共同創設者であるシェーン・レッグは、2028年までにAI...

AIと機械学習がSaaS業界にどのような変化をもたらすか

GlobalDots の CTO である Yair Green 氏が、人工知能と機械学習がサービスと...

人工知能は人材紹介業界に狙いを定めています。仕事を見つけるにはロボットに頼らなければならないのでしょうか?

実装プロセスにおいて、AI 採用は本当にスローガン通りの結果を達成できるのでしょうか?求職者は3時間...

...

フェデレーテッドラーニング - プライバシーの障壁を突破し、データの価値を引き出す

1. フェデレーテッドラーニングの背景従来の機械学習手法では、トレーニングのためにデータを単一のマシ...