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
参照

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

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

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

推薦する

ポストSORA時代において、CV実践者はどのようにモデルを選択するのでしょうか?畳み込みまたはViT、教師あり学習またはCLIPパラダイム

ImageNet の精度は常にモデルのパフォーマンスを評価するための主要な指標であり、ディープラーニ...

注目の話題 | 3年生が独力でAIモデルを解読

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

...

AIを使って人の心を理解する?感情科学の専門家:表情から感情を識別するのは信頼できない

AIは人間の感情を認識できるでしょうか?原理的には、AIは音声認識、視覚認識、テキスト認識、表情認識...

...

...

メタは商業用人工知能に注力するためタンパク質折り畳みチームを解散すると報道

フィナンシャル・タイムズによると、8月8日、ソーシャルメディア大手のMeta(旧Facebook)は...

ロボットが人間の「仲間」となり、人間と機械の関係が変化する。これは良いことなのか、悪いことなのか?

最近南京で開催された2020年世界知能製造会議において、中国工程院の研究者らは、人類の発展の観点から...

未来の都市: スマートテクノロジーが持続可能な革命をリードする方法

最近の急速な技術発展により、真のスマートシティの時代が近づいてきました。人工知能、クラウドおよびエッ...

顔認識技術の応用の安全管理に関する規定(試行)コメント:1万人以上の顔情報の保管は中国サイバースペース管理局に登録する必要がある

8月8日、IT Homeは中国サイバースペース事務局から、顔認識技術の応用を標準化するため、「中華人...

自動運転と安全性の「距離」

4月15日、2021年上海モーターショー前夜、ファーウェイは自動運転システムADSのプロモーション...

人工知能が悪性脳腫瘍の発症予測にどのように役立つか

[51CTO.com クイック翻訳] 人工知能の発展に伴い、人々の日常生活に密接に関係する多くの分野...

AI、IoT、5Gの先進技術の背後にあるもの

代償なくして勝利はない。しかし、私たちはしばしばこのことを忘れ、即座の勝利を要求します。これは、世界...

...