TFserving によるディープラーニング モデルの導入

TFserving によるディープラーニング モデルの導入

1. TFservingとは何か

モデルをトレーニングし、それを外部の関係者に提供する必要がある場合は、モデルをオンラインでデプロイし、外部呼び出し用の適切なインターフェースを提供する必要があります。検討すべき質問としては、次のようなものがあります:

  • 展開するもの
  • APIインターフェースの提供方法
  • 複数のモデルに GPU リソースを割り当てる方法
  • サービスを中断せずにオンラインモデルを更新する方法

現在、人気のディープラーニング フレームワークは Tensorflow と Pytorch です。Pytorch は適切なオンライン デプロイメント ソリューションを公式に提供していませんが、Tensorflow はオンライン モデル推論をデプロイするための TFserving ソリューションを提供しています。さらに、Model Server for Apache MXNet は、MXNet モデル用の推論サービスを提供します。

この記事は、TFServing の使用ガイドです。 pytorch または MXNet モデルを使用する場合は、ONNX を介して TFserving モデルに変換し、TFServing にデプロイすることもできます。

TFserving とは何でしょうか?

TFserving は、2017 年に Google が開始したオンライン推論サービスです。クライアント サーバー アーキテクチャを採用しており、クライアントは gRPC および RESTfull API を介してモデル サービスと通信できます。

TFServing の機能:

  • モデルのバージョン管理とロールバックをサポート: マネージャーがモデルのバージョンを管理します
  • 同時実行をサポートし、高いスループットを実現
  • すぐに使用でき、カスタマイズ可能
  • マルチモデルサービスをサポート
  • バッチ処理をサポート
  • ホットアップデートをサポート: ソースはローカルモデルをロードし、新しいモデルをロードする必要があることをマネージャーに通知し、マネージャーはモデルのバージョンをチェックし、ソースによって作成されたローダーにモデルをロードするように通知します。
  • 分散モデルをサポート

2. TFservingのインストール

TFserving を docker モードでインストールすることを強くお勧めします。これは docker と nvidia-docker (TFserving の GPU に必要) に依存します。

  • Dockerのインストール
  1. #yum-utilsツールとデバイスマッパー関連の依存パッケージをインストールします 
  2. yum をインストール -y yum-utils \  
  3. デバイスマッパー永続データ \  
  4. lvm2  
  5. #docker-ce安定版のリポジトリを追加 
  6. yum-config-manager \  
  7. --リポジトリを追加\  
  8. https://download.docker.com/linux/centos/docker-ce.repo
  9. #yum キャッシュ ファイルを更新する
  10. yum makecache 高速 
  11. #インストール可能なすべての docker-ce バージョンを表示 
  12. yum list docker-ce --showduplicates | sort -r  
  13. # docker-ce をインストールする
  14. yum で docker-ce-17.12.1.ce-1.el7.centos をインストールします。  
  15. #起動時にdocker-ceサービスが起動するようにする 
  16. systemctl で docker.service を有効にする 
  17. #Docker-ceサービスを開始する 
  18. systemctl ドッカーを起動する 
  19. #テストコンテナhello-worldを実行する
  20. docker run --rm hello-world
  • nvidia-docker のインストール
  1. # nvidia-docker2 をインストール 
  2. yum インストール -y nvidia-docker2-2.0.3-1.docker17.12.1.ce  
  3. # dockerサービスを再起動します 
  4. サービスdockerの再起動
  • TFservingをインストールする
  1. docker pull tensorflow/serving:latest-gpu  
  2. # docker pull tensorflow/serving:1.14.0-rc0-gpu などの他のバージョンを選択することもできます

注意: dockerのバージョンとnvidia-dockerは一致している必要があります

  • 最新のnvidia-dockerにはDocker 19.03が必要です。公式のhttps://github.com/NVIDIA/nvidia-dockerを参照してください。
  • nvidia-docker2 は、19.03 未満の Docker バージョン (1.12 以上) をサポートしています。現在のサーバーには、18.09、1.17、1.13 があります https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0)

3.TFserving使用方法の説明

3.1 モデル変換

TFserving モデルは TFserving 形式に変換する必要があります。通常のチェックポイントおよび pb 形式はサポートされていません。

TFserving モデルには .pb ファイルと変数ディレクトリ (空でも可) が含まれており、エクスポート形式は次のとおりです。

  1. ├── 1  
  2. │ ├── saved_model.pb  
  3. │ └── 変数 
  4. ├── 2  
  5. │ ├── saved_model.pb  
  6. │ └── 変数

さまざまなディープラーニング フレームワークの変換パス:

  1. (1) pytorch(.pth)-- > onnx(.onnx)-- > tensorflow(.pb) - > TFserving  
  2. (2) keras(.h5) -- > tensorflow(.pb) -- > TFserving  
  3. (3) テンソルフロー(.pb) - > TFserving

