একটি মডিউল তৈরি করা যা নতুন পরিবেশনযোগ্য পাথ আবিষ্কার করে

এই নথিটি ব্যাখ্যা করে যে কীভাবে টেনসরফ্লো সার্ভিংকে প্রসারিত করতে হয় তা বিভিন্ন স্টোরেজ সিস্টেম নিরীক্ষণের জন্য নতুন (সংস্করণ) মডেল বা ডেটা আবিষ্কার করতে। বিশেষ করে, এটি কভার করে যে কীভাবে একটি মডিউল তৈরি এবং ব্যবহার করা যায় যা নতুন উপ-পাথের উপস্থিতির জন্য একটি স্টোরেজ সিস্টেম পাথ নিরীক্ষণ করে, যেখানে প্রতিটি উপ-পাথ লোড করার জন্য একটি নতুন পরিবেশনযোগ্য সংস্করণ উপস্থাপন করে। এই ধরনের মডিউলকে Source<StoragePath> বলা হয়, কারণ এটি StoragePath ( string -এ টাইপডফড) ধরনের বস্তু নির্গত করে। এটি একটি SourceAdapter দিয়ে তৈরি করা যেতে পারে যা একটি প্রদত্ত পথ থেকে একটি পরিবেশনযোগ্য Loader তৈরি করে যা উত্সটি আবিষ্কার করে।

প্রথমত, সাধারণতা সম্পর্কে একটি নোট

পরিবেশনযোগ্য ডেটার হ্যান্ডেল হিসাবে পাথ ব্যবহার করার প্রয়োজন নেই; এটি শুধুমাত্র সিস্টেমের মধ্যে servables খাওয়ার একটি উপায় চিত্রিত করে। এমনকি যদি আপনার পরিবেশ পাথগুলিতে পরিবেশনযোগ্য ডেটা এনক্যাপসুলেট না করে, এই নথিটি আপনাকে মূল বিমূর্ততার সাথে পরিচিত করবে। আপনার পরিবেশের জন্য (যেমন RPC বা পাব/সাব মেসেজ, ডাটাবেস রেকর্ড) জন্য Source<T> এবং SourceAdapter<T1, T2> মডিউল তৈরি করার বিকল্প আছে, অথবা শুধুমাত্র একটি একক Source<std::unique_ptr<Loader>> তৈরি করতে। Source<std::unique_ptr<Loader>> যা সরাসরি পরিবেশনযোগ্য লোডার নির্গত করে।

অবশ্যই, আপনার উত্স যে ধরনের ডেটা নির্গত করুক না কেন (সেটি POSIX পাথ, Google ক্লাউড স্টোরেজ পাথ, বা RPC হ্যান্ডেলগুলিই হোক না কেন), সেখানে মডিউল (গুলি) থাকা দরকার যা এর উপর ভিত্তি করে servable লোড করতে সক্ষম৷ এই ধরনের মডিউলকে SourceAdapters বলা হয়। কাস্টম পরিবেশনযোগ্য নথিতে একটি কাস্টম তৈরি করা বর্ণনা করা হয়েছে। TensorFlow সার্ভিং টেনসরফ্লো সমর্থন করে এমন ফাইল সিস্টেমের পাথগুলির উপর ভিত্তি করে টেনসরফ্লো সেশনগুলিকে সূচনা করার জন্য একটির সাথে আসে। RandomAccessFile বিমূর্ততা ( tensorflow/core/public/env.h ) প্রসারিত করে কেউ টেনসরফ্লোতে অতিরিক্ত ফাইল সিস্টেমের জন্য সমর্থন যোগ করতে পারে।

এই দস্তাবেজটি একটি উৎস তৈরি করার উপর ফোকাস করে যা একটি TensorFlow-সমর্থিত ফাইল সিস্টেমে পাথ নির্গত করে। TensorFlow মডেলগুলি পরিবেশন করার জন্য আগে থেকে বিদ্যমান মডিউলগুলির সাথে একত্রে কীভাবে আপনার উত্স ব্যবহার করবেন তার একটি ওয়াক-থ্রু দিয়ে এটি শেষ হয়৷

