tensorflow-server|tensorflow-server +keras + docker模型导出和部署方法
部署过程主要遇到的坑是签名的问题这里做下记录参考文档地址拉取镜像 安装完docker后,可以用一下命令直接拉取最新的tensorflow server镜像
https://www.tensorflow.org/tfx/serving/serving_basic
https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_constants
这里的部署方式以windows docker为例子,linux系统也是一样的操作,路径相应改变下就行
github demo地址https://github.com/Caigengliang/exportKerasForTensorflowServer
docker pull tensorflow/serving
导出keras模型保存为tensorflow-server指定格式 先创建一个方法,改方法用于创建指定目录的文件夹,存在则不动作,不存在则创建。如果改目录下存在文件应该删除它,以方便模型更新。
def mkdir(path):
import os
import shutil
path=path.strip()
path=path.rstrip("\\")
isExists=os.path.exists(path)
if not isExists:
os.makedirs(path)
return True
else:
filelist=os.listdir(path)
for f in filelist:
filepath = os.path.join( path, f )#将文件名映射成绝对路劲
if os.path.isfile(filepath):#判断该文件是否为文件或者文件夹
os.remove(filepath)#若为文件,则直接删除
print(str(filepath)+" removed!")
elif os.path.isdir(filepath):
shutil.rmtree(filepath,True)#若为文件夹,则删除该文件夹及文件夹内所有文件
print("dir "+str(filepath)+" removed!")
模型导出
在prediction_signature定义了一下参数
- 【tensorflow-server|tensorflow-server +keras + docker模型导出和部署方法】
inputs={'images': tensor_info_x}
指定输入张量信息。
outputs={'scores': tensor_info_y}
指定分数张量信息。
method_name
是用于推理的方法。对于预测请求,应将其设置为tensorflow/serving/predict
。有关其他方法名称,请参阅signature_constants.py 和相关的 TensorFlow 1.0 API文档。
import tensorflow as tf
import os
import tensorflow.keras.backend as K
from tensorflow.keras.losses import categorical_crossentropy
from tensorflow.keras.optimizers import Adadeltadef export_model(model,
export_model_dir,
model_version
):
"""
:param export_model_dir: type string, save dir for exported modelurl
:param model_version: type int best
:return:no return
"""
with tf.get_default_graph().as_default():
# prediction_signature
tensor_info_input = tf.saved_model.utils.build_tensor_info(model.input)
tensor_info_output = tf.saved_model.utils.build_tensor_info(model.output)
print(model.output.shape, '**', tensor_info_output)
prediction_signature = (
tf.saved_model.signature_def_utils.build_signature_def(
inputs={'images': tensor_info_input}, # Tensorflow.TensorInfo
outputs={'result': tensor_info_output},
#method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
method_name= "tensorflow/serving/predict"))
print('step1 => prediction_signature created successfully')
# set-up a builder
mkdir(export_model_dir)
export_path_base = export_model_dir
export_path = os.path.join(
tf.compat.as_bytes(export_path_base),
tf.compat.as_bytes(str(model_version)))
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
# tags:SERVING,TRAINING,EVAL,GPU,TPU
sess=K.get_session(),
tags=[tf.saved_model.tag_constants.SERVING],
signature_def_map={
'predict':
prediction_signature,
tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
prediction_signature,},
)
print('step2 => Export path(%s) ready to export trained model' % export_path, '\n starting to export model...')
#builder.save(as_text=True)
builder.save()
print('Done exporting!')
调用导出方法导出,这里假设已经把模型保存为.h5文件了
model = tf.keras.models.load_model('./12308nenghao.h5')
export_model(
model,
'C:/tmp/tfserving/pow',
1
)
文章图片
image.png
可以看到对应目录下生成了如下文件:
其中1这个父目录是版本好,tensorflow-server会识别这个版本号
文章图片
image.png 在docker中运行 指定好路径
docker run -p 8501:8501 --mount type=bind,source=C:/tmp/tfserving/pow,target=/models/pow -e MODEL_NAME=pow -t tensorflow/serving '&'
server生成两个接口一个restful一个gprc接口
文章图片
运行结果 验证
直接用postman测试restful
文章图片
image.png 遇到问题
在测试的时候要特别注意输入的张量的形状,在导出模型的时候查看下。
{ "error": "Serving signature name: "serving_default" not found in signature def" }
该问题是由签名没有设置默认serving_default
检查下signature_def_map是否缺少设置,在里面添加 tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
prediction_signature,
其中prediction_signature是tf.saved_model.signature_def_utils.build_signature_def的定义。
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- docker镜像探索----dive工具
- 02|02|简单使用Docker命令
- Docker-Dockerfile
- Docker|Docker exec 出现 "fork/exec /proc/self/exe: no such file or directory" 问题
- 菜鸟的docker技术入门之路
- Scrapy定时爬虫总结&Docker/K8s部署
- 制作jdk8|制作jdk8 Dockerfile
- Go|Docker后端部署详解(Go+Nginx)
- docker|Docker