This page was translated by the Cloud Translation API.
Switch to English

RESTful API

জিআরপিসি এপিআই ছাড়াও টেনসরফ্লো মডেলসারও আরএসএফুল এপিআই সমর্থন করে। এই পৃষ্ঠাটি এই এপিআই সমাপ্তিগুলি এবং ব্যবহারের ক্ষেত্রে একটি শেষ-থেকে-শেষের উদাহরণটি বর্ণনা করে।

অনুরোধ এবং প্রতিক্রিয়া একটি JSON অবজেক্ট। অনুরোধের ধরণ বা ক্রিয়াটির উপর এই বস্তুর সংমিশ্রণ নির্ভর করে। বিস্তারিত জানার জন্য নীচের এপিআই নির্দিষ্ট বিভাগগুলি দেখুন।

ত্রুটির ক্ষেত্রে, সমস্ত APIs কী হিসাবে error এবং ত্রুটি বার্তাটিকে মান হিসাবে প্রতিক্রিয়া শৃঙ্খলে একটি JSON অবজেক্ট ফিরিয়ে দেবে:

{
  "error": <error message string>
}

মডেল স্থিতি এপিআই

এই ModelService.GetModelStatus মডেল ModelService.GetModelStatus স্ট্যাটাস ModelService.GetModelStatus এপিআইকে নিবিড়ভাবে অনুসরণ করে। এটি মডেল সার্ভারে কোনও মডেলের স্থিতি ফিরিয়ে দেয়।

ইউআরএল

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

/versions/${VERSION} বা /labels/${LABEL} /versions/${VERSION} সহ /versions/${VERSION} । যদি সমস্ত সংস্করণের জন্য বাদ দেওয়া স্থিতি প্রতিক্রিয়াতে ফিরে আসে।

প্রতিক্রিয়া বিন্যাস

যদি সফল হয় তবে GetModelStatusResponse একটি JSON প্রতিনিধিত্ব করে।

মডেল মেটাডেটা এপিআই

এই API ঘনিষ্ঠভাবে অনুসরণ PredictionService.GetModelMetadata gRPC API- টি। এটি মডেল সার্ভারে কোনও মডেলের মেটাডেটা ফিরিয়ে দেয়।

ইউআরএল

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

/versions/${VERSION} বা /labels/${LABEL} /versions/${VERSION} সহ /versions/${VERSION} । বাদ দেওয়া হলে সর্বশেষ সংস্করণটির জন্য মডেল মেটাডেটা প্রতিক্রিয়াতে ফিরে আসে।

প্রতিক্রিয়া বিন্যাস

যদি সফল হয় তবে GetModelMetadataResponse একটি JSON প্রতিনিধিত্ব করে।

শ্রেণিবদ্ধকরণ এবং এপিআই নিবন্ধন করুন

এই API ঘনিষ্ঠভাবে অনুসরণ Classify এবং Regress পদ্ধতি PredictionService gRPC API- টি।

ইউআরএল

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

/versions/${VERSION} বা /labels/${LABEL} /versions/${VERSION} সহ /versions/${VERSION} । বাদ দিলে সর্বশেষ সংস্করণটি ব্যবহৃত হয়।

অনুরোধ বিন্যাস

classify এবং এপিআইগুলিকে regress করার জন্য অনুরোধের বডিটি অবশ্যই 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 নম্বর (পুরো বা দশমিক) বা স্ট্রিং এবং <list> এই জাতীয় মানগুলির একটি তালিকা। বাইনারি (বাইটের প্রবাহ) কীভাবে উপস্থাপন করতে হয় তার বিশদ জন্য নীচের এনকোডিং বাইনারি মান বিভাগটি দেখুন। এই বিন্যাস gRPC এর অনুরূপ ClassificationRequest এবং RegressionRequest protos। উভয় সংস্করণ 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 অনুরোধটি প্রতিক্রিয়ার regress একটি JSON অবজেক্ট প্রদান করে, নিম্নরূপে ফর্ম্যাট করা:

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

<value> দশমিক সংখ্যা।

GRPC API- এর ব্যবহারকারীদের সাথে এই বিন্যাসের আদল লক্ষ্য করবেন ClassificationResponse এবং RegressionResponse protos।

পূর্বানুমান এপিআই

এই API ঘনিষ্ঠভাবে অনুসরণ PredictionService.Predict gRPC API- টি।

ইউআরএল

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

/versions/${VERSION} বা /labels/${LABEL} /versions/${VERSION} সহ /versions/${VERSION} । বাদ দিলে সর্বশেষ সংস্করণটি ব্যবহৃত হয়।

অনুরোধ বিন্যাস

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>
}

সারি বিন্যাসে ইনপুট টেনারগুলি নির্দিষ্ট করে।

