সাহায্য Kaggle উপর TensorFlow সঙ্গে গ্রেট বেরিয়ার রিফ রক্ষা চ্যালেঞ্জ যোগদান

RESTful API

ছাড়াও gRPC API গুলি TensorFlow ModelServer এছাড়াও RESTful API গুলি সমর্থন করে। এই পৃষ্ঠাটি এই এপিআই এন্ড পয়েন্ট এবং একটি এন্ড-টু-এন্ড বর্ণনা উদাহরণস্বরূপ ব্যবহারের উপর।

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

ত্রুটির ক্ষেত্রে, সব API গুলির সাথে প্রতিক্রিয়া শরীরে একটি JSON বস্তু ফিরে আসবে error কী এবং মান হিসাবে ত্রুটি বার্তা হিসাবে:

{
  "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} ঐচ্ছিক। সব সংস্করণের জন্য স্ট্যাটাস বাদ দেওয়া হলে উত্তরে ফেরত দেওয়া হয়।

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

সফল হলে, এর একটি JSON- উপস্থাপনা ফেরৎ GetModelStatusResponse protobuf।

মডেল মেটাডেটা API

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

URL

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

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

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

সফল হলে, এর একটি JSON- উপস্থাপনা ফেরৎ GetModelMetadataResponse protobuf।

শ্রেণীবদ্ধ এবং প্রত্যাবর্তন API

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

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 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 নিম্নরূপ অনুরোধ প্রতিক্রিয়া শরীরে একটি 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

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

URL

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

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

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

জন্য অনুরোধের মূল predict এপিআই হওয়া আবশ্যক 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 gRPC API- এর প্রোটো এবং CMLE এপিআই ভবিষ্যদ্বাণী করা । এই বিন্যাস ব্যবহার করুন যদি সব নামে ইনপুট tensors একই 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-তম মাত্রা না থাকে বা আপনি আরও কমপ্যাক্ট উপস্থাপনা চান। এই বিন্যাস অনুরূপ inputs gRPC ক্ষেত্রে Predict অনুরোধ।

স্তম্ভাকার বিন্যাস সালে ইনপুট তাদেরকে JSON অনুরোধে ইনপুট চাবি অস্থির করছে।

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

JSON ম্যাপিং

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

TF ডেটা টাইপ JSON মান JSON উদাহরণ মন্তব্য
DT_BOOL সত্য মিথ্যা সত্য মিথ্যা
DT_STRING স্ট্রিং "ওহে বিশ্ব!" তাহলে DT_STRING বাইনারি বাইট (যেমন ধারাবাহিকভাবে ইমেজ বাইট বা protobuf), সঙ্কেতাক্ষরে লিখা করুন Base64- এই প্রতিনিধিত্ব করে। দেখুন বাইনারি মান এনকোডিং আরও তথ্যের জন্য।
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} আইইইই 754 ফ্লোটিং পয়েন্ট মান (যেমন Intel অথবা AMD), তারপর মান হবে উপর নির্ভর হার্ডওয়্যার চলমান মডেল পাঠানো হয় চুপটি থেকে underyling হার্ডওয়্যার রূপান্তরিত করা 1435774336 যেহেতু 1435774380 ঠিক একটি 32 বিট ফ্লোটিং পয়েন্ট সংখ্যা প্রতিনিধিত্ব করা যাবে না। সাধারণত, পরিবেশনের জন্য ইনপুটগুলি প্রশিক্ষণের মতোই বিতরণ করা উচিত, তাই এটি সাধারণত সমস্যাযুক্ত হবে না কারণ প্রশিক্ষণের সময় একই রূপান্তরগুলি ঘটেছিল৷ যাইহোক, সম্পূর্ণ নির্ভুলতার প্রয়োজন হলে, আপনার মডেলে একটি অন্তর্নিহিত ডেটা টাইপ ব্যবহার করতে ভুলবেন না যা পছন্দসই নির্ভুলতা পরিচালনা করতে পারে এবং/অথবা ক্লায়েন্ট-সাইড চেকিং বিবেচনা করতে পারে।

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

JSON UTF-8 এনকোডিং ব্যবহার করে। আপনি যে বাইনারি হতে হবে (চিত্র মত বাইটস) ইনপুট বৈশিষ্ট্য বা টেন্সর মান থাকে, তাহলে আপনি অবশ্যই করুন Base64- তথ্য সঙ্কেতাক্ষরে লিখা এবং একটি JSON বস্তু তা encapsulate থাকার 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 ) এই মান না চেনে (যদিও জাভাস্ক্রিপ্ট স্পেসিফিকেশন না)।

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

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

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

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

উদাহরণ

আমরা খেলনা ব্যবহার করতে পারেন half_plus_three কর্ম বিশ্রাম API গুলি দেখতে মডেল।

REST API শেষ পয়েন্ট দিয়ে মডেল সার্ভার শুরু করুন

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

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

আমরা মডেল সার্ভার চালানোর জন্য ডকার ব্যবহার করব। আপনি আপনার সিস্টেমে নেটিভ ModelServer ইনস্টল করুন, অনুসরণ করতে চান তাহলে সেটআপ নির্দেশমালা পরিবর্তে ইনস্টল করার জন্য, এবং ModelServer শুরু --rest_api_port (এই যখন Docker ব্যবহার প্রয়োজন হয় না) রপ্তানি বিশ্রাম এপিআই শেষবিন্দু করার অপশন।

$ 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 কল করুন

একটি ভিন্ন টার্মিনালে ব্যবহার curl বিশ্রাম API কল তৈরি করতে টুল।

নিম্নরূপ মডেলের অবস্থা পান:

$ 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)" }
$