RESTful API

GRPC APIs āĻ›āĻžāĻĄāĻŧāĻžāĻ“ TensorFlow ModelServer āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ RESTful API āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇āĨ¤ āĻāχ āĻĒ⧃āĻˇā§āĻ āĻžāϟāĻŋ āĻāχ API āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻāĻ•āϟāĻŋ āĻāĻ¨ā§āĻĄ-āϟ⧁-āĻāĻ¨ā§āĻĄ āωāĻĻāĻžāĻšāϰāĻŖ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧇āĨ¤

āĻ…āύ⧁āϰ⧋āϧ āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻāĻ•āϟāĻŋ JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟāĨ¤ āĻāχ āĻŦāĻ¸ā§āϤ⧁āϰ āĻ—āĻ āύ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϧāϰāύ āĻŦāĻž āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻĒāĻĻ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇āĨ¤ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āϜāĻžāύāĻžāϰ āϜāĻ¨ā§āϝ āύ⧀āĻšā§‡āϰ API āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦāĻŋāĻ­āĻžāĻ— āĻĻ⧇āϖ⧁āύ.

āĻ¤ā§āϰ⧁āϟāĻŋāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āϏāĻŽāĻ¸ā§āϤ API āϗ⧁āϞāĻŋ āϕ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇ error āĻāĻŦāĻ‚ āĻŽāĻžāύ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ¤ā§āϰ⧁āϟāĻŋ āĻŦāĻžāĻ°ā§āϤāĻž āϏāĻš āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦāĻĄāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻŦ⧇:

{
  "error": <error message string>
}

āĻŽāĻĄā§‡āϞ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ API

āĻāχ API āϘāύāĻŋāĻˇā§āĻ āĻ­āĻžāĻŦ⧇ ModelService.GetModelStatus gRPC API āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āĻŽāĻĄā§‡āϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻāĻ•āϟāĻŋ āĻŽāĻĄā§‡āϞ⧇āϰ āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

URL

GET http://host:port/v1/models/${MODEL_NAME}[/versions/${VERSION}|/labels/${LABEL}]

/versions/${VERSION} āĻŦāĻž /labels/${LABEL} āϏāĻš āϐāĻšā§āĻ›āĻŋāĻ•āĨ¤ āϏāĻŦ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻŦāĻžāĻĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϞ⧇ āωāĻ¤ā§āϤāϰ⧇ āĻĢ⧇āϰāϤ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤

āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ

āϏāĻĢāϞ āĻšāϞ⧇, GetModelStatusResponse protobuf-āĻāϰ āĻāĻ•āϟāĻŋ JSON āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

āĻŽāĻĄā§‡āϞ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž API

āĻāχ API āύāĻŋāĻŦāĻŋāĻĄāĻŧāĻ­āĻžāĻŦ⧇ PredictionService.GetModelMetadata gRPC API āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āĻŽāĻĄā§‡āϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻāĻ•āϟāĻŋ āĻŽāĻĄā§‡āϞ⧇āϰ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

URL

GET http://host:port/v1/models/${MODEL_NAME}[/versions/${VERSION}|/labels/${LABEL}]/metadata

/versions/${VERSION} āĻŦāĻž /labels/${LABEL} āϏāĻš āϐāĻšā§āĻ›āĻŋāĻ•āĨ¤ āĻŦāĻžāĻĻ āĻĻāĻŋāϞ⧇ āϏāĻ°ā§āĻŦāĻļ⧇āώ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻŽāĻĄā§‡āϞ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϤ⧇ āĻĢ⧇āϰāϤ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤

āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ

āϏāĻĢāϞ āĻšāϞ⧇, GetModelMetadataResponse protobuf-āĻāϰ āĻāĻ•āϟāĻŋ JSON āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

āĻļā§āϰ⧇āĻŖā§€āĻŦāĻĻā§āϧ āĻāĻŦāĻ‚ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻŦāĻ°ā§āϤāύ API

āĻāχ API āϘāύāĻŋāĻˇā§āĻ āĻ­āĻžāĻŦ⧇ PredictionService gRPC API-āĻāϰ Classify āĻāĻŦāĻ‚ Regress āĻĒāĻĻā§āϧāϤāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āĨ¤

URL

POST http://host:port/v1/models/${MODEL_NAME}[/versions/${VERSION}|/labels/${LABEL}]:(classify|regress)

/versions/${VERSION} āĻŦāĻž /labels/${LABEL} āϏāĻš āϐāĻšā§āĻ›āĻŋāĻ•āĨ¤ āĻŦāĻžāĻĻ āĻĻāĻŋāϞ⧇ āϏāĻ°ā§āĻŦāĻļ⧇āώ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ āĻ…āύ⧁āϰ⧋āϧ

classify āĻāĻŦāĻ‚ regress API-āĻāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻŦāĻĄāĻŋ āĻ…āĻŦāĻļā§āϝāχ āĻāĻ•āϟāĻŋ JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻšāϤ⧇ āĻšāĻŦ⧇ āϝāĻž āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻĢāĻ°ā§āĻŽā§āϝāĻžāϟ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇:

