100 日で機械学習: モデルのトレーニングが完了したら、次は何をする?

100 日で機械学習: モデルのトレーニングが完了したら、次は何をする?

機械学習をマスターするための 100 日 | 1 日目から 62 日目までのコレクション

みなさんこんにちは。私はラオ・フーです。

「100日で機械学習」シリーズも久しぶりの更新です。最近は、機械学習モデルのデプロイやディープラーニングフレームワークの開発に使える、gRPC を使ったオープンソースフレームワークを取り上げています。この記事は「100日で機械学習」の続編です。一緒に gRPC を探索してみましょう。

gRPC(リモートプロシージャコール)

gRPC は Google によって開発された、言語やプラットフォームに依存しないオープンソースの RPC フレームワークです。
RPC (リモート プロシージャ コール) は、基盤となるネットワーク テクノロジを理解していなくても、ネットワーク経由でリモート コンピュータ プログラムにサービスを要求するプロトコルです。使用時には、クライアントはローカル関数を呼び出すのと同じように、サーバーが提供するインターフェースを呼び出します。

たとえば、サーバー A とサーバー B の 2 つのサーバーがあります。サーバー A にはアプリケーションがデプロイされています。サーバー B のアプリケーションが提供する関数/メソッドを呼び出したい場合、それらは同じメモリ空間にないため、直接呼び出すことはできません。ネットワークを使用して呼び出しのセマンティクスを表現し、呼び出しデータを伝達する必要があります。

RPC はアイデアやメカニズムのようなもので、実装方法はたくさんあります。gRPC 以外にも、Alibaba の Dubbo、Facebook の Thrift、Twitter の Finagle などがあります。

gRPC は、サービスを定義し、リモートで呼び出すことができるメソッド (パラメーターと戻り値の型を含む) を指定するという概念に基づいています。このインターフェースをサーバー側に実装し、gRPC サーバーを実行してクライアント呼び出しを処理します。クライアント側にスタブがあると、サーバー側の同じメソッドのように動作できます。 C++ で gRPC サーバーを作成し、Go、Python、Ruby でクライアントを簡単に作成できます。

上図の Protocbuf は gRPC のデータシリアル化ツールです。Protobuf を使用してデータをバイナリ データ ストリームにシリアル化することで、異なる言語 (proto3 は C++、Java、Python、Go、Ruby、Objective-C、C# をサポート) で記述され、異なるプラットフォームで実行されるアプリケーション間でデータを交換できるようになります。 ps: Protocbuf も Google によってオープンソース化されています。

Protocol Buffer は、proto ファイルをコンパイルして言語関連のコード ファイルを生成するコンパイル ツールを公式に提供しており、コーディングの作業負荷を大幅に軽減できます。シリアル化プロトコルの場合、ユーザーはビジネス オブジェクト自体、つまり IDL 定義にのみ焦点を当てる必要があり、シリアル化およびデシリアル化コードはツールによって生成されるだけで済みます。

ProtoBuf プロトコルのワークフローの詳細な説明 gRPC の例 - 機械学習モデルの展開

インスタンスを起動する前に、gRPCと関連ツールをインストールする必要があります。

pip インストール -U grpcio
pip インストール -U grpcio-tools
pip インストール -U プロトコルバッファ

  • gRPC の使用には通常、次の手順が含まれます。
  • protobuf を通じてインターフェースとデータ型を定義する
  • gRPC サーバーコードの作成
  • gRPC クライアントコードの作成

アイリス データセットを例に挙げてみましょう。ランダム フォレスト分類器を gRPC サーバーにデプロイし、クライアントはアイリスの種類を予測するリクエストを送信します。

0. ランダム フォレスト分類モデルをトレーニングし、トレーニング済みのモデルを pkl ファイルとして保存します。 # トレーニングモデル.py
sklearnからデータセットをインポートする
sklearn.pipeline からパイプラインをインポートします
joblibをインポートする
sklearn.ensemble から RandomForestClassifier をインポートします

main() を定義します:
clf = ランダムフォレスト分類器()
p = パイプライン([('clf', clf)])
p.fit(X, y)

ファイル名_p = 'IrisClassifier.pkl'
joblib.dump(p, ファイル名_p)
print('モデルを保存しました!')

__name__ == "__main__" の場合:
アイリス = datasets.load_iris()
X, y = iris.data、iris.target
主要()
1. protobufを介してインターフェースとデータ型を定義する

新しいiris_demo.protoファイルを作成する

構文 = "proto3";

パッケージアイリス;

メッセージ IrisPredictRequest // パラメータ 1 を定義する
float sepal_length = 1; // パラメータフィールド 1
float sepal_width = 2; // パラメータフィールド 2
float petal_length = 3; // パラメータフィールド 3
float petal_width = 4; // パラメータフィールド 4
}

メッセージ IrisPredictResponse{//パラメータ 1 を定義する
int32 種 = 1;
}

サービスIrisPredictor{// サービスの定義
rpc predict_iris_species(IrisPredictRequest) は (IrisPredictResponse) を返します{}
}

proto ファイル形式は通常、次の 3 つの部分で構成されます。

  • ヘッダーの構文では、バージョン番号が「proto3」として示されています。これは必ず記述する必要があります。理由はありません。
  • 中央のメッセージは、predict_iris_species メソッドのパラメーター IrisPredictRequest と IrisPredictResponse、およびパラメーター フィールドの型を定義します。
  • 最後のサービスは、RPC メソッド predict_iris_species を含むサービス IrisPredictor を定義します。ここで複数の RPC メソッドを定義し、メッセージ内の対応するパラメータを定義できます。

