1. 程式人生 > 其它 >TensorFlow2.0 模型部署

TensorFlow2.0 模型部署

技術標籤: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)