TensorFlow2.0 模型部署
阿新 • • 發佈:2020-12-12
技術標籤:TensorFlow模型部署tensorflow深度學習docker
文章目錄
一、拉取TensorFlow Serving映象
docker pull tensorflow/serving
如果需要gpu版本或者其他版本可以去Docker Hub自行選擇。
二、模型打入TFServing映象內部
1.儲存模型為pb格式
首先需要將tensorflow 模型儲存為pb格式,通過如下程式碼
tf.saved_model.save("path")
如果有的同學將模型儲存為了其他結構有兩種方式解決
- 將其他格式的模型形式轉化為pb格式,網上有程式碼可以搜
- 將原有的格式的模型加載出來然後儲存為pb格式的模型即可
2.將本地模型copy入映象
- 首先,起tfserving容器
docker run -d --name tfserving tensorflow/serving:latest
- 將本地模型copy到起的容器內部的models資料夾下
docker cp /home/...本地路徑.../my_model tfserving:models/
- 最後,將包含模型的容器打成新的映象
docker commit --change "ENV MODEL_NAME my_model tfserving_new:v1
其中需要將映象中的環境變數“模型名稱”改為我們匯入模型名稱,因為預設名稱是model,如果不修改,模型是不能serverable的。 - 刪掉已經沒用的tfserving容器,起我們的新映象tfserving_new:v1
docker kill tfserving
docker rm tfserving
3.啟動新的帶有模型檔案的映象
docker run -p 8501:8501 -t tfserving_new:v1 --model_config_file=/models/my_model/models.config
這裡有如下幾點需要注意:
- 模型檔案的目錄結構如下
---my_model
---my_saved_model
---1
---assets
variables
saved_model.pb
---models.config
其中models.config為模型的配置檔案,需要正確配置
model_config_list: {
config:{
name:"my_saved_model",
base_path:"/models/my_model/my_saved_model",
model_platform:"tensorflow"
},
}
暴露的8501埠表示可以通過gRPC的方式去訪問模型服務,除此之外TFServing也提供了其他的訪問方式,Restful方式,埠為8500,這個其實在yaml檔案裡面可以隨意改的,只要對映關係對了就行。
4.gRPC方式遠端訪問服務
需要安裝tensorflow-serving-api
pip install tensorflow-serving-api
import tensorflow as tf
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
import grpc
import numpy as np
class PredictModelGrpc(object):
def __init__(self, socket):
self.socket = socket
self.request, self.stub = self.__get_request()
def __get_request(self):
channel = grpc.insecure_channel(self.socket, options=[('grpc.max_send_message_length', 1024 * 1024 * 1024),
('grpc.max_receive_message_length',
1024 * 1024 * 1024)]) # 可設定大小
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = "my_saved_model"
request.model_spec.signature_name = "serving_default"
return request, stub
def judge_frames(self, frames):
self.request.inputs['input_1'].CopyFrom(tf.make_tensor_proto(frames, dtype=tf.float32)) # images is input of model
result = self.stub.Predict.future(self.request, 10.0)
res = tf.make_ndarray(result.result().outputs['output_1'])[0]
return np.argmax(res), np.max(res)
if __name__ == '__main__':
model = PredictModelGrpc('202.**.**.252:8500')
import time
s = time.time()
result = model.judge_frames(np.zeros(dtype=float, shape=(1, 224, 224, 15, 3)))
e = time.time()
print (e-s)
print(result)