{
  // 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).
  "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 āĻĒā§āϰ⧋āĻŸā§‹āϰ āĻ…āύ⧁āϰ⧂āĻĒāĨ¤ āωāĻ­āϝāĻŧ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ Example āĻŦāĻ¸ā§āϤ⧁āϰ āϤāĻžāϞāĻŋāĻ•āĻž āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇āĨ¤

āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ

āĻāĻ•āϟāĻŋ 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> āĻāĻ•āϟāĻŋ āĻĻāĻļāĻŽāĻŋāĻ• (āĻĢā§āϞ⧋āϟāĻŋāĻ‚ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ) āϏāĻ‚āĻ–ā§āϝāĻžāĨ¤

regress āĻ…āύ⧁āϰ⧋āϧāϟāĻŋ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦāĻĄāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇, āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇:

{
  // One regression value for each example in the request in the same order.
  "result": [ <value1>, <value2>, <value3>, ...]
}

<value> āĻāĻ•āϟāĻŋ āĻĻāĻļāĻŽāĻŋāĻ• āϏāĻ‚āĻ–ā§āϝāĻžāĨ¤

gRPC API-āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž ClassificationResponse āĻāĻŦāĻ‚ RegressionResponse āĻĒā§āϰ⧋āĻŸā§‹āϰ āϏāĻžāĻĨ⧇ āĻāχ āĻĢāĻ°ā§āĻŽā§āϝāĻžāĻŸā§‡āϰ āĻŽāĻŋāϞ āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰāĻŦ⧇āύāĨ¤

āĻ…āύ⧁āĻŽāĻžāύ API

āĻāχ API āϘāύāĻŋāĻˇā§āĻ āĻ­āĻžāĻŦ⧇ PredictionService.Predict gRPC API āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āĨ¤

URL

POST http://host:port/v1/models/${MODEL_NAME}[/versions/${VERSION}|/labels/${LABEL}]:predict

/versions/${VERSION} āĻŦāĻž /labels/${LABEL} āϏāĻš āϐāĻšā§āĻ›āĻŋāĻ•āĨ¤ āĻŦāĻžāĻĻ āĻĻāĻŋāϞ⧇ āϏāĻ°ā§āĻŦāĻļ⧇āώ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ āĻ…āύ⧁āϰ⧋āϧ

predict API-āĻāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻŦāĻĄāĻŋ āĻ…āĻŦāĻļā§āϝāχ JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻšāϤ⧇ āĻšāĻŦ⧇ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏāĻŋāϤ:

{
  // (Optional) Serving signature to use.
  // If unspecifed default serving signature is used.
  "signature_name": <string>,

  // Input Tensors in row ("instances") or columnar ("inputs") format.
  // A request can have either of them but NOT both.
  "instances": <value>|<(nested)list>|<list-of-objects>
  "inputs": <value>|<(nested)list>|<object>
}

āϏāĻžāϰāĻŋ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇ āχāύāĻĒ⧁āϟ āĻŸā§‡āύāϏāϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻžāĨ¤

āĻāχ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏāϟāĻŋ gRPC API āĻāϰ PredictRequest āĻĒā§āϰ⧋āĻŸā§‹ āĻāĻŦāĻ‚ CMLE āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ API āĻāϰ āĻ…āύ⧁āϰ⧂āĻĒāĨ¤ āĻāχ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āϝāĻĻāĻŋ āϏāĻŽāĻ¸ā§āϤ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āχāύāĻĒ⧁āϟ āĻŸā§‡āύāϏāϰ⧇āϰ 0-āϤāĻŽ āĻŽāĻžāĻ¤ā§āϰāĻž āĻāĻ•āχ āĻĨāĻžāϕ⧇āĨ¤ āϝāĻĻāĻŋ āϤāĻžāϰāĻž āύāĻž āĻ•āϰ⧇, āϤāĻžāĻšāϞ⧇ āύ⧀āĻšā§‡ āĻŦāĻ°ā§āĻŖāĻŋāϤ āĻ•āϞāĻžāĻŽāĻžāϰ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

āϏāĻžāϰāĻŋ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇, āχāύāĻĒ⧁āϟāϗ⧁āϞāĻŋ JSON āĻ…āύ⧁āϰ⧋āϧ⧇ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ āϕ⧀-āϤ⧇ āϕ⧀ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āϝāĻ–āύ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āχāύāĻĒ⧁āϟ āĻĨāĻžāϕ⧇, āχāύāĻĒ⧁āϟāϟāĻŋāϰ āĻŽāĻžāύ āĻšāϤ⧇ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ āϕ⧀-āĻāϰ āĻŽāĻžāύ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧁āύ:

{
  // List of 3 scalar tensors.
  "instances": [ "foo", "bar", "baz" ]
}

{
  // List of 2 tensors each of [1, 2] shape
  "instances": [ [[1, 2]], [[3, 4]] ]
}

āĻŸā§‡āύāϏāϰāϗ⧁āϞāĻŋ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āύ⧇āĻ¸ā§āĻŸā§‡āĻĄ āύ⧋āĻŸā§‡āĻļāύ⧇ āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰāĻž āĻšāϝāĻŧ āĻ•āĻžāϰāĻŖ āϤāĻžāϞāĻŋāĻ•āĻžāϟāĻŋāϕ⧇ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞāĻŋ āϏāĻŽāϤāϞ āĻ•āϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχāĨ¤

āĻāĻ•āĻžāϧāĻŋāĻ• āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āχāύāĻĒ⧁āĻŸā§‡āϰ āϜāĻ¨ā§āϝ, āĻĒā§āϰāϤāĻŋāϟāĻŋ āφāχāĻŸā§‡āĻŽ āχāύāĻĒ⧁āϟ āύāĻžāĻŽ/āĻŸā§‡āύāϏāϰ āĻŽāĻžāύ āĻœā§‹āĻĄāĻŧāĻž āϏāĻŽā§āĻŦāϞāĻŋāϤ āĻāĻ•āϟāĻŋ āĻŦāĻ¸ā§āϤ⧁ āĻšāϤ⧇ āĻĒāĻžāϰ⧇, āĻĒā§āϰāϤāĻŋāϟāĻŋ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āχāύāĻĒ⧁āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋāĨ¤ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻšāĻŋāϏāĻžāĻŦ⧇, āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĻ⧁āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āϏāĻš āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ, āĻĒā§āϰāϤāĻŋāϟāĻŋāϤ⧇ āϤāĻŋāύāϟāĻŋ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āχāύāĻĒ⧁āϟ āĻŸā§‡āύāϏāϰ⧇āϰ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āϰāϝāĻŧ⧇āϛ⧇:

{
 "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]]
   }
 ]
}

