本篇主要介绍使用tfserving和docker同时部署多个模型,使用不同版本的模型,基本的流程与部署单个模型的过程类似,(关于运行tfserving容器使用单个模型进行预测的相关步骤可以参见 使用docker和tf serving搭建模型预测服务。)不同之处在于需要用到一个多模型的配置文件。首先得到多个可以用于tfserving预测的模型文件,相关步骤可以参考使用savedModel保存模型。本例中用使用savedModel保存模型中的相关代码生成三个模型,分别建立三个文件夹,将得到的模型分别放入,最后的文件结构如下图。其中100001文件夹表示模型的版本,可以在model1下放置不同版本的模型,默认情况下会加载具有较大版本号数字的模型。
在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"
}
}
配置文件定义了模型的名称和模型在容器内的路径,现在运行tfserving容器 :
docker run -p 8501:8501 --mount type=bind,source=/home/jerry/tmp/multiModel/,target=/models/multiModel \
-t tensorflow/serving --model_config_file=/models/multiModel/models.config
请求预测:
import requests
import numpy as np
SERVER_URL = 'http://localhost:8501/v1/models/model3:predict'
#注意SERVER_URL中的‘model3’是config文件中定义的模型name,不是文件夹名称
def prediction():
predict_request='{"instances":%s}' % str([[[10]*7]*7])
print(predict_request)
response = requests.post(SERVER_URL, data=predict_request)
print(response)
prediction = response.json()['predictions'][0]
print(prediction)
if __name__ == "__main__":
prediction()
如果一个模型有多个版本,并在预测的时候希望指定模型的版本,可以通过以下方式实现。
修改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"
}
}
请求预测的时候,如果要使用版本为100001的模型,只要修改SERVER_URL为:
SERVER_URL = 'http://localhost:8501/v1/models/model1/versions/100001:predict'
tfserving支持模型的Hot Plug,上述容器运行起来之后,如果在宿主机的 /home/jerry/tmp/multiModel/model1/ 文件夹下新增模型文件如100003/,tfserving会自动加载新模型;同样如果移除现有模型,tfserving也会自动卸载模型。