概述
tensorflow-serving支持rpc和rest,本文基于rest编写。构建k8s的pod
部署
单模型部署,dockerfile如下:
FROM tensorflow/serving
MAINTAINER zhouwenyang
ADD model /models/${model_name}/${version}
ENV MODEL_NAME=${model_name}
${model_name}和${version}根据自己需要更改。可以使用挂载文件的方式,但是如果部署k8s则需要打进容器,或者使用共享的volumes的方式
多模型部署参考:https://www.jianshu.com/p/d11a5c3dc757
查看模型输入输出情况: http://${host}:${port}/v1/models/${model_name}/metadata
自定义op
预测
根据查看模型的metadata,搞起一个http post接口
接口地址为: http://${host}:${port}/v1/models/${model_name}:predict
post参数为:
{ "inputs":{ "${param1}":${value1}, "${param2}":${value2}, "${param3}":${value3}, "${param4}":${value4} } }
问题
- tag只支持serve
tf-serving模型目前支持模型tag为serve。这个是因为tf-serving官方支持的比较烂
排查: 查看源码 https://github.com/tensorflow/serving/blob/ceba636bb7c5c98bde35d1818fd033b36300fffe/tensorflow_serving/model_servers/main.cc#L189
查看tensorflow-serving这个镜像的Dockerfile如下: https://hub.docker.com/layers/tensorflow/serving/latest/images/sha256-6651f4839e1124dbde75ee531825112af0a6b8ef082c88ab14ca53eb69a2e4bb?context=explore 可知,其实tf-serving的docker镜像内部就是运行的/usr/bin/tf_serving_entrypoint.sh 脚本,
脚本内容:
#!/bin/bash
tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} "$@"
解决:
编写tf-serving-entrypoint.sh
#!/bin/bash
tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} --saved_model_tags=${MODEL_TAGS} "$@"
编写Dockerfile
FROM tensorflow/serving:latest MAINTAINER zhouwenyang ENV MODEL_TAGS=serve ADD tf_serving_entrypoint.sh /usr/bin RUN chmod u+x /usr/bin/tf_serving_entrypoint.sh ENTRYPOINT ["/usr/bin/tf_serving_entrypoint.sh"]
然后docker build。使用这个生成的镜像代替tensorflow-serving官方镜像即可
具体使用:
docker run -itd --name my-tf -v /model:/models/1/modelname -e MODEL_NAME=modelname -e MODEL_TAGS=my-tag wenyangchou/tf-serving:latest
镜像已上传:wenyangchou/tf-serving:latest