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

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

ブログ    

推薦する

孫玄、Zhuanzhuan 社アーキテクチャアルゴリズム部門: AI によるマイクロサービスアーキテクチャ

[51CTO.com からのオリジナル記事] 2014 年頃から、マイクロサービス アーキテクチャの...

AIとブロックチェーンが壊れたサプライチェーンを修復する方法

2020年にコロナウイルス危機が発生した際、医療上の緊急事態に伴って、特に一部の医療機器に関して深刻...

...

Python 自然言語処理 (NLP) を使用して要約を作成する方法

たくさんのレポートを読まなければならないときに、それぞれのレポートを簡単に要約したいという状況に遭遇...

2021年以降の人工知能トレンドに関する5つの予測

アンドリュー・ン教授(スタンフォード大学コンピュータサイエンスおよび電気工学准教授)は、「人工知能は...

年末には自動運転が実りある成果を上げ、その後の開発はワンストップサービスとなるでしょう!

2021年末までに、自動運転車の商業化は再び目覚ましい成果を達成しました。当社の統計によると、12...

大規模言語モデルとAIコードジェネレータの台頭

翻訳者 |李睿レビュー | Chonglouこの記事の著者であるMartin Heller は、 W...

工業情報化部の李英査察官:我が国の人工知能の発展は歴史的な好機を迎えている

[[253791]]工業情報化部情報技術・ソフトウェアサービス局検査官 李英氏李英氏は、一連の措置を...

百度CEOロビン・リー:AI時代のオープン性が技術の進歩を推進

8月19日、2017年ヤブリ中国起業家フォーラム夏季サミットが銀川で開催されました。百度の創業者で会...

KDnuggets 調査 | データ サイエンティストが最もよく使用するアルゴリズム トップ 10

翻訳 | 江凡百理子杰樹校正 | ロリン最新の KDnuggets 調査では、データ サイエンティス...

FacebookがFaissオープンソースリソースライブラリをリリース。精度と効率をトレードすることが機械学習の発展方向となるのか?

[51CTO.com クイック翻訳] 機械学習の分野では、データセット内の類似性を実現するために使...

エンタープライズ ナレッジ グラフが直面している機会、課題、解決策

[51CTO.com クイック翻訳]企業の業務効率と事業部門の競争力を向上させるための重要なツールと...

人工知能は二酸化炭素排出量のせいで制限されるのでしょうか?

AI にカーボン フットプリントがあることは驚くことではありません。カーボン フットプリントとは、...

...