TensorFlow Serving是google开源的一个适用于部署机器学习模型,具有灵活、高性能、可用于生产环境的模型框架。
它支持模型版本控制和回滚、 支持并发、支持多模型部署、 支持模型热更新等,由于这些特性,使得我们不需要为部署线上服务而操心,只需要训练好线下模型即可。
同时,TensorFlow Serving还提供gRPC和REST API两种接口访问形式,其中gRPC接口对应的端口号为8500,而REST API对应的端口号为8501。
基于TensorFlow Serving的持续集成框架还是挺简明的,基本分三个步骤:
模型训练:这是大家最熟悉的部分,主要包括数据的收集和清洗、模型的训练、评测和优化;
模型上线:前一个步骤训练好的模型在TF Server中上线;
服务使用:客户端通过gRPC和RESTfull API两种方式同TF Servering端进行通信,并获取服务。
目前TensorFlow Serving提供Docker、APT(二进制安装)和源码编译三种安装方式,其中Docker方式的安装相对来说较为简单,而且对后期项目部署的环境依赖不强,项目部署与迁移较为容易,推荐使用Docker方式进行TensorFlow Serving的安装。
docker pull tensorflow/serving
docker run -p 8501:8501 --name yc_model -v /home/tensorflow/model_yc/:/models/model_yc -e MODEL_NAME=model_yc tensorflow/serving
启动成功日志:
后台启动:
docker run -d -p 8501:8501 --name yc_model -v /home/tensorflow/model_yc/:/models/model_yc -e MODEL_NAME=model_yc tensorflow/serving
浏览器访问:http://127.0.0.1:8501/v1/models/model_yc
浏览器访问:http://127.0.0.1:8501/v1/models/model_yc/metadata
{
"model_spec":{
"name": "model_yc",
"signature_name": "",
"version": "1"
}
,
"metadata": {"signature_def": {
"signature_def": {
"serving_default": {
"inputs": {
"input_data": {
"dtype": "DT_FLOAT",
"tensor_shape": {
"dim": [
{
"size": "-1",
"name": ""
},
{
"size": "4",
"name": ""
}
],
"unknown_rank": false
},
"name": "serving_default_input_data:0"
}
},
"outputs": {
"output_data": {
"dtype": "DT_FLOAT",
"tensor_shape": {
"dim": [
{
"size": "-1",
"name": ""
},
{
"size": "1",
"name": ""
}
],
"unknown_rank": false
},
"name": "StatefulPartitionedCall:0"
}
},
"method_name": "tensorflow/serving/predict"
},
"__saved_model_init_op": {
"inputs": {},
"outputs": {
"__saved_model_init_op": {
"dtype": "DT_INVALID",
"tensor_shape": {
"dim": [],
"unknown_rank": true
},
"name": "NoOp"
}
},
"method_name": ""
}
}
}
}
}
http://127.0.0.1:8501/v1/models/model_yc:predict
#model_yc:模型名
参数:
{
"signature_name":"serving_default",
"instances":[
{
"input_data":[[22],[11],[34],[27],[36],[36],[10],[8]]
}
]
}
【补充说明】:
1.signature_name(serving_default)
signature_key = 'traffic_predict'
builder.add_meta_graph_and_variables(
......,
tags=[tf.saved_model.tag_constants.SERVING], # 预定义值 SERVING
signature_def_map={signature_key: signature}, # signature_def_map={'traffic_predict':signature},
......
)
2.method_name
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME
# method_name = 'tensorflow/serving/predict'
如果是多参数呢?
{
"signature_name": "traffic_predict",
"instances":[
{
"input_1": [1],
"input_2": [2],
"input_3": [3]
}
]
}
到这里,简单的模型部署就完成了,那么一开始说的Tensorflow Serving支持模型版本控制和回滚、 支持并发、支持多模型部署、 支持模型热更新等特性是如何体现的呢?
模型结构:
1.在multiModel文件夹下新建一个配置文件model.config【相当于配置路由】
model_config_list:{
config:{
name:"model1",
base_path:"/models/multiModel/model1",
model_platform:"tensorflow"
},
config:{
name:"model2",
base_path:"/models/multiModel/model2",
model_platform:"tensorflow"
},
config:{
name:"model3",
base_path:"/models/multiModel/model3",
model_platform:"tensorflow"
}
}
2.启动TensorFlow Serving容器
docker run -p 8501:8501 \
--mount type=bind,source=/home/tensorflow/serving/tensorflow_serving/servables/tensorflow/testdata/multiModel/,target=/models/multiModel \
-t tensorflow/serving --model_config_file=/models/multiModel/models.config
3.查看模型【访问网址为 models/model1, 地址中不包含 multiModel 】
http://xx.xx.xx.xx:8501/v1/models/model1
http://xx.xx.xx.xx:8501/v1/models/model1/metadata
那么,同一个模型如何部署多版本呢?
修改model.config文件,增加model_version_policy:
model_config_list:{
config:{
name:"model1",
base_path:"/models/multiModel/model1",
model_platform:"tensorflow",
model_version_policy:{
all:{}
}
},
config:{
name:"model2",
base_path:"/models/multiModel/model2",
model_platform:"tensorflow"
},
config:{
name:"model3",
base_path:"/models/multiModel/model3",
model_platform:"tensorflow"
}
}
请求的URL为:
http://localhost:8501/v1/models/model1/versions/100001:predict