āĻĻā§āϰāĻˇā§āϟāĻŦā§āϝ, āĻĒā§āϰāϤāĻŋāϟāĻŋ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āχāύāĻĒ⧁āϟ ("āĻŸā§āϝāĻžāĻ—", "āϏāĻŋāĻ—āĻ¨ā§āϝāĻžāϞ", "āϏ⧇āĻ¨ā§āϏāϰ") āĻāĻ•āχ 0-āϤāĻŽ āĻŽāĻžāĻ¤ā§āϰāĻž (āωāĻĒāϰ⧇āϰ āωāĻĻāĻžāĻšāϰāϪ⧇ āĻĻ⧁āϟāĻŋ , āωāĻĻāĻžāĻšāϰāĻŖ āϤāĻžāϞāĻŋāĻ•āĻžāϝāĻŧ āĻĻ⧁āϟāĻŋ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĨāĻžāĻ•āĻžāϝāĻŧ) āĻ…āύ⧁āĻŽāĻžāύ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āχāύāĻĒ⧁āϟāϗ⧁āϞāĻŋāϰ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧ⧇ āĻĨāĻžāϕ⧇āύ āϝāĻžāϰ 0-āϤāĻŽ āĻŽāĻžāĻ¤ā§āϰāĻž āĻ­āĻŋāĻ¨ā§āύ, āύ⧀āĻšā§‡ āĻŦāĻ°ā§āĻŖāĻŋāϤ āĻ•āϞāĻžāĻŽāĻžāϰ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

āĻ•āϞāĻžāĻŽ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇ āχāύāĻĒ⧁āϟ āĻŸā§‡āύāϏāϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻžāĨ¤

āφāĻĒāύāĻžāϰ āχāύāĻĒ⧁āϟ āĻŸā§‡āύāϏāϰāϗ⧁āϞāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāϤ⧇ āĻāχ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ, āϝāĻĻāĻŋ āĻĒ⧃āĻĨāĻ• āύāĻžāĻŽā§‡āϰ āχāύāĻĒ⧁āϟāϗ⧁āϞāĻŋāϰ āĻāĻ•āχ 0-āϤāĻŽ āĻŽāĻžāĻ¤ā§āϰāĻž āύāĻž āĻĨāĻžāϕ⧇ āĻŦāĻž āφāĻĒāύāĻŋ āφāϰāĻ“ āĻ•āĻŽāĻĒā§āϝāĻžāĻ•ā§āϟ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύāĻž āϚāĻžāύāĨ¤ āĻāχ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏāϟāĻŋ 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 āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻāĻŦāĻ‚ āωāĻĻāĻžāĻšāϰāĻŖāϗ⧁āϞāĻŋāϰ āĻŽāϤ⧋ āĻāĻ•āϟāĻŋ āϤāĻžāϞāĻŋāĻ•āĻž āύāϝāĻŧ (āϏāĻžāϰāĻŋāϰ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϝāĻŧ āĻŦā§āϝāĻŦāĻšā§ƒāϤ)āĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻĒā§‚āĻ°ā§āĻŦ⧇ āĻŦāĻ°ā§āĻŖāĻŋāϤ āϏāĻžāϰāĻŋ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇ āĻ•āϰāĻž āĻĒ⧃āĻĨāĻ• āϏāĻžāϰāĻŋāϗ⧁āϞāĻŋāϤ⧇ āϤāĻžāĻĻ⧇āϰ āφāύāϰ⧋āϞ āĻ•āϰāĻžāϰ āĻŦāĻŋāĻĒāϰ⧀āϤ⧇ āϏāĻŽāĻ¸ā§āϤ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āχāύāĻĒ⧁āϟ āĻāĻ•āϏāĻžāĻĨ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāϟāĻŋ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϕ⧇ āĻ•āĻŽā§āĻĒā§āϝāĻžāĻ•ā§āϟ āĻ•āϰ⧇ āϤ⧋āϞ⧇ (āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ•āĻŽ āĻĒāĻ āύāϝ⧋āĻ—ā§āϝ)āĨ¤

āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ

predict āĻ…āύ⧁āϰ⧋āϧ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦāĻĄāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

āϏāĻžāϰāĻŋ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦāĻŋāĻ¨ā§āϝāĻžāϏāĻŋāϤ āφāϛ⧇:

{
  "predictions": <value>|<(nested)list>|<list-of-objects>
}

āϝāĻĻāĻŋ āĻŽāĻĄā§‡āϞ⧇āϰ āφāωāϟāĻĒ⧁āĻŸā§‡ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āĻŸā§‡āύāϏāϰ āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āφāĻŽāϰāĻž āĻ¸ā§āϕ⧇āϞāĻžāϰ āĻŦāĻž āϤāĻžāϞāĻŋāĻ•āĻž āĻŽāĻžāύāϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āϤāĻžāϞāĻŋāĻ•āĻžāϝāĻŧ āύāĻžāĻŽ āĻāĻŦāĻ‚ predictions āϕ⧀ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰāϗ⧁āϞāĻŋ āĻŦāĻžāĻĻ āĻĻāĻŋāχāĨ¤ āϝāĻĻāĻŋ āĻŽāĻĄā§‡āϞāϟāĻŋ āĻāĻ•āĻžāϧāĻŋāĻ• āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āĻŸā§‡āύāϏāϰ āφāωāϟāĻĒ⧁āϟ āĻ•āϰ⧇, āφāĻŽāϰāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻŦāĻ¸ā§āϤ⧁āϰ āĻāĻ•āϟāĻŋ āϤāĻžāϞāĻŋāĻ•āĻž āφāωāϟāĻĒ⧁āϟ āĻ•āϰāĻŋ, āωāĻĒāϰ⧇ āωāĻ˛ā§āϞāĻŋāĻ–āĻŋāϤ āϏāĻžāϰāĻŋ-āĻĢāϰāĻŽā§āϝāĻžāĻŸā§‡ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻ…āύ⧁āϰ⧂āĻĒāĨ¤

āĻ•āϞāĻžāĻŽāĻžāϰ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻĢāĻ°ā§āĻŽā§āϝāĻžāϟ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇:

{
  "outputs": <value>|<(nested)list>|<object>
}

āϝāĻĻāĻŋ āĻŽāĻĄā§‡āϞ⧇āϰ āφāωāϟāĻĒ⧁āĻŸā§‡ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āĻŸā§‡āύāϏāϰ āĻĨāĻžāϕ⧇, āφāĻŽāϰāĻž āύāĻžāĻŽāϟāĻŋ āĻŦāĻžāĻĻ āĻĻāĻŋāχ āĻāĻŦāĻ‚ āĻ¸ā§āϕ⧇āϞāĻžāϰ āĻŦāĻž āϤāĻžāϞāĻŋāĻ•āĻžāϰ āĻŽāĻžāύ⧇āϰ āϤāĻžāϞāĻŋāĻ•āĻžāϝāĻŧ āϕ⧀ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ outputs āĨ¤ āϝāĻĻāĻŋ āĻŽāĻĄā§‡āϞāϟāĻŋ āĻāĻ•āĻžāϧāĻŋāĻ• āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āĻŸā§‡āύāϏāϰ āφāωāϟāĻĒ⧁āϟ āĻ•āϰ⧇, āφāĻŽāϰāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻ¸ā§āϤ⧁ āφāωāϟāĻĒ⧁āϟ āĻ•āϰāĻŋāĨ¤ āĻāχ āĻŦāĻ¸ā§āϤ⧁āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϕ⧀ āĻāĻ•āϟāĻŋ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āφāωāϟāĻĒ⧁āϟ āĻŸā§‡āύāϏāϰ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞ⧇ āϝāĻžāϝāĻŧāĨ¤ āĻĢāϰāĻŽā§āϝāĻžāϟāϟāĻŋ āωāĻĒāϰ⧇ āωāĻ˛ā§āϞāĻŋāĻ–āĻŋāϤ āĻ•āϞāĻžāĻŽ āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻ…āύ⧁āϰ⧂āĻĒāĨ¤

āĻŦāĻžāχāύāĻžāϰāĻŋ āĻŽāĻžāύ⧇āϰ āφāωāϟāĻĒ⧁āϟ