ここではpbからTFservingモデルへの変換の詳細な説明を示します。

  1. テンソルフローをtfとしてインポートする 
  2. def create_graph(pb_file):  
  3. """保存された GraphDef ファイルからグラフを作成し、セーバーを返します。"""  
  4. # 保存された graph_def.pb からグラフを作成します。  
  5. tf.gfile.FastGFile(pb_file, 'rb') を f として:  
  6. graph_def = tf .GraphDef()  
  7. graph_def.ParseFromString(f.read())
  8. _ = tf .import_graph_def(graph_def、名前= '' )  
  9. pb_to_tfserving を定義します(pb_file、export_path、 pb_io_name = []、 input_node_name = 'input' output_node_name = 'output' signature_name = 'default_tfserving' ):  
  10. # pb_io_name は、pb モデルの入力と出力のノード名です。  
  11. # input_node_nameは変換後の入力名です 
  12. # output_node_nameは変換後の出力名です 
  13. # signature_nameは署名です 
  14. グラフを作成します(pb_file)
  15.   # tensor_name_list = [tf.get_default_graph().as_graph_def().node 内のテンソルの tensor.name]  
  16. 入力名= '%s:0' % pb_io_name[0]  
  17. 出力名= '%s:0' % pb_io_name[1]  
  18. tf.Session() を sess として使用:  
  19. in_tensor = sess.graph.get_tensor_by_name (入力名)  
  20. out_tensor = sess.graph.get_tensor_by_name (出力名)  
  21. builder = tf .saved_model.builder.SavedModelBuilder(export_path) ## export_path エクスポートパス 
  22. 入力= {input_node_name: tf.saved_model.utils.build_tensor_info(in_tensor)}  
  23. 出力= {output_node_name: tf.saved_model.utils.build_tensor_info(out_tensor)}  
  24. 署名= tf .saved_model.signature_def_utils.build_signature_def(  
  25. 入力、出力、 method_name = tf.saved_model.signature_constants.PREDICT_METHOD_NAME )  
  26. ビルダー.add_meta_graph_and_variables(  
  27. sess sess =sess、タグ=[tf.saved_model.tag_constants.SERVING]、  
  28. signature_def_map ={signature_name: signature}, clear_devices = True ) ## signature_name はカスタマイズ可能な署名です 
  29. ビルダー.save()  
  30. pb_model_path = 'test.pb'    
  31. pb_to_tfserving(pb_model_path, './1', pb_io_name = ['input_1_1', 'output_1'], signature_name = 'your_model' )

3.2 TFservingの設定と起動

モデルをエクスポートした後、同じモデルを異なるバージョン (バージョンの後に番号が付く) でエクスポートできます。モデルとバージョンは、TFserving 構成で指定できます。 TFserving モデルは、モデル名と署名によって一意に特定されます。 TFserving は、GPU リソースを最大限に活用するために複数のモデルを構成できます。

  • モデル構成
  1. # モデル.config  
  2. モデル構成リスト{  
  3. 設定{  
  4. 名前: 'your_model'  
  5. ベースパス: '/models/your_model/'  
  6. モデルプラットフォーム: 'tensorflow'  
  7. # モデルバージョンポリシー {  
  8. # 特定の {
  9. バージョン数: 42  
  10. バージョン数: 43  
  11. # }  
  12. # }  
  13. # バージョンラベル {  
  14. # キー: 'stable'  
  15. # 値: 43
  16. # }  
  17. # バージョンラベル {  
  18. # キー: 'canary'  
  19. # 値: 43  
  20. # }
  21. }
  22. 設定{
  23. 名前: "mnist",  
  24. ベースパス: "/models/mnist",  
  25. モデルプラットフォーム: "テンソルフロー",  
  26. モデルバージョンポリシー: {  
  27. 特定の:  
  28. バージョン: 1,
  29. バージョン: 2
  30. }
  31. }  
  32. }  
  33. # バージョン管理はmodel_version_policyを通じて実行できます
  • サービスを開始する
  1. # モデルと設定ファイルを /home/tfserving/models などの docker 外のローカルパスに配置し、-v で docker にマウントすることをお勧めします。  
  2. # --model_config_file: モデル設定ファイルを指定する 
  3. # -e NVIDIA_VISIBLE_DEVICES = 0 : GPUを指定する 
  4. # -p はポートマッピングを指定します。8500 は gRpc、8501 は RESTful API ポートです。
  5. # -t はDockerイメージです 
  6. nvidia-docker run -it --privileged -d -e NVIDIA_VISIBLE_DEVICES = 0 -v /home/tfserving/models:/models -p 8500:8500 -p 8501:8501 \  
  7. -t テンソルフロー/サービング:最新のGPU \  
  8. --model_config_file =/models/models.config  
  9. # /home/tfserving/models 構造 
  10. ├── モデル.config  
  11. └── あなたのモデル
  12. ├── 1
  13. │ ├── saved_model.pb  
  14. │ └── 変数 
  15. └── 2  
  16. ├── saved_model.pb
  17. └── 変数 
  18. # テスト 
  19. curl http://192.168.0.3:8501/v1/models/your_model  
  20. {  
  21. "モデルバージョンステータス": [  
  22. {  
  23. "バージョン": "2",  
  24. "状態": "利用可能",  
  25. "状態": {  
  26. "エラーコード": "OK",  
  27. "エラーメッセージ": ""
  28. }  
  29. }  
  30. ]  
  31. }  
  32. # その他の起動方法 
  33. # 複数のモデルが異なるディレクトリにある場合は、-mount で個別にロードできます。  
  34. nvidia-docker 実行 -it --privileged -d -e NVIDIA_VISIBLE_DEVICES = 0 \  
  35. --mount type = bind source = /home/tfserving/models/your_model、 target = /models/your_model \  
  36. --mount type = bind source =/home/tfserving/models/your_model/models.config、 target =/models/models.config \  
  37. -p 8510:8500 -p 8501:8501 \  
  38. -t テンソルフロー/サービング:最新のGPU \  
  39. --model_config_file =/models/models.config