এই ফর্ম্যাটটি জিআরপিসি এপিআই এর প্রিডিক্টরউয়েস্ট PredictRequest অনুরূপ এবং সিএমইএলএর পূর্বাভাস এপিআই । যদি সমস্ত নামযুক্ত ইনপুট টেনারগুলির একই 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-তম মাত্রা না থাকে বা আপনি আরও কমপ্যাক্ট উপস্থাপনা চান। এই ফর্ম্যাটটি জিআরপিসি 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 । যদি মডেলটি একাধিক নামকৃত টেনারগুলি আউটপুট করে তবে আমরা তার পরিবর্তে কোনও বস্তু আউটপুট করি। এই বস্তুর প্রতিটি কী একটি নামযুক্ত আউটপুট টেনসারের সাথে মিল রাখে। ফর্ম্যাটটি উপরে বর্ণিত কলাম বিন্যাসে অনুরোধের অনুরূপ।

বাইনারি মানগুলির আউটপুট

টেনসরফ্লো নন-বাইনারি এবং বাইনারি স্ট্রিংগুলির মধ্যে পার্থক্য করে না। সবই DT_STRING টাইপ। নামযুক্ত _bytes যা তাদের নামে প্রত্যয় হিসাবে _bytes রয়েছে বাইনারি মান হিসাবে বিবেচিত হয়। নীচের এনকোডিং বাইনারি মান বিভাগে বর্ণিত হিসাবে এ জাতীয় মানগুলি আলাদাভাবে এনকোড করা হয়।

জেএসএন ম্যাপিং

RESTful API গুলি JSON এ একটি ক্যানোনিকাল এনকোডিং সমর্থন করে, যাতে সিস্টেমগুলির মধ্যে ডেটা ভাগ করা আরও সহজ হয়। সমর্থিত প্রকারের জন্য, এনকোডিংগুলি নীচের সারণিতে টাইপ-বাই-টাইপ ভিত্তিতে বর্ণিত হয়। নীচে তালিকাভুক্ত নয় এমন প্রকারগুলি অসমর্থিত বলে বোঝানো হয়েছে।

টিএফ ডেটা প্রকার JSON মান JSON উদাহরণ মন্তব্য
DT_BOOL সত্য মিথ্যা সত্য মিথ্যা
DT_STRING স্ট্রিং "ওহে বিশ্ব!" যদি 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 জেএসএন মানটি একটি বিশেষ টোকেন মানগুলির একটি সংখ্যা বা একটি হবে - NaN , Infinity এবং -Infinity । আরও তথ্যের জন্য JSON কনফারেন্স দেখুন। উদ্দীপক স্বরলিপি গ্রহণ করা হয়।

বাইনারি মানগুলি এনকোডিং

জেএসএন ইউটিএফ -8 এনকোডিং ব্যবহার করে। আপনার যদি ইনপুট বৈশিষ্ট্য বা টেনসর মান রয়েছে যা বাইনারি হওয়ার দরকার (যেমন চিত্র বাইট), আপনার অবশ্যই বেস 64 টি ডেটা এনকোড করতে হবে এবং b64 -তে কী হিসাবে 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 স্পেসিফিকেশন ( আরএফসি 7159 ) এই মানগুলি স্বীকৃতি দেয় না (যদিও জাভাস্ক্রিপ্টের স্পেসিফিকেশন দেয়)।

এই পৃষ্ঠায় বর্ণিত REST এপিআই অনুরোধ / প্রতিক্রিয়া জেএসএন বস্তুকে এই জাতীয় মান থাকতে দেয় have এটি বোঝায় যে নিম্নলিখিতগুলির মতো অনুরোধগুলি বৈধ:

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

একটি (কড়া) মানক JSON পার্সার পার্সার ত্রুটি (প্রকৃত সংখ্যার সাথে মিশে NaN এবং Infinity টোকেনের কারণে) এটিকে প্রত্যাখ্যান করবে। আপনার কোডে অনুরোধ / প্রতিক্রিয়াগুলি সঠিকভাবে পরিচালনা করতে, একটি JSON পার্সার ব্যবহার করুন যা এই টোকেনগুলিকে সমর্থন করে।

NaN , Infinity , -Infinity টোকেন দ্বারা স্বীকৃত হয় proto3 , পাইথন তাদেরকে JSON মডিউল এবং জাভাস্ক্রিপ্ট ভাষা।

উদাহরণ

REST এআইপিআইগুলিকে কর্ম করতে দেখতে আমরা খেলনা অর্ধ_প্লাস_ত্রী মডেলটি ব্যবহার করতে পারি।

REST এপিআই এর শেষ পয়েন্টের সাথে মডেল সার্ভার শুরু করুন

গিট সংগ্রহস্থল থেকে half_plus_three মডেলটি ডাউনলোড করুন:

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

আমরা মডেলসভারটি চালাতে ডকার ব্যবহার করব। আপনি যদি নিজের সিস্টেমে মডেলসার্ভারটি স্থানীয়ভাবে ইনস্টল করতে চান তবে পরিবর্তে ইনস্টল করার জন্য সেটআপ নির্দেশাবলী অনুসরণ করুন , এবং REST এপিআই এর শেষ পয়েন্ট রফতানি করার জন্য --rest_api_port বিকল্পের সাহায্যে --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 এপিআই কল করুন

অন্য কোনও টার্মিনালে, আরএসটি এপিআই কল করার জন্য 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 একটি অ-ডিফল্ট স্বাক্ষর নাম উপলভ্য এবং 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)" }
$