TensorFlow āύāύ-āĻŦāĻžāχāύāĻžāϰ⧀ āĻāĻŦāĻ‚ āĻŦāĻžāχāύāĻžāϰāĻŋ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚āϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āĻ•āϰ⧇ āύāĻžāĨ¤ āϏāĻŦāϗ⧁āϞ⧋āχ DT_STRING āĻĒā§āϰāĻ•āĻžāϰāĨ¤ āύāĻžāĻŽāϝ⧁āĻ•ā§āϤ āĻŸā§‡āύāϏāϰ āϝ⧇āϗ⧁āϞāĻŋāϰ āύāĻžāĻŽā§‡ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ¤ā§āϝāϝāĻŧ āĻšāĻŋāϏāĻžāĻŦ⧇ _bytes āφāϛ⧇ āϤāĻžāĻĻ⧇āϰ āĻŦāĻžāχāύāĻžāϰāĻŋ āĻŽāĻžāύ āĻŦāϞ⧇ āĻŽāύ⧇ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āύ⧀āĻšā§‡āϰ āĻāύāϕ⧋āĻĄāĻŋāĻ‚ āĻŦāĻžāχāύāĻžāϰāĻŋ āĻŽāĻžāύ āĻŦāĻŋāĻ­āĻžāϗ⧇ āĻŦāĻ°ā§āĻŖāĻŋāϤ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻāχ āĻŽāĻžāύāϗ⧁āϞāĻŋ āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ āĻāύāϕ⧋āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

JSON āĻŽā§āϝāĻžāĻĒāĻŋāĻ‚

RESTful APIāϗ⧁āϞāĻŋ JSON-āĻ āĻāĻ•āϟāĻŋ āĻ•ā§āϝāĻžāύ⧋āύāĻŋāĻ•āĻžāϞ āĻāύāϕ⧋āĻĄāĻŋāĻ‚ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇, āϝāĻž āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻŽāĻ§ā§āϝ⧇ āĻĄā§‡āϟāĻž āĻ­āĻžāĻ— āĻ•āϰāĻž āϏāĻšāϜ āĻ•āϰ⧇ āϤ⧋āϞ⧇āĨ¤ āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻĒā§āϰāĻ•āĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ, āĻāύāϕ⧋āĻĄāĻŋāĻ‚āϗ⧁āϞāĻŋ āύ⧀āĻšā§‡āϰ āĻŸā§‡āĻŦāĻŋāϞ⧇ āϟāĻžāχāĻĒ-āĻŦāĻžāχ-āϟāĻžāχāĻĒ āĻ­āĻŋāĻ¤ā§āϤāĻŋāϤ⧇ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āύ⧀āĻšā§‡ āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āύāϝāĻŧ āĻĒā§āϰāĻ•āĻžāϰāϗ⧁āϞāĻŋ āĻ…āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻšāϤ⧇ āĻŦā§‹āĻāĻžāϝāĻŧ⧎

TF āĻĄā§‡āϟāĻž āϟāĻžāχāĻĒ JSON āĻŽāĻžāύ JSON āωāĻĻāĻžāĻšāϰāĻŖ āύ⧋āϟ
DT_BOOL āϏāĻ¤ā§āϝ, āĻŽāĻŋāĻĨā§āϝāĻž āϏāĻ¤ā§āϝ, āĻŽāĻŋāĻĨā§āϝāĻž
DT_STRING āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ "āĻšā§āϝāĻžāϞ⧋ āĻ“āϝāĻŧāĻžāĻ°ā§āĻ˛ā§āĻĄ!" āϝāĻĻāĻŋ DT_STRING āĻŦāĻžāχāύāĻžāϰāĻŋ āĻŦāĻžāχāϟ (āϝ⧇āĻŽāύ āϏāĻŋāϰāĻŋāϝāĻŧāĻžāϞāĻžāχāϜāĻĄ āχāĻŽā§‡āϜ āĻŦāĻžāχāϟ āĻŦāĻž āĻĒā§āϰ⧋āĻŸā§‹āĻŦāĻžāĻĢ) āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāĻ¤ā§āĻŦ āĻ•āϰ⧇, āϤāĻžāĻšāϞ⧇ āĻŦ⧇āϏ64 āĻ āĻāύāϕ⧋āĻĄ āĻ•āϰ⧁āύāĨ¤ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāĻžāχāύāĻžāϰāĻŋ āĻŽāĻžāύ āĻāύāϕ⧋āĻĄāĻŋāĻ‚ āĻĻ⧇āϖ⧁āύāĨ¤
DT_INT8, DT_UINT8, DT_INT16, DT_INT32, DT_UINT32, DT_INT64, DT_UINT64 āϏāĻ‚āĻ–ā§āϝāĻž 1, -10, 0 JSON āĻŽāĻžāύ āĻāĻ•āϟāĻŋ āĻĻāĻļāĻŽāĻŋāĻ• āϏāĻ‚āĻ–ā§āϝāĻž āĻšāĻŦ⧇āĨ¤
DT_FLOAT, DT_DOUBLE āϏāĻ‚āĻ–ā§āϝāĻž 1.1, -10.0, 0, NaN , Infinity JSON āĻŽāĻžāύ āĻšāĻŦ⧇ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻ–ā§āϝāĻž āĻŦāĻž āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļ⧇āώ āĻŸā§‹āϕ⧇āύ āĻŽāĻžāύ - NaN , Infinity , āĻāĻŦāĻ‚ -Infinity ⧎ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ JSON āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝ āĻĻ⧇āϖ⧁āύāĨ¤ āĻāĻ•ā§āϏāĻĒā§‹āύ⧇āĻ¨ā§āϟ āύ⧋āĻŸā§‡āĻļāύāĻ“ āĻ—ā§ƒāĻšā§€āϤ āĻšāϝāĻŧāĨ¤