3.3 TFservingサービス呼び出し

クライアントは、複数のクライアント言語をサポートし、gRpc と http を介して TFserving サービス モデルを呼び出すことができます。以下は Python 呼び出しメソッドです。呼び出しは、モデル名とシグネチャを通じてモデルに一意に対応します。

  • gRpc 呼び出し、gRpc ポートは 8500 です
  1. #  
  2. # -*-コーディング:utf-8 -*-  
  3. テンソルフローをtfとしてインポートする 
  4. tensorflow_serving.apis から predict_pb2 をインポートします 
  5. tensorflow_serving.apis から prediction_service_pb2_grpc をインポートします 
  6. grpc をインポートする 
  7. インポート時間 
  8. numpyをnpとしてインポートする 
  9. cv2をインポート
  10. クラスYourModel(オブジェクト):  
  11. def __init__(self, ソケット):  
  12. 「」
  13. 引数:  
  14. socket: tfserving のホストとポート (192.168.0.3:8500 など)  
  15. 「」  
  16. self.socket = ソケット 
  17. 開始=時間.time()
  18. self.request、 self self.stub = self.__get_request()  
  19. 終了=時間.time()  
  20. print('コスト時間の初期化: ' + str(end - start) + ' s')  
  21. __get_request(自分)を定義します:  
  22. チャネル= grpc.insecure_channel (self.socket、オプション=[('grpc.max_send_message_length'、1024 * 1024 * 1024)、  
  23. ('grpc.max_receive_message_length', 1024 * 1024 * 1024)]) # 設定可能なサイズ 
  24. スタブ= prediction_service_pb2_grpc.PredictionServiceStub (チャネル)  
  25. リクエスト= predict_pb2.PredictRequest ()  
  26. request.model_spec.name = "your_model" # モデル名 
  27. request.model_spec.signature_name = "your_model" # モデル署名名 
  28. 返品リクエスト、スタブ 
  29. def run(self, イメージ):  
  30. 「」  
  31. 引数:  
  32. 画像: 入​​力画像(RGB 形式)  
  33. 戻り値: 埋め込みはモデルの出力です 
  34. 「」  
  35. img =画像[..., ::-1]  
  36. self.request.inputs['input'].CopyFrom(tf.contrib.util.make_tensor_proto(img)) # 画像はモデルの入力です 
  37. 結果= self.stub.Predict (self.request, 30.0)  
  38. tf.make_ndarray(result.outputs['output']) を返します 
  39. def run_file(self, image_file):  
  40. 「」  
  41. 引数:  
  42. image_file: 入力画像ファイル 
  43. 戻り値:  
  44. 「」  
  45. 画像= cv2.imread (画像ファイル)  
  46. 画像= cv2.cvtColor (画像、cv2.COLOR_BGR2RGB)  
  47. self.run(画像) を返します 
  48. __name__ == '__main__' の場合:
  49.  モデル= YourModel ('192.168.0.3:8500')  
  50. テストファイル= './test.jpg'    
  51. 結果=モデル.run_file(test_file)  
  52. 印刷(結果)  
  53. # [8.014745e-05 9.999199e-01]
  • RESTful API 呼び出し: RESTful ポートは 8501 です
  1. cv2をインポート 
  2. 輸入リクエスト 
  3. クラスSelfEncoder(json.JSONEncoder):  
  4. def default(self, obj):  
  5. isinstance(obj, np.ndarray): の場合 
  6. obj.tolist() を返す 
  7. elif isinstance(obj, np.floating):  
  8. float(obj) を返す 
  9. elif isinstance(obj, バイト):  
  10. str(obj、エンコーディング= 'utf-8' ) を返します。  
  11. json.JSONEncoder.default(self, obj) を返します。  
  12. 画像ファイル= '/home/tfserving/test.jpg'    
  13. 画像= cv2.imread (画像ファイル)  
  14. 画像= cv2.cvtColor (画像、cv2.COLOR_BGR2RGB)  
  15. img =画像[..., ::-1]  
  16. 入力データ= {  
  17. "署名名": "あなたのモデル",  
  18. 「インスタンス」: 画像 
  19. }  
  20. data = json.dumps (input_data、 cls = SelfEncoder インデント= None )  
  21. 結果=リクエスト.post("http://192.168.0.3:8501/v1/models/your_model:predict",データデータ=data)  
  22. eval(結果.コンテンツ)  
  23. # {'予測': [8.01474525e-05, 0.999919891]}

