এই নথিটি ব্যাখ্যা করে যে কীভাবে একটি নতুন ধরনের পরিবেশনযোগ্য টেনসরফ্লো সার্ভিং প্রসারিত করা যায়। সবচেয়ে বিশিষ্ট পরিবেশনযোগ্য প্রকারটি হল SavedModelBundle
, কিন্তু এটি আপনার মডেলের সাথে যায় এমন ডেটা পরিবেশন করতে, অন্যান্য ধরণের সার্ভেবলগুলিকে সংজ্ঞায়িত করতে কার্যকর হতে পারে। উদাহরণগুলির মধ্যে রয়েছে: একটি শব্দভান্ডার সন্ধানের টেবিল, বৈশিষ্ট্য রূপান্তর যুক্তি। যেকোন C++ ক্লাস একটি পরিবেশনযোগ্য হতে পারে, যেমন int
, std::map<string, int>
বা আপনার বাইনারিতে সংজ্ঞায়িত যেকোন ক্লাস -- আসুন আমরা একে YourServable
বলি।
YourServable
এর জন্য একটি Loader
এবং SourceAdapter
সংজ্ঞায়িত করা
YourServable
পরিচালনা এবং পরিবেশন করতে TensorFlow সার্ভিং সক্ষম করতে, আপনাকে দুটি জিনিস সংজ্ঞায়িত করতে হবে:
একটি
Loader
ক্লাস যাYourServable
এর একটি উদাহরণ লোড করে, অ্যাক্সেস প্রদান করে এবং আনলোড করে।একটি
SourceAdapter
যা কিছু অন্তর্নিহিত ডেটা বিন্যাস যেমন ফাইল-সিস্টেম পাথ থেকে লোডারগুলিকে তাৎক্ষণিক করে। একটিSourceAdapter
এর বিকল্প হিসাবে, আপনি একটি সম্পূর্ণSource
লিখতে পারেন। যাইহোক, যেহেতুSourceAdapter
পদ্ধতিটি আরও সাধারণ এবং আরও মডুলার, আমরা এখানে এটির উপর ফোকাস করি।
Loader
বিমূর্ততা core/loader.h
এ সংজ্ঞায়িত করা হয়েছে। এটি আপনাকে আপনার পরিবেশনযোগ্য ধরণের লোড, অ্যাক্সেস এবং আনলোড করার পদ্ধতিগুলি সংজ্ঞায়িত করতে হবে। যে ডেটা থেকে পরিবেশনযোগ্য লোড করা হয় তা যে কোনও জায়গা থেকে আসতে পারে, তবে এটি একটি স্টোরেজ-সিস্টেম পথ থেকে আসা সাধারণ। আমাদের অনুমান করা যাক যে YourServable
এর ক্ষেত্রে এটি। আসুন আমরা আরও অনুমান করি যে আপনার কাছে ইতিমধ্যেই একটি Source<StoragePath>
আছে যেটির সাথে আপনি খুশি (যদি না হয়, কাস্টম উত্স নথি দেখুন)।
আপনার Loader
ছাড়াও, আপনাকে একটি SourceAdapter
সংজ্ঞায়িত করতে হবে যা একটি প্রদত্ত স্টোরেজ পাথ থেকে একটি Loader
ইনস্ট্যান্টিয়েট করে। সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্রে দুটি বস্তুকে SimpleLoaderSourceAdapter
ক্লাসের ( core/simple_loader.h
এ) সাথে সংক্ষিপ্তভাবে নির্দিষ্ট করতে পারে। উন্নত ব্যবহারের ক্ষেত্রে নিম্ন-স্তরের API ব্যবহার করে আলাদাভাবে Loader
এবং SourceAdapter
ক্লাস নির্দিষ্ট করতে বেছে নিতে পারে, যেমন SourceAdapter
কিছু অবস্থা ধরে রাখতে হয়, এবং/অথবা যদি Loader
দৃষ্টান্তগুলির মধ্যে স্টেট শেয়ার করার প্রয়োজন হয়।
servables/hashmap/hashmap_source_adapter.cc
এ SimpleLoaderSourceAdapter
ব্যবহার করে এমন একটি সাধারণ হ্যাশম্যাপ সার্ভযোগ্যের একটি রেফারেন্স বাস্তবায়ন রয়েছে। HashmapSourceAdapter
এর একটি অনুলিপি তৈরি করা এবং তারপরে আপনার প্রয়োজন অনুসারে এটি পরিবর্তন করা আপনার পক্ষে সুবিধাজনক মনে হতে পারে।
HashmapSourceAdapter
বাস্তবায়নের দুটি অংশ রয়েছে:
LoadHashmapFromFile()
এ একটি ফাইল থেকে একটি হ্যাশম্যাপ লোড করার যুক্তি।একটি
SourceAdapter
সংজ্ঞায়িত করতেSimpleLoaderSourceAdapter
এর ব্যবহার যাLoadHashmapFromFile()
এর উপর ভিত্তি করে হ্যাশম্যাপ লোডার নির্গত করে।HashmapSourceAdapterConfig
টাইপের কনফিগারেশন প্রোটোকল বার্তা থেকে নতুনSourceAdapter
চালু করা যেতে পারে। বর্তমানে, কনফিগারেশন বার্তাটিতে কেবল ফাইল বিন্যাস রয়েছে এবং রেফারেন্স বাস্তবায়নের উদ্দেশ্যে শুধুমাত্র একটি একক সাধারণ বিন্যাস সমর্থিত।ডেস্ট্রক্টরে
Detach()
কলটি নোট করুন। রাষ্ট্রকে ছিঁড়ে ফেলা এবং অন্যান্য থ্রেডে স্রষ্টা ল্যাম্বডার যে কোনো চলমান আহ্বানের মধ্যে দৌড় এড়াতে এই কলটি প্রয়োজন। (যদিও এই সাধারণ উৎস অ্যাডাপ্টারের কোন অবস্থা নেই, তবুও বেস ক্লাসটি প্রয়োগ করে যে Detach() বলা হয়।)
YourServable
বস্তুগুলি একটি ম্যানেজারে লোড করার ব্যবস্থা করা
YourServable
লোডারগুলির জন্য আপনার নতুন SourceAdapter
স্টোরেজ পাথের একটি মৌলিক উত্স এবং একজন ম্যানেজার (খারাপ ত্রুটি পরিচালনা সহ; আসল কোডটি আরও সতর্ক হওয়া উচিত):
প্রথমে একটি ম্যানেজার তৈরি করুন:
std::unique_ptr<AspiredVersionsManager> manager = ...;
তারপরে, একটি YourServable
সোর্স অ্যাডাপ্টার তৈরি করুন এবং এটি ম্যানেজারে প্লাগ করুন:
auto your_adapter = new YourServableSourceAdapter(...);
ConnectSourceToTarget(your_adapter, manager.get());
অবশেষে, একটি সহজ পাথ উৎস তৈরি করুন এবং এটি আপনার অ্যাডাপ্টারে প্লাগ করুন:
std::unique_ptr<FileSystemStoragePathSource> path_source;
// Here are some FileSystemStoragePathSource config settings that ought to get
// it working, but for details please see its documentation.
FileSystemStoragePathSourceConfig config;
// We just have a single servable stream. Call it "default".
config.set_servable_name("default");
config.set_base_path(FLAGS::base_path /* base path for our servable files */);
config.set_file_system_poll_wait_seconds(1);
TF_CHECK_OK(FileSystemStoragePathSource::Create(config, &path_source));
ConnectSourceToTarget(path_source.get(), your_adapter.get());
লোড করা YourServable
অবজেক্ট অ্যাক্সেস করা হচ্ছে
একটি লোড করা YourServable
এ কীভাবে একটি হ্যান্ডেল পাবেন এবং এটি ব্যবহার করবেন তা এখানে রয়েছে:
auto handle_request = serving::ServableRequest::Latest("default");
ServableHandle<YourServable*> servable;
Status status = manager->GetServableHandle(handle_request, &servable);
if (!status.ok()) {
LOG(INFO) << "Zero versions of 'default' servable have been loaded so far";
return;
}
// Use the servable.
(*servable)->SomeYourServableMethod();
উন্নত: রাজ্য ভাগ করার জন্য একাধিক পরিবেশনযোগ্য দৃষ্টান্তের ব্যবস্থা করা
সোর্সঅ্যাডাপ্টার এমন অবস্থা রাখতে পারে যা একাধিক নির্গত সার্বেলের মধ্যে ভাগ করা হয়। যেমন:
একটি শেয়ার্ড থ্রেড পুল বা অন্য রিসোর্স যা একাধিক সার্ভেবল ব্যবহার করে।
একটি শেয়ার্ড অনলি-পঠনযোগ্য ডেটা স্ট্রাকচার যা একাধিক সার্বেল ব্যবহার করে, প্রতিটি পরিবেশনযোগ্য দৃষ্টান্তে ডেটা স্ট্রাকচারের প্রতিলিপি করার সময় এবং স্থান ওভারহেড এড়াতে।
শেয়ার্ড স্টেট যার প্রারম্ভিকতার সময় এবং আকার নগণ্য (যেমন থ্রেড পুল) সোর্সঅ্যাডাপ্টার দ্বারা সাগ্রহে তৈরি করা যেতে পারে, যা তারপর প্রতিটি নির্গত পরিবেশনযোগ্য লোডারে এটিতে একটি পয়েন্টার এম্বেড করে। ব্যয়বহুল বা বৃহৎ শেয়ার্ড স্টেট তৈরি করা প্রথম প্রযোজ্য Loader::Load() কলে স্থগিত করা উচিত, অর্থাৎ পরিচালক দ্বারা নিয়ন্ত্রিত। সমান্তরালভাবে, Loader::Unload() দামী/বড় শেয়ার্ড স্টেট ব্যবহার করে চূড়ান্ত পরিবেশনে কল করলে এটিকে ছিন্ন করা উচিত।