āĻĢā§āϞ⧋āϟāĻŋāĻ‚ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϝāĻĨāĻžāĻ°ā§āĻĨāϤāĻž

JSON āĻāϰ āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āϏāĻ‚āĻ–ā§āϝāĻž āĻĄā§‡āϟāĻž āϟāĻžāχāĻĒ āφāϛ⧇āĨ¤ āĻāχāĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āχāύāĻĒ⧁āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŽāĻžāύ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻž āϏāĻŽā§āĻ­āĻŦ āϝāĻžāϰ āĻĢāϞ⧇ āύāĻŋāĻ°ā§āϭ⧁āϞāϤāĻž āύāĻˇā§āϟ āĻšāϝāĻŧāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϝāĻĻāĻŋ āχāύāĻĒ⧁āϟ x āĻāĻ•āϟāĻŋ float āĻĄā§‡āϟāĻž āϟāĻžāχāĻĒ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āχāύāĻĒ⧁āϟ {"x": 1435774380} IEEE 754 āĻĢā§āϞ⧋āϟāĻŋāĻ‚ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ (āϝ⧇āĻŽāύ āχāĻ¨ā§āĻŸā§‡āϞ āĻŦāĻž AMD) āĻāϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻšāĻžāĻ°ā§āĻĄāĻ“āϝāĻŧā§āϝāĻžāϰ⧇ āϚāϞāĻŽāĻžāύ āĻŽāĻĄā§‡āϞ⧇ āĻĒāĻžāĻ āĻžāύ⧋ āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧇ āĻŽāĻžāύ āĻšāĻŦ⧇ āφāĻ¨ā§āĻĄāĻžāϰāϞāĻžāχāĻ‚ āĻšāĻžāĻ°ā§āĻĄāĻ“āϝāĻŧā§āϝāĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āύ⧀āϰāĻŦ⧇ 1435774336 āϤ⧇ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰ āĻ•āϰāĻž āĻšāĻŦ⧇ āϝ⧇āĻšā§‡āϤ⧁ 1435774380 āĻāĻ•āϟāĻŋ 32-āĻŦāĻŋāϟ āĻĢā§āϞ⧋āϟāĻŋāĻ‚ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϏāĻ‚āĻ–ā§āϝāĻžāϤ⧇ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āύāĻžāĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ, āĻĒāϰāĻŋāĻŦ⧇āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āχāύāĻĒ⧁āϟāϗ⧁āϞāĻŋ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāϪ⧇āϰ āĻŽāϤ⧋āχ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āωāϚāĻŋāϤ, āϤāĻžāχ āĻāϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āϏāĻŽāĻ¸ā§āϝāĻžāϝ⧁āĻ•ā§āϤ āĻšāĻŦ⧇ āύāĻž āĻ•āĻžāϰāĻŖ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāϪ⧇āϰ āϏāĻŽāϝāĻŧ āĻāĻ•āχ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰāϗ⧁āϞāĻŋ āϘāĻŸā§‡āĻ›āĻŋāϞ⧎ āϝāĻžāχāĻšā§‹āĻ•, āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āύāĻŋāĻ°ā§āϭ⧁āϞāϤāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϞ⧇, āφāĻĒāύāĻžāϰ āĻŽāĻĄā§‡āϞ⧇ āĻāĻ•āϟāĻŋ āĻ…āĻ¨ā§āϤāĻ°ā§āύāĻŋāĻšāĻŋāϤ āĻĄā§‡āϟāĻž āϟāĻžāχāĻĒ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āϭ⧁āϞāĻŦ⧇āύ āύāĻž āϝāĻž āĻĒāĻ›āĻ¨ā§āĻĻāϏāχ āύāĻŋāĻ°ā§āϭ⧁āϞāϤāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ-āϏāĻžāχāĻĄ āĻšā§‡āĻ•āĻŋāĻ‚ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻŦāĻžāχāύāĻžāϰāĻŋ āĻŽāĻžāύ āĻāύāϕ⧋āĻĄāĻŋāĻ‚

JSON UTF-8 āĻāύāϕ⧋āĻĄāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āχāύāĻĒ⧁āϟ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻŦāĻž āĻŸā§‡āύāϏāϰ āĻŽāĻžāύ āĻĨāĻžāϕ⧇ āϝāĻž āĻŦāĻžāχāύāĻžāϰāĻŋ āĻšāϤ⧇ āĻšāĻŦ⧇ (āϝ⧇āĻŽāύ āχāĻŽā§‡āϜ āĻŦāĻžāχāϟ), āφāĻĒāύāĻžāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻŦ⧇āϏ 64 āĻĄā§‡āϟāĻž āĻāύāϕ⧋āĻĄ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡ āĻāύāĻ•ā§āϝāĻžāĻĒāϏ⧁āϞ⧇āϟ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϝāĻž b64 āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āϕ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇ āϰāϝāĻŧ⧇āϛ⧇:

