关于TensorFlow Serving的简单介绍

一、简介

官方地址
模型部署教程
模型部署代码
TensorFlow Serving专为生产环境而设计,是一个适用于机器学习模型的灵活、高性能应用系统。TensorFlow Serving提供与 TensorFlow模型的开箱即用型集成,但也可以轻松扩展以应用其他类型的模型和数据,同时保留相同的服务器架构和API。

TensorFlow Serving

二、RESTful API

请求和响应是一个JSON对象。此对象的组成取决于请求类型或者动作。
// 若发生错误,所有API将在响应正文中返回一个JSON对象,error作为键,错误消息作为值
{
    "error": <error message string>
}
1、Model status API
# 类似ModelService.GetModelStatus gPRPC API,返回ModelServer中模型的状态
# URL
GET http://host:port/v1/models/{MODEL_NAME}[/versions/${VERSION}|/labels/${LABEL}]
# 其中,/versions/${VERSION}或/labels/${LABEL}可选
// 响应格式
// 若成功,则返回GetModelStatusResponse protobuf的JSON表示
message GetModelStatusResponse {
  // Version number and status information for applicable model version(s).
  repeated ModelVersionStatus model_version_status = 1;
}
2、Model Metadata API
# 类似PredictionService.GetModelMetadata GRPC API,返回ModelServer中模型的元数据
# URL
GET http://host:port/v1/models/${MODEL_NAME}[/versions/${VERSION}|/labels/${LABEL}]/metadata
# 其中,/versions/${VERSION}或/labels/${LABEL}可选,若省略则在响应中返回最新版本的模型元数据
// 响应格式
// 若成功,则返回GetModelMetadataResponse protobuf的JSON表示
message GetModelMetadataResponse {
  // Model Specification indicating which model this metadata belongs to.
  ModelSpec model_spec = 1;
  // Map of metadata field name to metadata field. The options for metadata
  // field name are listed in GetModelMetadataRequest. Currently supported:
  // "signature_def".
  map<string, google.protobuf.Any> metadata = 2;
}
3、Classify and Regress API
# 类似gRPC API的Classify和Regress中的PredictionService
# URL
POST http://host:port/v1/models/${MODEL_NAME}[/versions/${VERSION}|/labels/${LABEL}]:(classify|regress)
# 其中,/versions/${VERSION}或/labels/${LABEL}可选,若省略则使用最新版本
// 请求格式
{
  // Optional: serving signature to use.可选:要使用的服务签名
  // If unspecifed default serving signature is used.如果未指定,则使用默认服务签名
  "signature_name": <string>,

  // Optional: Common context shared by all examples.可选:所有示例共享的公共上下文
  // Features that appear here MUST NOT appear in examples (below).此处出现的功能不得出现在下面examples中
  "context": {
    "<feature_name3>": <value>|<list>
    "<feature_name4>": <value>|<list>
  },

  // List of Example objects
  "examples": [
    {
      // Example 1
      "<feature_name1>": <value>|<list>,
      "<feature_name2>": <value>|<list>,
      ...
    },
    {
      // Example 2
      "<feature_name1>": <value>|<list>,
      "<feature_name2>": <value>|<list>,
      ...
    }
    ...
  ]
}

// <value>是表示二进制数据的JSON数字(整数或十进制)、JSON字符串或JSON对象;<list>是这些值的列表。
// 请求格式类似gRPC ClassificationRequest和RegressionRequest protos
// 响应格式