আপনার উৎস তৈরি করা হচ্ছে

আমাদের কাছে একটি Source<StoragePath> এর একটি রেফারেন্স বাস্তবায়ন আছে, যাকে FileSystemStoragePathSource বলা হয় ( sources/storage_path/file_system_storage_path_source* এ)। FileSystemStoragePathSource একটি নির্দিষ্ট ফাইল সিস্টেম পাথ নিরীক্ষণ করে, সংখ্যাসূচক সাব-ডিরেক্টরিগুলির জন্য পর্যবেক্ষণ করে, এবং এটি যে সংস্করণটি লোড করার আকাঙ্খিত হয় সেগুলির মধ্যে সর্বশেষ রিপোর্ট করে। এই নথিটি FileSystemStoragePathSource এর গুরুত্বপূর্ণ দিকগুলির মধ্য দিয়ে চলে। আপনি FileSystemStoragePathSource এর একটি অনুলিপি তৈরি করা এবং তারপরে আপনার প্রয়োজন অনুসারে এটি পরিবর্তন করা সুবিধাজনক বলে মনে করতে পারেন।

প্রথমত, FileSystemStoragePathSource Source<StoragePath> API প্রয়োগ করে, যেটি Source<T> API-এর একটি বিশেষীকরণ যার সাথে T সাথে StoragePath এ আবদ্ধ। এপিআই একটি একক পদ্ধতি নিয়ে গঠিত SetAspiredVersionsCallback() , যা একটি বন্ধ সরবরাহ করে যা উৎসটি যোগাযোগের জন্য আহ্বান করতে পারে যে এটি পরিবেশনযোগ্য সংস্করণগুলির একটি নির্দিষ্ট সেট লোড করতে চায়।

FileSystemStoragePathSource একটি খুব সহজ উপায়ে উচ্চাকাঙ্খিত-সংস্করণ কলব্যাক ব্যবহার করে: এটি পর্যায়ক্রমে ফাইল সিস্টেমটি পরিদর্শন করে (অবশ্যই একটি ls করে), এবং যদি এটি এক বা একাধিক পথ খুঁজে পায় যা পরিবেশনযোগ্য সংস্করণগুলির মতো দেখায় তবে এটি নির্ধারণ করে কোনটি সর্বশেষ সংস্করণ এবং আহ্বান করে শুধুমাত্র সেই সংস্করণটি সমন্বিত আকারের একটি তালিকা সহ কলব্যাক (ডিফল্ট কনফিগারেশনের অধীনে)। সুতরাং, যে কোনো সময়ে FileSystemStoragePathSource লোড করার জন্য সর্বাধিক একটি পরিবেশন করার অনুরোধ করে এবং এটির বাস্তবায়ন কলব্যাকের অক্ষমতার সুযোগ নেয় নিজেকে রাষ্ট্রহীন রাখার জন্য (একই আর্গুমেন্টের সাথে বারবার কলব্যাক আহ্বান করার কোন ক্ষতি নেই)।

FileSystemStoragePathSource একটি স্ট্যাটিক ইনিশিয়ালাইজেশন ফ্যাক্টরি রয়েছে ( Create() পদ্ধতি), যা একটি কনফিগারেশন প্রোটোকল বার্তা নেয়। কনফিগারেশন বার্তায় বিশদ বিবরণ রয়েছে যেমন নিরীক্ষণের বেস পাথ এবং পর্যবেক্ষণ ব্যবধান। এটি নির্গত করার জন্য পরিবেশনযোগ্য প্রবাহের নামও অন্তর্ভুক্ত করে। (বিকল্প পদ্ধতিগুলি বেস পাথ থেকে পরিবেশনযোগ্য স্ট্রীম নামটি বের করতে পারে, একটি গভীর ডিরেক্টরি অনুক্রম পর্যবেক্ষণের উপর ভিত্তি করে একাধিক পরিবেশনযোগ্য স্ট্রীম নির্গত করতে; এই রূপগুলি রেফারেন্স বাস্তবায়নের সুযোগের বাইরে।)

