欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 编程资源 > 编程问答 >内容正文

编程问答

使用tensorflow serving部署keras模型(tensorflow 2.0.0) -尊龙游戏旗舰厅官网

发布时间:2025/1/21 编程问答 16 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 使用tensorflow serving部署keras模型(tensorflow 2.0.0) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

点击上方“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)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。

网站地图