// 1、Classify请求返回响应主体JSON对象
{
  "result": [
    // List of class label/score pairs for first Example (in request)
    [ [<label1>, <score1>], [<label2>, <score2>], ... ],

    // List of class label/score pairs for next Example (in request)
    [ [<label1>, <score1>], [<label2>, <score2>], ... ],
    ...
  ]
}
// <label>是一个字符串,若模型没有与score关联的标签,它可以是一个空字符串;<score>是一个十进制(浮点)数
// 该格式类似于gRPC API中的ClassificationResponse PROTOS
   
     
// 2、Regress请求返回响应主体JSON对象
{
  // One regression value for each example in the request in the same order.
  "result": [ <value1>, <value2>, <value3>, ...]
}
// <value>是十进制数
// 该格式类似gRPC API中的RegressionResponse PROTOS
4、Predict API
# 类似gRPC API中的PredictionService.Predict方法
# URL
POST http://host:port/v1/models/${MODEL_NAME}[/versions/${VERSION}|/labels/${LABEL}]:predict
# 其中,/versions/${VERSION}或/labels/${LABEL}可选,若省略则使用最新版本
// 请求格式(行格式)
{
  // (Optional) Serving signature to use.(可选)要使用的服务签名
  // If unspecifed default serving signature is used.如果未指定,则使用默认服务签名
  "signature_name": <string>,

  // Input Tensors in row ("instances") or columnar ("inputs") format.
  // 以行(“instances”)或列(“inputs”)格式输入张量
  // A request can have either of them but NOT both.一个请求可以拥有其中一个,但不能同时拥有
  "instances": <value>|<(nested)list>|<list-of-objects>
  "inputs": <value>|<(nested)list>|<object>
}

// 以行格式指定输入张量,输入键控到JSON请求中的实例键
// 该请求格式类似于PredictRequest gRPC API和CMLE预测API原型。


// 1、当只有一个命名输入时,将instance的key值指定为输入值
{
  // List of 3 scalar tensors.3 个标量张量的列表
  "instances": [ "foo", "bar", "baz" ]
}

{
  // List of 2 tensors each of [1, 2] shape.每个 [1, 2] 形状的 2 张量列表
  "instances": [ [[1, 2]], [[3, 4]] ]
}

// 2、对于多个命名输入,每个项目都应该是一个包含输入名称/张量值对的对象,每个命名输入一个
// 例如。以下是具有两个实例的请求,每个实例都有一组三个命名的输入张量
{
 "instances": [
   {
     "tag": "foo",
     "signal": [1, 2, 3, 4, 5],
     "sensor": [[1, 2], [3, 4]]
   },
   {
     "tag": "bar",
     "signal": [3, 4, 1, 2, 5]],
     "sensor": [[4, 5], [6, 8]]
   }
 ]
}
// 注意:每个命名输入("tag","signal","sensor")都被隐式假设为具有相同的第0维
// 若所有命名输入张量都具有相同的第0维,则使用以上格式;若没有,则使用下面的列格式
// 响应格式(行格式)
// 将返回JSON对象
{
  "predictions": <value>|<(nested)list>|<list-of-objects>
}
// 如果模型的输出只包含一个命名张量,将省略名称和 predictions键映射到标量或列表值列表。如果模型输出多个命名张量,我们会输出一个对象列表,类似于上面提到的行格式的请求
// 请求格式(列格式)
// 以列格式指定输入张量,该格式类似于gRPC Predict 的inputs请求字段
// 在列格式中,输入被键入到JSON请求中的输入键
// 输入键的值可以是单个输入张量或输入名称到张量的映射,每个输入可以具有任意形状,并且不需要共享行格式所需相同的第0维(批量大小)
{
 "inputs": {
   "tag": ["foo", "bar"],
   "signal": [[1, 2, 3, 4, 5], [3, 4, 1, 2, 5]],
   "sensor": [[[1, 2], [3, 4]], [[4, 5], [6, 8]]]
 }
}
// 输入是JSON对象,而不是像行格式那样的实例列表 
// 此外,所有命名的输入都被一起指定,而不是将它们展开到像行格式完成的各个行中
// 响应格式(列格式)
// 将返回JSON对象
{
  "outputs": <value>|<(nested)list>|<object>
}
// 如果模型的输出只包含一个命名张量,将省略名称和outputs键映射到标量或列表值列表。如果模型输出多个命名张量,我们会输出一个对象。这个对象的每个键对应一个命名的输出张量。格式类似于上面提到的列格式的请求

版权声明:本文为weixin_44324036原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。