点击上方“AI搞事情”关注我们


内容转载自知乎:https://zhuanlan.zhihu.com/p/96917543

Justin ho


Tensorflow 2.0.0出来后,1.x版本的API有些已经改变,19年年初写的这一篇《TensorFlow Serving + Docker + Tornado机器学习模型生产级快速部署》 文章,在tf 2.0.0版本里面有较大的变动,另外Tensorflow官方也推荐大家使用tf.keras,因此本文将会教大家如何使用tensorflow serving部署keras模型,适用tensorflow 2.0.0以后的版本。注:下面“tensorflow serving”将会简写为“tfs”。

一、导出Keras模型

keras模型训练完毕后,一般我们都会使用model.save(filepath)储存为h5文件,包含模型的结构和参数,而我们需要把这个h5文件导出为tensorflow serving所需要的模型格式:

from keras import backend as K
from keras.models import load_model
import tensorflow as tf# 首先使用tf.keras的load_model来导入模型h5文件
model_path = 'v7_resnet50_19-0.9068-0.8000.h5'
model = tf.keras.models.load_model(model_path, custom_objects=dependencies)
model.save('models/resnet/', save_format='tf')  # 导出tf格式的模型文件

注意,这里要使用tf.keras.models.load_model来导入模型,不能使用keras.models.load_model,只有tf.keras.models.load_model能导出成tfs所需的模型文件。导出的文件路径结构如下:

.
└── 0├── assets├── saved_model.pb└── variables├── variables.data-00000-of-00002├── variables.data-00001-of-00002└── variables.index

最大的改变是,以往导出keras模型需要写一大段定义builder的代码,如这篇文章《keras、tensorflow serving踩坑记》 的那样,现在只需使用简单的model.save就可以导出了。当然以前这种写法应该还能继续使用,能自定义signature、input、output的名称,但为了简单起见(用keras不就是为了简单嘛),直接一键导出更舒服。

导出以后,我们在终端执行以下命令,查看模型的signature、input、output的名称,后面要用到:

saved_model_cli show --dir 0/ --all# 将会输出:
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:signature_def['__saved_model_init_op']:The given SavedModel SignatureDef contains the following input(s):The given SavedModel SignatureDef contains the following output(s):outputs['__saved_model_init_op'] tensor_info:dtype: DT_INVALIDshape: unknown_rankname: NoOpMethod name is:signature_def['serving_default']:The given SavedModel SignatureDef contains the following input(s):inputs['input_1'] tensor_info:dtype: DT_FLOATshape: (-1, 224, 224, 3)name: serving_default_input_1:0The given SavedModel SignatureDef contains the following output(s):outputs['fc2'] tensor_info:dtype: DT_FLOATshape: (-1, 4)name: StatefulPartitionedCall:0Method name is: tensorflow/serving/predict

可以看到,signature name为“serving_default”,input name为“input_1”,output name为“fc2”。记下来,一会用到。

二、Docker部署模型

一律使用docker来部署你的模型,如果还不知道docker是什么,不知道怎么用docker来拉取tfs的镜像,请查阅我之前的文章:

Justin ho:TensorFlow Serving + Docker + Tornado机器学习模型生产级快速部署zhuanlan.zhihu.com

这里默认你已经会拉取tfs模型到本地,现在执行以下容器启动命令:

sudo nvidia-docker run -p 8500:8500 \-v /home/projects/resnet/weights/:/models \--name resnet50 \-itd --entrypoint=tensorflow_model_server tensorflow/serving:2.0.0-gpu \--port=8500 --per_process_gpu_memory_fraction=0.5 \--enable_batching=true --model_name=resnet --model_base_path=/models/season &

这里涉及的参数意义一律看上面那篇文章,这里不解释了。

三、请求客户端

模型部署起来后,我们要写一个grpc客户端来请求模型,代码参考:

from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
import grpcdef request_server(img_resized, server_url):'''用于向TensorFlow Serving服务请求推理结果的函数。:param img_resized: 经过预处理的待推理图片数组,numpy array,shape:(h, w, 3):param server_url: TensorFlow Serving的地址加端口,str,如:'0.0.0.0:8500' :return: 模型返回的结果数组,numpy array'''# Request.channel = grpc.insecure_channel(server_url)stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)request = predict_pb2.PredictRequest()request.model_spec.name = "resnet"  # 模型名称,启动容器命令的model_name参数request.model_spec.signature_name = "serving_default"  # 签名名称,刚才叫你记下来的# "input_1"是你导出模型时设置的输入名称,刚才叫你记下来的request.inputs["input_1"].CopyFrom(tf.make_tensor_proto(img_resized, shape=[1, ] + list(img_resized.shape)))response = stub.Predict(request, 5.0)  # 5 secs timeoutreturn np.asarray(response.outputs["fc2"].float_val) # fc2为输出名称,刚才叫你记下来的

tensorflow 2.0.0请使用以上这段代码,之前那篇tfs的部署文章里面的api已经变了。

我们测试一下,读取一张图片,发送请求到tfs:

from PIL import Image
import numpy as npimgpath = '20171101110450_48901.jpg'
x = Image.open(imgpath)
x = np.array(x).astype('float32')
x = (x - 128.) / 128.# grpc地址及端口,为你容器所在机器的ip + 容器启动命令里面设置的port
server_url = '0.0.0.0:8500'
request_server(x, server_url)

我们将会得到(我这里的resnet只输出4类多标签结果):

array([0.58116215, 0.04240507, 0.74790353, 0.1388033 ])

使用tensorflow serving部署keras模型(tensorflow 2.0.0)相关推荐

  1. tensorflow/serving部署keras的h5模型服务

    当我们使用keras训练好模型之后,下一步就是部署服务了,采用flask直接加载keras的h5模型,服务的并发性能会很低.如果为了追求高并发性能,就可以采用Nginx+gunicorn+gevent ...

  2. tensorflow serving部署keras或tf2.0模型

    一.安装docker 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本: $ sudo apt-get remove docker docker-engine docker- ...

  3. nvidia-docker2完成tensorflow/serving深度学习模型在线部署

    深度学习技术已经广泛应用在各个行业领域.实际应用,通过大量数据往往可以训练一个泛化能力好的模型,但如何将模型进行快捷.方便的远程部署,已成为好多企业考虑的问题.现阶段,常用的深度学习模型远程部署工具有 ...

  4. TensorFlow Serving部署文本分类模型(LSTM+CNN)

    项目来源于:https://github.com/NLPxiaoxu/Easy_Lstm_Cnn 使用LSTM的文本分类项目,非常感谢项目贡献者 一.模型序列化 由于有之前项目的经验,这里模型序列化就 ...

  5. keras保存模型_onnx+tensorrt部署keras模型

    由于项目需要,最近捣鼓了一波如何让用tensorrt部署训练好的模型来达到更快的推理速度,期间花费了大量的时间在知乎和各种网页上去搜索别人的方案,但始终没有找到我想要的条理相对清晰的记录贴(也许只是我 ...

  6. Tensorflow Serving部署tensorflow、keras模型详解

    写在篇前   本篇介绍如何使用Tensorflow Serving组件导出训练好的Tensorflow模型,并使用标准tensorflow model server来部署深度学习模型预测服务.tens ...

  7. 用Docker容器自带的tensorflow serving部署模型对外服务

    相信很多人和我一样,在试图安装tensorflow serving的时候,翻遍了网上的博客和官网文档,安装都是以失败而告终,我也是一样,这个问题折磨了我两个星期之久,都快放弃了.幸运的是在同事的建议下 ...

  8. 用Docker容器自带的tensorflow serving部署模型对外服务(成功率100%)

    前传: 相信很多人和我一样,在试图安装tensorflow serving的时候,翻遍了网上的博客和官网文档,安装都是以失败而告终,我也是一样,这个问题折磨了我两个星期之久,都快放弃了.幸运的是在同事 ...

  9. Win10 基于Docker使用tensorflow serving部署模型

    目录 安装Docker for Windows 安装 tensorflow-serving-api tensorflow serving on docker 测试tf server 方法3:grpc ...

最新文章

  1. 使用Pocsuite3
  2. mysql开启慢查询方法(转)
  3. windows安装pygame(python3.6)_当我试图安装PyGameforPython3.6时,Pip不起作用[过时]
  4. 拓展卡尔曼滤波器(EKF)的数学推导
  5. TransE算法的整理
  6. 计算机安装的网络协议怎么看,怎么检查电脑是否安装tcp ip和netbeui协议
  7. 解决phpmyadmin加载慢问题
  8. 质数合数相关操作python代码合集(比较全面,欢迎补充)
  9. android inflate 方法,Android LayoutInflater中 Inflate()方法应用
  10. 数字图像处理:图像几何变换(Matlab实现几何变换+原理解析
  11. 【Python鸡兔同笼】
  12. 保存富文本编辑器内容
  13. 发现一个推特前端替代网站,可以直接浏览推特用户发布的内容。
  14. Delphi 中资源文件使用详解
  15. 幼儿园买玩具_二进制枚举
  16. 安装Android x86
  17. 【NCL】shea_util.ncl只能load一次
  18. PL / SQL在线编译器–在线运行Oracle PL / SQL程序
  19. [转载] Python 机器学习经典实例
  20. Altium Designer.v17.0.6 Build 354

热门文章

  1. dueros模拟测试没有请求后台_实战 | 用手写一个骚气的请求合并,演绎底层的真实...
  2. socket()函数用法详解:创建套接字
  3. 简述微型计算机的工作原理,高教自学考试微机原理及应用模拟试题
  4. firefox 39 linux,Mozilla Firefox 39.0 Beta 4 发布下载
  5. erlang精要(9)-erl(1)
  6. .net随笔-vb.net Accord.Net机器学习之贝叶斯分类
  7. 【NLP】文本分类还停留在BERT?对偶对比学习框架也太强了
  8. 最新!第二轮“双一流”名单即将公布?8所高校官宣新增学科!
  9. 【Python基础】超级详解系列-Python列表全面解析
  10. 【机器学习】GBDT 与 LR 的区别总结