5. まとめ

この記事では、モデルの変換からデプロイメントの起動、推論の呼び出しまで、TFserving を使用してオンライン推論サービスをデプロイする方法を紹介します。アイデアの交換を歓迎し、お役に立てれば幸いです。冒頭で提起した疑問に答えてみましょう

  • 導入するもの: もちろんTFserving
  • API インターフェースの提供方法: TFserving は RESTful API インターフェースを提供します。実際のデプロイメントでは、Flask API などの別のレイヤーが前面に追加されます。
  • 複数のモデルにGPUリソ​​ースを割り当てる方法:TFservingは、設定によって複数のモデルを展開することをサポートしています。
  • サービスを中断せずにオンライン モデルを更新する方法: TFserving はさまざまなバージョンのモデルをサポートしています。たとえば、your_model にはバージョン 1 と 2 の 2 つがあります。新しいモデル 3 を追加すると、TFserving は再起動せずにモデル 3 を現在のモデルとして自動的に判別し、自動的にロードします。

<<:  快手は520で「ボーイフレンド」を送信。GANは敵対的ネットワークを生成し、独身者が「独身から抜け出す」のを助ける

>>:  ボストン・ダイナミクスのロボット犬が羊の群れを誘導し始めるとネットユーザーが反応: 人間が解雇される前に犬が失業中

ブログ    
ブログ    
ブログ    

推薦する

上場企業141社がAIに騙された! Googleは偶然共犯者になる

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

スタンフォード大学の教授が、専門家以外の人向けにAIの核となる概念を1ページで定義

スタンフォード大学のクリストファー・マニング教授は、AI 分野の中核となる概念を 1 ページを使って...

【アルゴリズム】アルゴリズムを理解する(I)—アルゴリズムの時間計算量と空間計算量

[[407579]]序文大企業の秋季採用の先行スタートが始まっており、新卒採用の秋季大幅強化の警鐘が...

わずか6ステップで機械学習アルゴリズムをゼロから実装

機械学習アルゴリズムをゼロから作成することで、多くの経験が得られます。ようやく読み終えたとき、嬉しい...

マスク氏がテスラFSD V12の試乗を生放送!世界初のエンドツーエンドAI自動運転、10,000台のH100でトレーニング

現地時間8月26日、マスク氏は自らオンラインにアクセスし、FSD Beta V12の試乗ライブ放送を...

ハードコア! CES 2021 アワード: 労働者は仮想人間、口紅は AI アルゴリズムを追加、ロボットは毛皮で覆われる

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

ディープラーニング? 「ブラックボックス」である必要はない

ディープニューラルネットワークのパラメータネットワークは非常に大きく複雑であり、これによりマシンはこ...

AIが疫病と戦う:百度がマスク顔検出・分類モデルをオープンソース化

仕事に戻るにあたり、各地域はどのように流行を予防すべきでしょうか?人工知能技術は、新型コロナウイルス...

強力な暗号化アルゴリズムによる SQL インジェクション事例

暗号化には、情報の機密性などさまざまな利点があります。ただし、アプリケーションのセキュリティを確保す...

...

Pythonアルゴリズムを使用して取引する方法

投資管理会社でシステム開発エンジニアとして働いていたとき、定量金融で成功するには、数学、プログラミン...

...

AI機能をエッジに拡張する方法: ストレージが基盤となる

[[270991]]人工知能技術の復活は、ここ数年の IT に代表される計算能力の大幅な向上が主な要...

AIロボットの出現により、運転訓練業界における知能の新たな章が開かれた。

近年、都市化と道路交通建設の加速により、自動車旅行の需要が継続的に増加しており、道路上の車両数の継続...