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語レビュー

ブログ    
ブログ    
ブログ    

推薦する

システムの観点から見た中国の人工知能開発の現状

第四次産業革命が急速に起こりつつあります。人工知能はこの産業革命の中核となる内容の一つです。産業革命...

2017年世界ロボット会議エクスプレス:無人スーパーマーケットロボットがデビュー

[51CTO.com 北京レポート] 2017年8月23日から27日まで、2017年世界ロボット大会...

ヘルスケアにおけるロボット工学の新展開

ロボット工学は考えられるあらゆる分野に応用できます。教育、旅行、防衛など、あらゆる分野でロボット工学...

...

...

AI後の生活

人工知能は人類史上最も革命的な技術の一つとなるでしょう。 AI テクノロジーが発展するにつれて、どの...

自動車ドメインコントローラの統合アーキテクチャの背景、利点、設計を1つの記事で理解する

車両の電動化が徐々に進むにつれ、電子制御ユニット(ECU)が車全体を制御するようになりました。アンチ...

Nvidiaのアルゴリズムが破られ、RTX30シリーズはマイニング計算能力を100%回復:グラフィックカードの値下げは終わったのか?

GPUマイニングで米国証券取引委員会から罰金を科されたNvidiaは、最近、暗号化アルゴリズムが解...

強化学習の博士号を取得して卒業することは人気がありますか? Redditユーザーがキャリアプランニングのアドバイスを求める

最近、修士号を取得して卒業しようとしているネットユーザーがネットユーザーに助けを求めました。「強化学...

無料の Python 機械学習コース 5: 多クラス分類ロジスティック回帰

ロジスティック回帰の2つの方法:勾配降下法と最適化関数ロジスティック回帰は非常に人気のある機械学習手...

2018年に人工知能はどのように発展するでしょうか? 13人の専門家の予測を聞いてみよう

ウォール・ストリート・ジャーナル、フォーブス、フォーチュンなどの出版物は、2017 年を「AI の年...

産業用ロボットとは何ですか?

産業用ロボットとは何ですか?工業生産で使用される産業用ロボットには、溶接ロボット、研削・研磨ロボット...

LSTM の父が LLaMA 2 を激しく非難: 私のアイデアをコピーして私を辱めた!ネットユーザー:それをしたのはLeCunですか?

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...