বাস্তবায়নের বেশিরভাগ অংশে একটি থ্রেড থাকে যা পর্যায়ক্রমে ফাইল সিস্টেমটি পরীক্ষা করে, সাথে এটি আবিষ্কার করা যেকোনো সংখ্যাসূচক উপ-পাথ সনাক্তকরণ এবং বাছাই করার জন্য কিছু যুক্তি সহ। থ্রেডটি SetAspiredVersionsCallback() ( Create() তে নয়) এর মধ্যে চালু করা হয়েছে কারণ এটি সেই বিন্দুতে যেখানে উত্সটি "শুরু" করা উচিত এবং কোথায় উচ্চাকাঙ্খিত সংস্করণ অনুরোধ পাঠাতে হবে তা জানে৷

TensorFlow সেশন লোড করার জন্য আপনার উৎস ব্যবহার করা

আপনি সম্ভবত SavedModelBundleSourceAdapter ( servables/tensorflow/saved_model_bundle_source_adapter* ) এর সাথে আপনার নতুন সোর্স মডিউল ব্যবহার করতে চাইবেন, যা আপনার উৎস থেকে নির্গত প্রতিটি পথকে TensorFlow রপ্তানি হিসাবে ব্যাখ্যা করবে এবং প্রতিটি পথকে একটি SavedModelBundle এর জন্য একটি লোডারে রূপান্তর করবে। আপনি সম্ভবত SavedModelBundle অ্যাডাপ্টারটিকে একটি AspiredVersionsManager এ প্লাগ করবেন, যা প্রকৃতপক্ষে লোড করা এবং সার্ভেবলগুলি পরিবেশন করার যত্ন নেয়৷ একটি কার্যকরী সার্ভার লাইব্রেরি পেতে এই তিন ধরণের মডিউলকে একসাথে চেইন করার একটি ভাল উদাহরণ servables/tensorflow/simple_servers.cc এ পাওয়া যায়। এখানে মূল কোড প্রবাহের একটি ওয়াক-থ্রু রয়েছে (খারাপ ত্রুটি হ্যান্ডলিং সহ; আসল কোড আরও সতর্ক হওয়া উচিত):

প্রথমে একটি ম্যানেজার তৈরি করুন:

std::unique_ptr<AspiredVersionsManager> manager = ...;

তারপরে, একটি SavedModelBundle সোর্স অ্যাডাপ্টার তৈরি করুন এবং এটি ম্যানেজারে প্লাগ করুন:

std::unique_ptr<SavedModelBundleSourceAdapter> bundle_adapter;
SavedModelBundleSourceAdapterConfig config;
// ... populate 'config' with TensorFlow options.
TF_CHECK_OK(SavedModelBundleSourceAdapter::Create(config, &bundle_adapter));
ConnectSourceToTarget(bundle_adapter.get(), manager.get());

সবশেষে, আপনার পথের উৎস তৈরি করুন এবং এটিকে SavedModelBundle অ্যাডাপ্টারে প্লাগ করুন:

auto your_source = new YourPathSource(...);
ConnectSourceToTarget(your_source, bundle_adapter.get());

ConnectSourceToTarget() ফাংশন ( core/target.h এ সংজ্ঞায়িত করা হয়েছে) শুধুমাত্র একটি Source<T> Target<T> সাথে সংযোগ করতে SetAspiredVersionsCallback() আহ্বান করে (একটি Target হল একটি মডিউল যা উচ্চাকাঙ্খিত-সংস্করণ অনুরোধগুলি ধরতে পারে, যেমন একটি অ্যাডাপ্টার বা ম্যানেজার )