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は敵対的ネットワークを生成し、独身者が「独身から抜け出す」のを助ける

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

ブログ    
ブログ    
ブログ    

推薦する

ChatGPTへの対処方法

このテーマについて、人工知能の起源と発展、その一般原理、不安を避ける方法、そして時代に追いつく方法な...

LinkedIn: データサイエンスと機械学習は米国で最も急速に成長している職業です。

元記事: データサイエンスと機械学習が米国で最も急速に成長している職業である理由[[223686]]...

GPSを使用しない自動運転システムソリューション

自動運転技術の発展に伴い、未知の環境におけるスマートカーの測位技術がこの分野の研究の中核となっていま...

Java ガベージ コレクション アルゴリズムの紹介

51CTO 編集者注: 「Java ガベージ コレクション メカニズムの簡単な分析」では、Java ...

...

健康コードがないと旅行するのは難しいですか?顔認識により健康コードのバリアフリー利用が可能に

「公共交通機関では健康コードの提示が求められますが、提示できない場合はどうすればよいですか?」予防と...

...

...

張亜琴:業界にとって、ディープラーニングの黄金時代は始まったばかりだ

本日、張亜琴教授はCNCC 2020で「スマートテクノロジーのトレンド」をテーマに講演しました。デジ...

百度脳産業イノベーションフォーラムが深圳に移転、今回はAIを活用して不動産イノベーションを支援

AIは新たな産業変革の中核的な原動力となっています。生活のあらゆる分野が人工知能によって変革され、ア...

...

スズメバチのように機敏! MITの中国人助教授が「センチメートルサイズ」の昆虫型ロボットを開発

目の前を飛んでいる蚊を手を振って追い払っても、また戻ってきて、とてもイライラします。しかし、蚊が飛び...

AIビッグモデルがついにデータ争奪戦に参戦

現在、ビッグモデルは産業実装の初期段階にあり、高品質のデータはビッグモデルの産業化における重要な要素...