国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

用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是Google 2017推出的線上推理服務;采用C/S架構,客戶端可通過gRPC和RESTfull API與模型服務進行通信。

TFServing的特點:

  •  支持模型版本控制和回滾:Manager會進行模型的版本的管理
  •  支持并發,實現高吞吐量
  •  開箱即用,并且可定制化
  •  支持多模型服務
  •  支持批處理
  •  支持熱更新:Source加載本地模型,通知Manager有新的模型需要加載,Manager檢查模型的版本,通知Source創建的Loader進行加載模型
  •  支持分布式模型

2.TFserving安裝

強烈建議采用docker方式安裝TFserving,安裝依賴docker和nvidia-docker(TFserving的gpu需要)

  •  docker 安裝 
  1. #安裝yum-utils工具和device-mapper相關依賴包  
  2. yum install -y yum-utils \  
  3. device-mapper-persistent-data \  
  4. lvm2  
  5. #添加docker-ce stable版本的倉庫  
  6. yum-config-manager \  
  7. --add-repo \  
  8. https://download.docker.com/linux/centos/docker-ce.repo  
  9. #更新yum緩存文件  
  10. yum makecache fast  
  11. #查看所有可安裝的docker-ce版本  
  12. yum list docker-ce --showduplicates | sort -r  
  13. # 安裝docker-ce  
  14. yum install docker-ce-17.12.1.ce-1.el7.centos  
  15. #允許開機啟動docker-ce服務  
  16. systemctl enable docker.service  
  17. #啟動Docker-ce服務  
  18. systemctl start docker  
  19. #運行測試容器hello-world  
  20. docker run --rm hello-world 
  •  nvidia-docker 安裝 
  1. # 安裝nvidia-docker2  
  2. yum install -y nvidia-docker2-2.0.3-1.docker17.12.1.ce  
  3. # 重啟docker服務  
  4. service docker restart 
  •  安裝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 支持Docker版本低于19.03的其他版本(需>=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的格式, 不支持通常的checkpoint和pb格式。

TFserving的模型包含一個.pb文件和variables目錄(可以為空),導出格式如下:. 

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

不同的深度學習框架的轉換路徑: 

  1. (1) pytorch(.pth)--> onnx(.onnx)--> tensorflow(.pb) --> TFserving  
  2. (2) keras(.h5)--> tensorflow(.pb) --> TFserving  
  3. (3) tensorflow(.pb) --> TFserving 

這里詳細介紹下pb轉換成TFserving模型 

  1. import tensorflow as tf  
  2. def create_graph(pb_file):  
  3.     """Creates a graph from saved GraphDef file and returns a saver."""  
  4.     # Creates graph from saved graph_def.pb.  
  5.     with tf.gfile.FastGFile(pb_file, 'rb') as f:  
  6.         graph_def = tf.GraphDef()  
  7.         graph_def.ParseFromString(f.read())  
  8.         _ = tf.import_graph_def(graph_def, name='' 
  9. def 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.     create_graph(pb_file) 
  15.      # tensor_name_list = [tensor.name for tensor in tf.get_default_graph().as_graph_def().node]  
  16.     input_name = '%s:0' % pb_io_name[0]  
  17.     output_name = '%s:0' % pb_io_name[1]  
  18.     with tf.Session() as sess:  
  19.         in_tensor = sess.graph.get_tensor_by_name(input_name)  
  20.         out_tensor = sess.graph.get_tensor_by_name(output_name)  
  21.         builder = tf.saved_model.builder.SavedModelBuilder(export_path)  ## export_path導出路徑  
  22.         inputs = {input_node_name: tf.saved_model.utils.build_tensor_info(in_tensor)}    
  23.         outputs = {output_node_name: tf.saved_model.utils.build_tensor_info(out_tensor)}  
  24.         signature = tf.saved_model.signature_def_utils.build_signature_def(  
  25.             inputs, outputs, method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)  
  26.         builder.add_meta_graph_and_variables(  
  27.             sesssess=sess, tags=[tf.saved_model.tag_constants.SERVING],  
  28.             signature_def_map={signature_name: signature}, clear_devices=True)  ## signature_name為簽名,可自定義  
  29.         builder.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. # models.config  
  2. model_config_list {  
  3.   config {  
  4.     name: 'your_model'  
  5.     base_path: '/models/your_model/'  
  6.     model_platform: 'tensorflow'  
  7. #     model_version_policy {  
  8. #       specific {  
  9. #         versions: 42  
  10. #         versions: 43  
  11. #       }  
  12. #     }  
  13. #     version_labels {  
  14. #       key: 'stable'  
  15. #       value: 43  
  16. #     }  
  17. #     version_labels {  
  18. #       key: 'canary'  
  19. #       value: 43  
  20. #     }  
  21.   }  
  22.   config {  
  23.     name: "mnist",  
  24.     base_path: "/models/mnist",  
  25.     model_platform: "tensorflow",  
  26.     model_version_policy: {  
  27.        specific: {  
  28.         versions: 1,  
  29.         versions: 2  
  30.        }  
  31.   }  
  32.  
  33. # 可以通過model_version_policy 進行版本的控制 
  •  啟動服務 
  1. # 建議把模型和配置文件放在docker外的本地路徑,如/home/tfserving/models, 通過-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 tensorflow/serving:latest-gpu \  
  8. --model_config_file=/models/models.config  
  9. # /home/tfserving/models 結構  
  10. ├── models.config  
  11. └── your_model  
  12.     ├── 1  
  13.     │   ├── saved_model.pb  
  14.     │   └── variables  
  15.     └── 2  
  16.         ├── saved_model.pb  
  17.         └── variables  
  18. # test  
  19. curl http://192.168.0.3:8501/v1/models/your_model  
  20.  
  21.     "model_version_status": [  
  22.         {  
  23.             "version": "2",  
  24.             "state": "AVAILABLE",  
  25.             "status": {  
  26.             "error_code": "OK",  
  27.             "error_message": ""  
  28.             }  
  29.         }  
  30.     ]        
  31.  
  32. # 其他啟動方式  
  33. # 如果多個模型在不同的目錄,可以通過-mount 單獨加載  
  34. nvidia-docker run  -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 tensorflow/serving:latest-gpu \  
  39. --model_config_file=/models/models.config 

3.3 TFserving服務調用

客戶端可以通過gRpc和http方式調用TFserving服務模型,支持多種客戶端語言,這里提供python的調用方式; 調用都是通過模型名稱和簽名來唯一對應一個模型

  •  gRpc調用, gRpc的端口是8500 
  1.  
  2. # -*-coding:utf-8 -*-  
  3. import tensorflow as tf  
  4. from tensorflow_serving.apis import predict_pb2  
  5. from tensorflow_serving.apis import prediction_service_pb2_grpc  
  6. import grpc  
  7. import time  
  8. import numpy as np  
  9. import cv2 
  10. class YourModel(object):  
  11.     def __init__(self, socket):  
  12.         """ 
  13.         Args:  
  14.             socket: host and port of the tfserving, like 192.168.0.3:8500  
  15.         """  
  16.         self.socket = socket  
  17.         start = time.time()  
  18.         self.request, selfself.stub = self.__get_request()  
  19.         end = time.time()  
  20.         print('initialize cost time: ' + str(end - start) + ' s')  
  21.     def __get_request(self):  
  22.         channel = grpc.insecure_channel(self.socket, options=[('grpc.max_send_message_length', 1024 * 1024 * 1024),  
  23.                                                               ('grpc.max_receive_message_length', 1024 * 1024 * 1024)]) # 可設置大小  
  24.         stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)  
  25.         request = predict_pb2.PredictRequest()  
  26.         request.model_spec.name = "your_model"  # model name  
  27.         request.model_spec.signature_name = "your_model"  # model signature name  
  28.         return request, stub  
  29.     def run(self, image):  
  30.         """  
  31.         Args:  
  32.             image: the input image(rgb format)  
  33.         Returns: embedding is output of model  
  34.         """  
  35.         img = image[..., ::-1]   
  36.         self.request.inputs['input'].CopyFrom(tf.contrib.util.make_tensor_proto(img))  # images is input of model  
  37.         result = self.stub.Predict(self.request, 30.0)  
  38.         return tf.make_ndarray(result.outputs['output'])  
  39.     def run_file(self, image_file):  
  40.         """  
  41.         Args:  
  42.             image_file: the input image file  
  43.         Returns:  
  44.         """  
  45.         image = cv2.imread(image_file)  
  46.         image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  
  47.         return self.run(image)  
  48. if __name__ == '__main__': 
  49.      model = YourModel('192.168.0.3:8500')  
  50.     test_file = './test.jpg'  
  51.     result = model.run_file(test_file)  
  52.     print(result)  
  53.     # [8.014745e-05 9.999199e-01] 
  •  restful api調用: restful端口是8501 
  1. import cv2  
  2. import requests  
  3. class SelfEncoder(json.JSONEncoder):  
  4.     def default(self, obj):  
  5.         if isinstance(obj, np.ndarray):  
  6.             return obj.tolist()  
  7.         elif isinstance(obj, np.floating):  
  8.             return float(obj)  
  9.         elif isinstance(obj, bytes):  
  10.             return str(obj, encoding='utf-8');  
  11.         return json.JSONEncoder.default(self, obj)  
  12. image_file = '/home/tfserving/test.jpg'  
  13. image = cv2.imread(image_file)  
  14. image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  
  15. img = image[..., ::-1]  
  16. input_data = {  
  17.     "signature_name": "your_model",  
  18.     "instances": img  
  19.  
  20. data = json.dumps(input_data, cls=SelfEncoderindent=None 
  21. result = requests.post("http://192.168.0.3:8501/v1/models/your_model:predict", datadata=data)  
  22. eval(result .content)  
  23. # {'predictions': [8.01474525e-05, 0.999919891]} 

5.總結

本文介紹了TFserving部署線上推理服務,從模型的轉換,部署啟動和調用推理,歡迎交流,希望對你有幫助。我們來回答下開篇提出的問題

  •  用什么來部署:當然是TFserving
  •  怎么提供api接口:TFserving有提供restful api接口,現實部署時會在前面再加一層如flask api
  •  多個模型GPU資源如何分配:TFserving支持部署多模型,通過配置
  •  線上模型如何更新而服務不中斷:TFserving支持模型的不同的版本,如your_model中1和2兩個版本,當你新增一個3模型時,TFserving會自動判斷,自動加載模型3為當前模型,不需要重啟 

 

責任編輯:龐桂玉 來源: Python中文社區
相關推薦

2019-08-08 08:00:00

深度學習機器學習神經網絡

2022-03-28 18:59:02

DockerFlask深度學習

2022-05-10 10:19:04

AI深度學習模型

2018-11-07 09:00:00

機器學習模型Amazon Sage

2020-11-02 14:38:56

Java 深度學習模型

2021-09-02 08:02:50

深度學習Kubernetes集群管理

2019-01-23 11:12:42

機器學習機器模型預測工資

2023-11-19 23:36:50

2020-10-13 14:42:42

深度學習Windows人工智能

2017-05-27 14:00:06

深度學習人臉建模

2024-09-09 11:45:15

ONNX部署模型

2018-02-26 17:10:57

深度學習

2023-01-09 08:00:00

遷移學習機器學習數據集

2020-09-29 17:00:33

人工智能

2017-08-16 10:57:52

深度學習TensorFlowNLP

2017-10-18 09:48:13

深度學習TensorFlow入門篇

2021-02-03 13:56:09

KerasAPI深度學習

2017-05-08 14:42:36

2023-02-23 07:46:48

學習模型數據倉庫

2024-04-18 10:39:57

點贊
收藏

51CTO技術棧公眾號

色悠悠久久综合| 精品国产乱码久久久久久老虎| 婷婷亚洲综合| 波多野结衣一区| 卡通动漫精品一区二区三区| 久久免费电影| 欧美精品中文| 日韩欧美高清| 国产欧美日韩久久| 777奇米成人网| 欧美日韩精品免费看 | 国产精品视频内| 久久99亚洲网美利坚合众国| 91在线国产福利| 国产经典一区二区三区| 精品欧美午夜寂寞影院| 日韩精品中文字幕视频在线| 久久午夜剧场| 99精品视频一区二区| 欧美日韩国产三区| 国产欧美日韩精品一区二区三区| 亚洲精品久久久久国产| 亚洲综合在线一区| 中文字幕亚洲区| 亚洲国产精品女人| 99国产精品私拍| 国产欧美一区二区三区四区| 日本欧美在线| 日韩三区在线观看| 激情成人中文字幕| 欧美性色综合网| 男女性激情视频在线观看| 成人精品免费视频| 午夜一区二区三区| 亚洲青色在线| 91沈先生作品| 国产欧美高清视频在线| 国模吧一区二区| 欧美9999| 欧美老女人性生活| 性欧美精品孕妇| 欧美整片在线观看| 丁香五月缴情综合网| 一级日本免费的| 国产精品午夜久久| 免费激情视频在线观看| 久久精品亚洲乱码伦伦中文| 免费看又黄又无码的网站| 成人小视频免费在线观看| 桥本有菜av在线| 国产在线视频一区二区三区| 制服丝袜综合日韩欧美| 韩国三级中文字幕hd久久精品| 在线观看欧美亚洲| 久久99国产精品免费网站| 日本一区免费在线观看| 美国一区二区三区在线播放| 一区二区三区在线视频看| 国产精品中文欧美| 夫妻免费无码v看片| 国产精品午夜电影| 全部a∨一极品视觉盛宴| 樱花影视一区二区| 在线观看一级片| 欧美中文字幕一区| xxxx在线视频| 精品国产一区二区三区四区在线观看| 视频一区中文字幕精品| 国产91色在线免费| 欧美日韩伊人| 一区二区欧美日韩| 久久色成人在线| 三年片观看免费观看大全视频下载| 亚洲一区二区三区四区在线免费观看 | 日韩成人午夜精品| 日本xxx免费| 91亚洲精品久久久蜜桃| 成人毛片高清视频观看| 色综合视频在线观看| 国产视频第一页在线观看| 日韩视频中午一区| 成人污污视频| 91精品久久久久久久| 久久综合影音| 毛葺葺老太做受视频| 精品欧美一区二区三区| а_天堂中文在线| 久久人人97超碰精品888| 亚洲一区 二区 三区| 亚洲成人精品电影在线观看| 久久久99精品免费观看| 你懂的在线看| 亚洲天堂av网| 日韩欧美一区二区三区在线视频| 精品综合在线| 成人黄页毛片网站| 亚洲最新合集| 亚洲午夜久久久久久久| 欧美精品一区二区三区精品| 日韩精品一线二线三线| 国产精品高潮呻吟久久| 免费电影网站在线视频观看福利| 久久久亚洲成人| 久久国产高清| 丁香婷婷激情| 亚洲精品黄网在线观看| 亚洲人成网www| 四虎影院一区二区三区| 自拍偷拍欧美精品| 136福利第一导航国产在线| 日本成人免费在线| 国产在线一区观看| 粉嫩一区二区三区国产精品| 久久精品国产综合| 国产亚洲精品自拍| 捆绑紧缚一区二区三区在线观看| 亚洲国产91精品在线观看| 久久视频在线| 青青草原成人网| 欧美成人三级电影在线| 成人高清av| 国产毛片视频网站| 欧美精品丝袜中出| 成人精品影院| 精品99在线视频| 精品少妇一区二区三区在线播放 | 久久国产三级精品| 最色在线观看| 欧美日韩第一页| 国产真实乱子伦精品视频| 在线日本中文字幕| 国产精品久久久久久久久久99| 大胆亚洲人体视频| 五月天激情在线| 国产在线精品自拍| 中文字幕亚洲精品在线观看| 91久久国产综合久久91猫猫| 精品无码久久久久国产| 亚洲高清免费在线| 久久porn| 男人舔女人下面高潮视频| 亚洲人成电影网| 成人黄色在线| 亚洲精品动漫| 最新中文字幕在线视频| 亚洲97av| 99热自拍偷拍| 日韩精品中文字幕在线观看| 亚洲经典视频在线观看| 在线观看国产v片| 国产成人精品一区二区在线| 97久久人人超碰| 欧美成人精品一区二区男人小说| 久久精品aaaaaa毛片| 欧美日韩中文字幕综合视频| 亚洲婷婷影院| 久久精品99久久久久久久久| 久久久国产精品x99av| 欧美性猛交xxxx久久久| 国产精品亚洲综合色区韩国| 国产精品成人在线| 中文文精品字幕一区二区| 日韩欧美精品电影| 天堂av免费看| 亚洲欧美日韩成人| 国产酒店精品激情| www成人在线视频| 天天想你在线观看完整版电影免费| 日韩精品中文字幕一区二区三区| 亚洲精选久久| 大地资源中文在线观看免费版| 91久久精品国产91久久| 欧美性开放视频| 欧美日韩国产成人精品| 国产在线黄色| 好看的日韩精品| 亚洲精品在线电影| 国产精品99久久久久久久vr| 成人免费看视频网站| 日本阿v视频在线观看| 久久精品成人欧美大片古装| 久久亚洲影视婷婷| 欧美男男freegayvideosroom| 成年人在线免费观看视频网站| 国产91对白在线播放| 亚洲午夜精品在线| 欧美日韩国产高清| 在线播放免费av| 992tv快乐视频| 欧美日韩不卡合集视频| 一区二区三区国产| 99精品国产在热久久婷婷| 九色porny丨入口在线| 各处沟厕大尺度偷拍女厕嘘嘘| 久久久亚洲国产天美传媒修理工| 亚洲国产成人精品视频| 99热这里只有成人精品国产| 国产精品粉嫩| 日本粉色视频在线观看| 欧美日韩电影一区二区|