2. gRPC protobuf を使用して Python ライブラリ関数を生成します python -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. ./iris_demo.proto
で:

-Iはソースファイルへのパスを指定します

--python_out で、xxx_pb2.py の出力パスを指定します。他の言語を使用する場合は、対応する言語のオプションを使用してください。

--grpc_python_out はxxx_pb2_grpc.pyファイルの出力パスを指定します

--*.proto はコンパイルされる proto ファイルです。

実行が正常に完了すると、iris_demo_pb2.py (メッセージシリアル化クラスを含む) と iris_demo_pb2_grpc.py (サーバー Stub クラスとクライアント Stub クラス、および実装されるサービス RPC インターフェイスを含む) が自動的に生成されます。これら 2 つの py ファイルの詳細を気にする必要はなく、サーバーとクライアントでそれらを呼び出す方法を知るだけで済みます。

この例では、次の方法を使用します。
xxx_pb2.py
├── xxx_pb2.IrisPredictRequestは特徴データを渡すために使用されます ├── xxx_pb2.IrisPredictResponseは予測に使用されます

_pb2_grpc.py は、
├── xxx_pb2_grpc.IrisPredictorServicer サーバー スタブ クラス ├── xxx_pb2_grpc.IrisPredictorStub クライアント スタブ クラス

3. サーバーを書く

ここでの重要なポイントは、IrisPredictor クラスの predict_iris_species メソッドを定義し、iris_demo_pb2_grpc.py の add_IrisPredictorServicer_to_server メソッドを使用して IrisPredictor をサーバーに追加することです。 serve 関数は、4 つのワーカーのスレッド プールを使用して gRPC の実行方法を定義します。

# iris_prediction_server.py
grpc をインポートする
同時輸入先物から
インポート時間
ジョブライブラリをインポートする
iris_demo_pb2をインポートする
iris_demo_pb2_grpc をインポートする
インポートpredict_iris
sklearn.ensemble から RandomForestClassifier をインポートします

クラス IrisPredictor(iris_demo_pb2_grpc.IrisPredictorServicer):

@クラスメソッド
def get_trained_model(cls​​):
cls._model = joblib.load('IrisClassifier.pkl')
cls._model を返す

def predict_iris_species(自己、リクエスト、コンテキスト):
モデル = self.__class__.get_trained_model()
sepal_length = リクエスト.sepal_length
sepal_width = リクエスト.sepal_width
petal_length = リクエスト.petal_length
petal_width = リクエスト.petal_width
結果 = モデル.予測(
[[萼片の長さ、萼片の幅、花弁の長さ、花弁の幅]])
応答 = iris_demo_pb2.IrisPredictResponse(種 = 結果[0])
返答 # 不明

def run():
サーバー = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
iris_demo_pb2_grpc.add_IrisPredictorServicer_to_server(
IrisPredictor()、サーバー)
server.add_insecure_port('[::]:50055')
サーバーを起動します。
print("grpc サーバーが起動しました...")
print("ポート50055でリッスン中")
server.wait_for_termination()

__name__ == '__main__' の場合:
走る()

4. クライアントに手紙を書く

クライアント ロジックはよりシンプルになり、gRPC サービスに接続してから呼び出しを開始します。

# iris_prediction_client.py
grpc をインポートする
iris_demo_pb2をインポートする
iris_demo_pb2_grpc をインポートする

def run():
チャネル = grpc.insecure_channel('localhost:50055')
スタブ = iris_demo_pb2_grpc.IrisPredictorStub(チャネル)
リクエスト = iris_demo_pb2.IrisPredictRequest(
萼片の長さ=6.7,
萼片幅=3.0,
花びらの長さ=5.2、
花びらの幅=2.3)
レスポンス = stub.predict_iris_species(リクエスト)
print('予測は:', response.species)

__name__ == '__main__' の場合:
走る()

5. RPCを呼び出す

まずサーバーを起動する

$ python iris_prediction_server.py
grpc サーバーの起動...
ポート50055でリッスン中

別のターミナルでクライアント コードを実行し、gRPC サービスを呼び出します。予測結果は次のとおりです。

$ python iris_prediction_client.py
予測は:2
参照

<<:  物流と輸送における人工知能の将来的な役割

>>:  人工知能技術の出発点と終着点

ブログ    

推薦する

MITが家中に設置できる紙のように薄いスピーカーを開発

MITのエンジニアたちは、あらゆる表面を音源に変えることができる紙のように薄いスピーカーを開発した...

...

機械学習とデータマイニングを一般の人に説明する方法

[[210849]]データサイエンスが人工知能の発展において輝くにつれ、データマイニングと機械学習が...

機械学習ツールが肺のX線スキャンで心不全を予測

この研究は、MIT のコンピューター科学および人工知能研究所 (CSAIL) で実施され、医療診断を...

...

人工知能関連のキャリアと給与に関する 7 つの統計

現在、人手不足で高収入の AI 職種は何でしょうか? 需要が高い職種はどれでしょうか? AI はどれ...

...

無人バスに乗ってみませんか?テクノロジーは未来を変えることができるでしょうか?

無人運転車の概念は古くから存在し、無人運転車は時折ニュースの見出しにも登場します。しかし、無人運転車...

長文情報の精度はChatGPTを上回る、Metaは大規模モデルの幻覚を軽減する新手法を提案

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

...

AutoML 2.0: データ サイエンティストは時代遅れか?

AutoML はここ数年で急速に成長しました。そして、景気後退が避けられない状況となった今、人工知...

2022年の政府活動報告を聞いた後、人工知能業界が注目するべき点は以下のとおりです。

2022年全国人民代表大会と中国人民政治協商会議が開幕した。3月5日には2022年政府活動報告が発...

...