手把手教你使用tfserving进行模型部署

目录

    • 导读
    • tfserving镜像下载
    • 模型准备
    • 部署模型
    • http接口请求
        • 原数据请求
        • http inference
    • grpc请求
    • 参考文献

导读

在工业界,模型的部署绝大部分的企业都会选择tfserving工具。本篇文章分享一下如何使用容器进行模型部署并使用部署好的模型。

tfserving镜像下载

使用docker下载tfserving镜像,关于docker的使用可参考,tfserving包含的版本可在此查看。

docker pull tensorflow/serving:2.1.0  # 这里下载的是tf2.1.0的版本,支持tensorflow1.15以上训练出来的模型。

模型准备

使用tensorflow训练好一个模型,使用keras其他框架也可以,只需要将模型转换为pb文件即可,根据不同的转换方式,有的接口转换之后只有一个saved_model.pb文件,有的有三个:saved_model.pb,variables.data-00000-of-00001,variables.index,其中后两个文件在variables文件夹,文件格式如下:
在这里插入图片描述
生成的这两种格式,tfserving均支持。

部署模型

假设模型的存储路径为:/my/model/path/m/1/saved_model.pb, 只生成pb文件。其中m表示模型名,1表示模型版本。在母机上启动tfserving

docker run -p 8501:8501 -p 8500:8500 --mount type=bind,source=/my/model/path/m,target=/models/m -e MODEL_NAME=m -t tensorflow/serving:2.1.0

grpc的服务端口默认为8500,http的服务端口默认为8501,所以这里将两个端口映射出来,便于访问。source为模型路径(到模型名为止),target为映射到容器的目录。启动成功后,可以看到如下信息:

因为这里使用只有pb文件部署的方式,所以打印的日志中提示“File does not exist”这并不影响模型inference功能。

http接口请求

原数据请求

    root_url = "http://127.0.0.1:8501"
    url = "%s/v1/models/m/metadata" % root_url
    resp = requests.get(url)

请求的结果:

{
"model_spec":{
 "name": "m",
 "signature_name": "",
 "version": "1"
}
,
"metadata": {"signature_def": {
 "signature_def": {
  "serving_default": {
   "inputs": {
    "inputs": {
     "dtype": "DT_UINT8",
     "tensor_shape": {
      "dim": [
       {
        "size": "-1",
        "name": ""
       },
       {
        "size": "-1",
        "name": ""
       }
      ],
      "unknown_rank": false
     },
     "name": "image_tensor:0"
    }
   },
   "outputs": {
    "self_define_key": {
     "dtype": "DT_FLOAT",
     "tensor_shape": {
      "dim": [
       {
        "size": "-1",
        "name": ""
       },
       {
        "size": "-1",
        "name": ""
       },
      ],
      "unknown_rank": false
     },
     "name": "self_define_key:0"
    }
 }
}
}
}

通过获取元数据,可以知道模型的输入和输出格式。其中上述返回结果中的“self_define_key”为模型输出的名称,在生成pb时指定。

http inference

data = {
   "instances": [np.array(img).tolist()]
}
ret = requests.post(url, json=data)
if ret.status_code == 200:
     result = json.loads(ret.text)   // result  中包含“self_define_key”字段,该值就是预测的结果
else:
	print("error")

grpc请求

from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
import grpc

server_url = "127.0.0.1:8500"
data = np.asarray([1, 2, 3, 4, 5])
channel = grpc.insecure_channel(server_url)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
# request.model_spec.name = "test-model"  # 模型名称,启动容器命令的model_name参数
# request.model_spec.signature_name = "serving_default"  # 签名名称
request.model_spec.name = "m"  # 模型名称,启动容器命令的model_name参数
request.model_spec.signature_name = ""  # 签名名称

request.inputs["inputs"].CopyFrom(
    tf.make_tensor_proto(img_resized, shape=[1] + list(img_resized.size) + [3]))
    
result_future = stub.Predict.future(request, 10.0)  # 10 secs timeout
response = result_future.result()

predict_result = np.asarray(response.outputs["self_define_key"].float_val)
# predict_result为一维的向量,需要根据实际返回结果的格式进行reshape.

参考文献

http://fancyerii.github.io/books/tfserving-docker/
https://blog.csdn.net/qq_42693848/article/details/105395466
https://hub.docker.com/
https://blog.csdn.net/u012856866/article/details/109353730

你可能感兴趣的:(模型训练,机器学习,docker,tensorflow,docker,人工智能)