kubeflow 中采用了 tensorflow serving 作为官方的tensorflow模型接口, TensorFlow Serving是GOOGLE开源的一个服务系统,适用于部署机器学习模型,灵活、性能高、可用于生产环境。 TensorFlow Serving可以轻松部署新算法和实验,同时保持相同的服务器架构和API。
Tensorflow Serving 直接加载模型即可生成接口,不过 serving 支持的模型只有 SaveModel,因此这里主要介绍 SaveModel。
SaveModel
SaveModel
是一种专门用于tf模型 拓扑结构(topology) 和 权重(weights) ,基于 SaveModel
不需要运行原始的模型构建代码,这样非常利于共享或部署模型,因此一般模型部署都用 SaveModel
。
- 拓扑结构(Topology): 这是一个描述模型结构的文件(例如它使用的了哪些操作)。它包含对存储在外部的模型权重的引用。
- 权重(Weights): 这些是以有效格式存储给定模型权重的二进制文件。它们通常存储在与拓扑结构相同的文件夹中。
SaveModel
文件目录:assets saved_model.pb variables
查看MetaGraphDefs
和SignatureDefs
:saved_model_cli show --dir <SaveModel路径> --all
生成模型需要模型的MetaGraphDefs
和SignatureDefs
,MetaGraphDefs
就是我们常见的meta graph,其中包含了四种主要的信息:
- MetaInfoDef: 存放了一些元信息,例如版本和其他用户信息;
- GraphDef: 描述的Graph中序列化得到的图,由Protocol Buffer组成;
- SaverDef: 图的Saver信息,例如最多同时保存的checkpoint数量,需要保存的Tensor名字等,不保存Tensor中的实际内容;
- CollectionDef: 任何需要特殊注意的python对象,需要特殊的标注以方便import_meta_graph后取回,如”prediction”。
SignatureDefs
则是模型的签名定义,定义了 输入 和 输出函数`。
SignatureDefs
SignatureDef 定义了 TensorFlow graph 计算的签名,定义了 输入 和 输出函数,SignatureDef 结构 :
inputs
as a map of string to TensorInfo.
outputs
as a map of string to TensorInfo.
method_name
(which corresponds to a supported method name in the loading tool/system).
Classification SignatureDef例子
必须要一个输入 Tensors inputs
和两个输出Tensors: classes
和 scores
signature_def: {
key : "my_classification_signature"
value: {
inputs: {
key : "inputs"
value: {
name: "tf_example:0"
dtype: DT_STRING
tensor_shape: ...
}
}
outputs: {
key : "classes"
value: {
name: "index_to_string:0"
dtype: DT_STRING
tensor_shape: ...
}
}
outputs: {
key : "scores"
value: {
name: "TopKV2:0"
dtype: DT_FLOAT
tensor_shape: ...
}
}
method_name: "tensorflow/serving/classify"
}
}
Predict SignatureDef例子
signature_def: { |
Regression SignatureDef例子
signature_def: { |
生成 SaveModel 文件
生成 SaveModel文件的方式:
- (1)tf.saved_model # 最直接简单
(2)Estimator的export_savedmodel # 高级API Estimator模型导出
classifier = classifier = tf.estimator.Estimator(
model_fn=conv_model, model_dir=args.tf_model_dir,
config=training_config, params=model_params)
classifier.export_savedmodel(args.tf_export_dir, serving_input_receiver_fn=serving_fn)(3)keras.Model.save(output_path)
将 checkpoint 模型文件 改为 SaveModel 文件
import sys, os, io |
Run server
生成好 SaveModel
模型文件,就可以直接运行 serving 来实现模型服务:
(1)用DOCKER运行:
docker run --rm -it -p 8500:8500 \ |
挂载的默认目录为两级目录:./<模型名称>/<版本号>/save_model.pb
, 版本号必须为数字。
(2)或者可以用k8s运行deployment(kubeflow):
apiVersion: extensions/v1beta1 |
构建请求测试
测试模型接口
import requests |
参考文献
https://www.tensorflow.org/tfx/tutorials/serving/rest_simple