{ "b64": <base64 encoded string> }

āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āχāύāĻĒ⧁āϟ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻŦāĻž āĻŸā§‡āύāϏāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŽāĻžāύ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻāχ āĻŦāĻ¸ā§āϤ⧁ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ. āĻāĻ•āχ āĻĢāĻ°ā§āĻŽā§āϝāĻžāϟ āφāωāϟāĻĒ⧁āϟ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻāύāϕ⧋āĻĄ āĻ•āϰāϤ⧇āĻ“ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧāĨ¤

image (āĻŦāĻžāχāύāĻžāϰ⧀ āĻĄā§‡āϟāĻž) āĻāĻŦāĻ‚ caption āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āϏāĻš āĻāĻ•āϟāĻŋ āĻļā§āϰ⧇āĻŖāĻŋāĻŦāĻŋāĻ¨ā§āϝāĻžāϏ āĻ…āύ⧁āϰ⧋āϧ āύ⧀āĻšā§‡ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāϝāĻŧ⧇āϛ⧇:

{
  "signature_name": "classify_objects",
  "examples": [
    {
      "image": { "b64": "aW1hZ2UgYnl0ZXM=" },
      "caption": "seaside"
    },
    {
      "image": { "b64": "YXdlc29tZSBpbWFnZSBieXRlcw==" },
      "caption": "mountains"
    }
  ]
}

JSON āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝ

āĻ…āύ⧇āĻ• āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻŦāĻž āĻŸā§‡āύāϏāϰ āĻŽāĻžāύ āĻĢā§āϞ⧋āϟāĻŋāĻ‚ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϏāĻ‚āĻ–ā§āϝāĻžāĨ¤ āϏāϏ⧀āĻŽ āĻŽāĻžāύ (āϝ⧇āĻŽāύ 3.14, 1.0 āχāĻ¤ā§āϝāĻžāĻĻāĻŋ) āĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻāϗ⧁āϞāĻŋāϰ NaN āĻāĻŦāĻ‚ āĻ…-āϏāϏ⧀āĻŽ ( Infinity āĻāĻŦāĻ‚ -Infinity ) āĻŽāĻžāύ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻĻ⧁āĻ°ā§āĻ­āĻžāĻ—ā§āϝāĻŦāĻļāϤ JSON āĻ¸ā§āĻĒ⧇āϏāĻŋāĻĢāĻŋāϕ⧇āĻļāύ ( RFC 7159 ) āĻāχ āĻŽāĻžāύāϗ⧁āϞāĻŋāϕ⧇ āϚāĻŋāύāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž (āϝāĻĻāĻŋāĻ“ JavaScript āĻ¸ā§āĻĒ⧇āϏāĻŋāĻĢāĻŋāϕ⧇āĻļāύ āĻ•āϰ⧇)āĨ¤

āĻāχ āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ āĻŦāĻ°ā§āĻŖāĻŋāϤ REST API āĻ…āύ⧁āϰ⧋āϧ/āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž JSON āĻ…āĻŦāĻœā§‡āĻ•ā§āϟāϕ⧇ āĻāχ āϧāϰāύ⧇āϰ āĻŽāĻžāύ āĻĨāĻžāĻ•āϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻāϟāĻŋ āĻŦā§‹āĻāĻžāϝāĻŧ āϝ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤāϗ⧁āϞāĻŋāϰ āĻŽāϤ⧋ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋ āĻŦ⧈āϧ:

{
  "example": [
    {
      "sensor_readings": [ 1.0, -3.14, Nan, Infinity ]
    }
  ]
}

āĻāĻ•āϟāĻŋ (āĻ•āĻ ā§‹āϰ) āĻŽāĻžāύ āϏāĻŽā§āĻŽāϤ JSON āĻĒāĻžāĻ°ā§āϏāĻžāϰ āĻāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āĻĒāĻžāĻ°ā§āϏ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ āĻ•āϰāĻŦ⧇ (āĻĒā§āϰāĻ•ā§ƒāϤ āϏāĻ‚āĻ–ā§āϝāĻžāϰ āϏāĻžāĻĨ⧇ NaN āĻāĻŦāĻ‚ Infinity āĻŸā§‹āϕ⧇āύ āĻŽāĻŋāĻļā§āϰāĻŋāϤ āĻšāĻ“āϝāĻŧāĻžāϰ āĻ•āĻžāϰāϪ⧇)āĨ¤ āφāĻĒāύāĻžāϰ āϕ⧋āĻĄā§‡ āĻ…āύ⧁āϰ⧋āϧ/āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇, āĻāχ āĻŸā§‹āϕ⧇āύāϗ⧁āϞāĻŋāϕ⧇ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇ āĻāĻŽāύ āĻāĻ•āϟāĻŋ JSON āĻĒāĻžāĻ°ā§āϏāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ⧎

