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

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

ブログ    
ブログ    

推薦する

人工知能: インダストリー4.0の原動力

製造業における AI に関する誇大宣伝の多くは産業オートメーションに焦点を当てていますが、これはスマ...

...

インストールする必要があります! Windows 7は来月SHA-2暗号化アルゴリズムのパッチをリリースする予定

[[257501]] Windows 7 は 2020 年 1 月にその歴史的使命を終えるが、マイク...

乱雑なファイルキャビネットとはお別れしましょう! AI ドキュメント管理システムの 7 つのメリット

[[341868]]従来のファイリングキャビネットは、契約書、ベンダー契約書、入社書類、その他の書類...

AIは人類にとって脅威でしょうか?人工知能には強いものと弱いものがあるが、本当の危険は強い人工知能である

近年、科学技術分野で最もホットな言葉は人工知能であり、これは近年の人工知能の急速な発展によるものです...

AIビッグモデルデータ注釈「出稼ぎ労働者」の月収は5000元以下、単価は50セントから4セントに下落

10月9日のニュースによると、AIビッグモデルは近年、人工知能の分野で話題になっており、リアルなテ...

欧州の新しいAI法は倫理監査を強化する

EU があらゆる業界での AI および機械学習技術の使用を効果的に規制する AI 法の施行に向けて...

C#アルゴリズムに関する面接の質問の簡単な分析

C# アルゴリズムの面接の質問: プログラミング: 猫が叫び、ネズミが全員逃げ出し、飼い主は目を覚ま...

ビデオ会議圧縮アルゴリズム

ビデオ会議 264 ビデオ圧縮 - SVC H.264 には、階層化されたエンコードを可能にする S...

グラフやグラフニューラルネットワークについて学びたいですか?論文を読むより良い方法はありません。

グラフ埋め込み、グラフ表現、グラフ分類、グラフニューラルネットワーク、この記事では必要なグラフモデリ...

未来を変える5つのAIトレンド

人工知能は、今の世代で最も話題になっているトピックです。人工知能は、20年後の世界がどのように発展す...

この3つのロボットを知っていますか?

ロボットには、人間との感情的なつながりを築くように設計されたフレンドリーなロボットから、複雑なタスク...

OpenAI が静かに「価値観」を変更: AGI に全力で取り組んでいないなら関与しないでください

OpenAI はひっそりとその中核となる価値観を変えました。公式ウェブサイトに掲載されている6つのコ...

...

機械学習: 教師なし学習: 9 つのクラスタリング アルゴリズム

今日は、機械学習の教師なし学習における一般的なクラスタリング手法をいくつか紹介したいと思います。教師...