TensorFlow2.0 模型部署

一、拉取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" [container_name] tfserving_new:v1
    其中需要将镜像中的环境变量“模型名称”改为我们导入模型名称,因为默认名称是model,如果不修改,模型是不能serverable的。
  • 删掉已经没用的tfserving容器,起我们的新镜像tfserving_new:v1
    docker kill tfserving
    docker rm tfserving

3.启动新的带有模型文件的镜像

docker run -p 8500:8500 -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"
    },
}

暴露的8500端口表示可以通过gRPC的方式去访问模型服务,除此之外TFServing也提供了其他的访问方式,Restful方式,端口为8501,这个其实在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)
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页