NaN , Infinity , -Infinity āĻŸā§‹āϕ⧇āύāϗ⧁āϞāĻŋ proto3 , Python JSON āĻŽāĻĄāĻŋāωāϞ āĻāĻŦāĻ‚ JavaScript āĻ­āĻžāώāĻž āĻĻā§āĻŦāĻžāϰāĻž āĻ¸ā§āĻŦā§€āĻ•ā§ƒāϤāĨ¤

āωāĻĻāĻžāĻšāϰāĻŖ

āφāĻŽāϰāĻž REST API āϗ⧁āϞāĻŋāϕ⧇ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻĻ⧇āĻ–āϤ⧇ āϖ⧇āϞāύāĻž āĻšāĻžāĻĢ_āĻĒā§āϞāĻžāϏ_āĻĨā§āϰāĻŋ āĻŽāĻĄā§‡āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

REST API āĻļ⧇āώ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻĻāĻŋāϝāĻŧ⧇ āĻŽāĻĄā§‡āϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ

āĻ—āĻŋāϟ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āĻĨ⧇āϕ⧇ half_plus_three āĻŽāĻĄā§‡āϞ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰ⧁āύ:

$ mkdir -p /tmp/tfserving
$ cd /tmp/tfserving
$ git clone --depth=1 https://github.com/tensorflow/serving

āφāĻŽāϰāĻž āĻŽāĻĄā§‡āϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĄāĻ•āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦāĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āύ⧇āϟāĻŋāĻ­āĻ­āĻžāĻŦ⧇ āĻŽāĻĄā§‡āϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāϤ⧇ āϚāĻžāύ āϤāĻŦ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧇āϟāφāĻĒ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ REST API āĻļ⧇āώ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϰāĻĒā§āϤāĻžāύāĻŋ āĻ•āϰāϤ⧇ āĻŽāĻĄā§‡āϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϟāĻŋ --rest_api_port āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ (āĻĄāĻ•āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāϟāĻŋāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχ)āĨ¤

$ cd /tmp/tfserving
$ docker pull tensorflow/serving:latest
$ docker run --rm -p 8501:8501 \
    --mount type=bind,source=$(pwd),target=$(pwd) \
    -e MODEL_BASE_PATH=$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata \
    -e MODEL_NAME=saved_model_half_plus_three -t tensorflow/serving:latest
...
.... Exporting HTTP/REST API at:localhost:8501 ...

āĻŽāĻĄā§‡āϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ REST API āĻ•āϞ āĻ•āϰ⧁āύ

āĻāĻ•āϟāĻŋ āĻ­āĻŋāĻ¨ā§āύ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇, REST API āĻ•āϞ āĻ•āϰāϤ⧇ curl āϟ⧁āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻŽāĻĄā§‡āϞ⧇āϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻĒāĻžāύ:

$ curl http://localhost:8501/v1/models/saved_model_half_plus_three
{
 "model_version_status": [
  {
   "version": "123",
   "state": "AVAILABLE",
   "status": {
    "error_code": "OK",
    "error_message": ""
   }
  }
 ]
}

āĻāĻ•āϟāĻŋ predict āĻ•āϞ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻĻ⧇āĻ–āĻžāĻŦ⧇:

$ curl -d '{"instances": [1.0,2.0,5.0]}' -X POST http://localhost:8501/v1/models/saved_model_half_plus_three:predict
{
    "predictions": [3.5, 4.0, 5.5]
}

āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ regress āĻ•āϞ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻĻ⧇āĻ–āĻžāϝāĻŧ:

$ curl -d '{"signature_name": "tensorflow/serving/regress", "examples": [{"x": 1.0}, {"x": 2.0}]}' \
  -X POST http://localhost:8501/v1/models/saved_model_half_plus_three:regress
{
    "results": [3.5, 4.0]
}

āĻĻā§āϰāĻˇā§āϟāĻŦā§āϝ, regress āĻāĻ•āϟāĻŋ āĻ…-āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āύāĻžāĻŽā§‡āϰ āωāĻĒāϰ āωāĻĒāϞāĻŦā§āϧ āĻāĻŦāĻ‚ āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻž āφāĻŦāĻļā§āϝāĻ•āĨ¤ āĻāĻ•āϟāĻŋ āϭ⧁āϞ āĻ…āύ⧁āϰ⧋āϧ URL āĻŦāĻž āĻŦāĻĄāĻŋ āĻāĻ•āϟāĻŋ HTTP āĻ¤ā§āϰ⧁āϟāĻŋ āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤

$ curl -i -d '{"instances": [1.0,5.0]}' -X POST http://localhost:8501/v1/models/half:predict
HTTP/1.1 404 Not Found
Content-Type: application/json
Date: Wed, 06 Jun 2018 23:20:12 GMT
Content-Length: 65

{ "error": "Servable not found for request: Latest(half)" }
$