সময়সূচী মেকানিক্স
একটি MediaPipe গ্রাফে ডেটা প্রক্রিয়াকরণ প্রক্রিয়াকরণ নোডের ভিতরে ঘটে যা CalculatorBase
সাবক্লাস হিসাবে সংজ্ঞায়িত করা হয়। প্রতিটি ক্যালকুলেটর কখন চালানো উচিত তা নির্ধারণ করে।
প্রতিটি গ্রাফে কমপক্ষে একটি সময়সূচী সারি থাকে। প্রতিটি শিডিউলারের সারিতে ঠিক একজন নির্বাহক থাকে। নোডগুলি স্থিরভাবে একটি সারিতে বরাদ্দ করা হয় (এবং তাই একজন নির্বাহককে)। ডিফল্টরূপে একটি সারি আছে, যার নির্বাহক হল একটি থ্রেড পুল যার সিস্টেমের ক্ষমতার উপর ভিত্তি করে অনেকগুলি থ্রেড রয়েছে।
প্রতিটি নোডের একটি সময়সূচী অবস্থা রয়েছে, যা প্রস্তুত , প্রস্তুত বা চলমান হতে পারে না। একটি প্রস্তুতি ফাংশন একটি নোড চালানোর জন্য প্রস্তুত কিনা তা নির্ধারণ করে। এই ফাংশনটি গ্রাফ ইনিশিয়ালাইজেশনে আমন্ত্রণ জানানো হয়, যখনই একটি নোড চালানো শেষ হয় এবং যখনই একটি নোডের ইনপুটগুলির অবস্থা পরিবর্তিত হয়।
ব্যবহৃত প্রস্তুতি ফাংশন নোড ধরনের উপর নির্ভর করে। কোন স্ট্রিম ইনপুট ছাড়া একটি নোড একটি উৎস নোড হিসাবে পরিচিত হয়; সোর্স নোডগুলি সর্বদা চালানোর জন্য প্রস্তুত থাকে, যতক্ষণ না তারা ফ্রেমওয়ার্ককে বলে যে তাদের কাছে আউটপুট করার জন্য আর কোনও ডেটা নেই, যে সময়ে সেগুলি বন্ধ হয়ে যায়।
নন-সোর্স নোডগুলি প্রস্তুত থাকে যদি তাদের কাছে প্রক্রিয়া করার জন্য ইনপুট থাকে এবং যদি সেই ইনপুটগুলি নোডের ইনপুট নীতি দ্বারা নির্ধারিত শর্ত অনুসারে একটি বৈধ ইনপুট সেট তৈরি করে (নীচে আলোচনা করা হয়েছে)। বেশিরভাগ নোড ডিফল্ট ইনপুট নীতি ব্যবহার করে, কিন্তু কিছু নোড আলাদা একটি নির্দিষ্ট করে।
যখন একটি নোড প্রস্তুত হয়, তখন সংশ্লিষ্ট শিডিউলার সারিতে একটি টাস্ক যোগ করা হয়, যা একটি অগ্রাধিকার সারি। অগ্রাধিকার ফাংশন বর্তমানে স্থির করা হয়েছে, এবং নোডগুলির স্ট্যাটিক বৈশিষ্ট্য এবং গ্রাফের মধ্যে তাদের টপোলজিকাল বাছাইকে বিবেচনা করে। উদাহরণস্বরূপ, গ্রাফের আউটপুট দিকের কাছাকাছি নোডগুলির অগ্রাধিকার বেশি, যখন উত্স নোডগুলির অগ্রাধিকার সর্বনিম্ন৷
প্রতিটি সারি একজন নির্বাহক দ্বারা পরিবেশিত হয়, যেটি আসলে ক্যালকুলেটরের কোড ব্যবহার করে কাজটি চালানোর জন্য দায়ী। বিভিন্ন নির্বাহক প্রদান এবং কনফিগার করা যেতে পারে; এটি এক্সিকিউশন রিসোর্সের ব্যবহার কাস্টমাইজ করতে ব্যবহার করা যেতে পারে, যেমন নিম্ন-অগ্রাধিকার থ্রেডে নির্দিষ্ট নোড চালানোর মাধ্যমে।
টাইমস্ট্যাম্প সিঙ্ক্রোনাইজেশন
মিডিয়াপাইপ গ্রাফ এক্সিকিউশন বিকেন্দ্রীকৃত: কোন বিশ্বব্যাপী ঘড়ি নেই, এবং বিভিন্ন নোড একই সময়ে বিভিন্ন টাইমস্ট্যাম্প থেকে ডেটা প্রক্রিয়া করতে পারে। এটি পাইপলাইনিংয়ের মাধ্যমে উচ্চতর থ্রুপুটকে অনুমতি দেয়।
যাইহোক, অনেক উপলব্ধি কর্মপ্রবাহের জন্য সময় তথ্য খুবই গুরুত্বপূর্ণ। যে নোডগুলি একাধিক ইনপুট স্ট্রীম গ্রহণ করে তাদের সাধারণত কিছু উপায়ে সমন্বয় করতে হয়। উদাহরণস্বরূপ, একটি অবজেক্ট ডিটেক্টর একটি ফ্রেম থেকে সীমানা আয়তক্ষেত্রগুলির একটি তালিকা আউটপুট করতে পারে এবং এই তথ্যটি একটি রেন্ডারিং নোডে দেওয়া যেতে পারে, যা এটিকে মূল ফ্রেমের সাথে একসাথে প্রক্রিয়া করা উচিত।
অতএব, মিডিয়াপাইপ ফ্রেমওয়ার্কের অন্যতম প্রধান দায়িত্ব হল নোডের জন্য ইনপুট সিঙ্ক্রোনাইজেশন প্রদান করা। ফ্রেমওয়ার্ক মেকানিক্সের পরিপ্রেক্ষিতে, একটি টাইমস্ট্যাম্পের প্রাথমিক ভূমিকা হল একটি সিঙ্ক্রোনাইজেশন কী হিসাবে পরিবেশন করা।
অধিকন্তু, মিডিয়াপাইপকে নির্ধারক ক্রিয়াকলাপকে সমর্থন করার জন্য ডিজাইন করা হয়েছে, যা অনেক পরিস্থিতিতে গুরুত্বপূর্ণ (পরীক্ষা, সিমুলেশন, ব্যাচ প্রসেসিং, ইত্যাদি), যেখানে গ্রাফ লেখকদের রিয়েল-টাইম সীমাবদ্ধতা পূরণের প্রয়োজনে নির্ধারকতা শিথিল করার অনুমতি দেয়।
সিঙ্ক্রোনাইজেশন এবং ডিটারমিনিজমের দুটি উদ্দেশ্য বেশ কয়েকটি ডিজাইনের পছন্দকে অন্তর্নিহিত করে। উল্লেখযোগ্যভাবে, একটি প্রদত্ত স্ট্রীমে ঠেলে দেওয়া প্যাকেটগুলিতে একঘেয়ে ক্রমবর্ধমান টাইমস্ট্যাম্প থাকতে হবে: এটি অনেক নোডের জন্য শুধুমাত্র একটি দরকারী অনুমান নয়, তবে এটি সিঙ্ক্রোনাইজেশন লজিকের উপরও নির্ভর করে। প্রতিটি স্ট্রীমের একটি টাইমস্ট্যাম্প আবদ্ধ থাকে, যা স্ট্রীমে একটি নতুন প্যাকেটের জন্য অনুমোদিত সর্বনিম্ন সম্ভাব্য টাইমস্ট্যাম্প। যখন টাইমস্ট্যাম্প T
সহ একটি প্যাকেট আসে, তখন আবদ্ধ স্বয়ংক্রিয়ভাবে T+1
এ অগ্রসর হয়, একঘেয়ে প্রয়োজনীয়তা প্রতিফলিত করে। এটি ফ্রেমওয়ার্ককে নিশ্চিতভাবে জানতে দেয় যে T
এর চেয়ে কম টাইমস্ট্যাম্প সহ আর কোনো প্যাকেট আসবে না।
ইনপুট নীতি
নোড দ্বারা নির্দিষ্ট ইনপুট নীতি ব্যবহার করে প্রতিটি নোডে স্থানীয়ভাবে সিঙ্ক্রোনাইজেশন পরিচালনা করা হয়।
DefaultInputStreamHandler
দ্বারা সংজ্ঞায়িত ডিফল্ট ইনপুট নীতি, নিম্নলিখিত গ্যারান্টি সহ ইনপুটগুলির নির্ধারক সিঙ্ক্রোনাইজেশন প্রদান করে:
যদি একই টাইমস্ট্যাম্প সহ প্যাকেটগুলি একাধিক ইনপুট স্ট্রীমে সরবরাহ করা হয়, তবে বাস্তব সময়ে তাদের আগমনের আদেশ নির্বিশেষে সেগুলি সর্বদা একসাথে প্রক্রিয়া করা হবে।
ইনপুট সেট কঠোরভাবে আরোহী টাইমস্ট্যাম্প ক্রমে প্রক্রিয়া করা হয়.
কোন প্যাকেট বাদ দেওয়া হয় না, এবং প্রক্রিয়াকরণ সম্পূর্ণরূপে নির্ধারক.
উপরের গ্যারান্টি দেওয়া হলে নোড যত তাড়াতাড়ি সম্ভব ডেটা প্রক্রিয়া করার জন্য প্রস্তুত হয়ে যায়।
এটি কীভাবে কাজ করে তা ব্যাখ্যা করার জন্য, আমাদের একটি নিষ্পত্তিকৃত টাইমস্ট্যাম্পের সংজ্ঞা প্রবর্তন করতে হবে। আমরা বলি যে একটি প্রবাহে একটি টাইমস্ট্যাম্প নিষ্পত্তি করা হয় যদি এটি টাইমস্ট্যাম্প সীমার চেয়ে কম হয়। অন্য কথায়, সেই টাইমস্ট্যাম্পে ইনপুটের অবস্থা অপরিবর্তনীয়ভাবে জানা হয়ে গেলে একটি স্ট্রীমের জন্য একটি টাইমস্ট্যাম্প নিষ্পত্তি করা হয়: হয় একটি প্যাকেট আছে, বা সেই টাইমস্ট্যাম্প সহ একটি প্যাকেট আসবে না এমন নিশ্চিততা রয়েছে৷
একটি টাইমস্ট্যাম্প একাধিক স্ট্রীম জুড়ে নিষ্পত্তি করা হয় যদি এটি সেই স্ট্রিমগুলির প্রতিটিতে নিষ্পত্তি করা হয়। তদ্ব্যতীত, যদি একটি টাইমস্ট্যাম্প নিষ্পত্তি করা হয় তবে এটি বোঝায় যে সমস্ত পূর্ববর্তী টাইমস্ট্যাম্পগুলিও নিষ্পত্তি করা হয়েছে৷ এইভাবে নিষ্পত্তি করা টাইমস্ট্যাম্পগুলি আরোহী ক্রমে নির্ধারকভাবে প্রক্রিয়া করা যেতে পারে।
এই সংজ্ঞা দেওয়া, ডিফল্ট ইনপুট নীতি সহ একটি ক্যালকুলেটর প্রস্তুত যদি এমন একটি টাইমস্ট্যাম্প থাকে যা সমস্ত ইনপুট স্ট্রীম জুড়ে নিষ্পত্তি করা হয় এবং কমপক্ষে একটি ইনপুট স্ট্রীমে একটি প্যাকেট থাকে৷ ইনপুট নীতি ক্যালকুলেটরে সেট করা একক ইনপুট হিসাবে একটি নিষ্পত্তিকৃত টাইমস্ট্যাম্পের জন্য সমস্ত উপলব্ধ প্যাকেট সরবরাহ করে।
এই নির্ধারক আচরণের একটি ফলাফল হল, একাধিক ইনপুট স্ট্রীম সহ নোডগুলির জন্য, একটি টাইমস্ট্যাম্প নিষ্পত্তির জন্য একটি তাত্ত্বিকভাবে সীমাহীন অপেক্ষা থাকতে পারে এবং এর মধ্যে একটি সীমাহীন সংখ্যক প্যাকেট বাফার করা যেতে পারে। (দুটি ইনপুট স্ট্রিম সহ একটি নোড বিবেচনা করুন, যার মধ্যে একটি প্যাকেট পাঠাতে থাকে যখন অন্যটি কিছুই পাঠায় না এবং বাউন্ডকে অগ্রসর করে না।)
তাই, আমরা কাস্টম ইনপুট নীতিগুলির জন্যও প্রদান করি: উদাহরণস্বরূপ, SyncSetInputStreamHandler
দ্বারা সংজ্ঞায়িত বিভিন্ন সিঙ্ক্রোনাইজেশন সেটে ইনপুটগুলিকে বিভক্ত করা, অথবা সম্পূর্ণরূপে সিঙ্ক্রোনাইজেশন এড়ানো এবং ImmediateInputStreamHandler
দ্বারা সংজ্ঞায়িত হওয়ার সাথে সাথে ইনপুটগুলি প্রক্রিয়াকরণ করা।
প্রবাহ নিয়ন্ত্রণ
দুটি প্রধান প্রবাহ নিয়ন্ত্রণ প্রক্রিয়া আছে। একটি ব্যাকপ্রেশার মেকানিজম আপস্ট্রিম নোডের এক্সিকিউশনকে থ্রোটল করে যখন একটি স্ট্রিমে বাফার করা প্যাকেটগুলি CalculatorGraphConfig::max_queue_size
দ্বারা সংজ্ঞায়িত একটি (কনফিগারযোগ্য) সীমাতে পৌঁছায়। এই প্রক্রিয়াটি নির্ধারক আচরণ বজায় রাখে, এবং একটি অচলাবস্থা পরিহার করার সিস্টেম অন্তর্ভুক্ত করে যা প্রয়োজনের সময় কনফিগার করা সীমা শিথিল করে।
দ্বিতীয় সিস্টেমে বিশেষ নোড সন্নিবেশ করা হয় যা FlowLimiterCalculator
দ্বারা সংজ্ঞায়িত রিয়েল-টাইম সীমাবদ্ধতা (সাধারণত কাস্টম ইনপুট নীতি ব্যবহার করে) অনুযায়ী প্যাকেট ড্রপ করতে পারে। উদাহরণস্বরূপ, একটি সাধারণ প্যাটার্ন একটি সাবগ্রাফের ইনপুটে একটি ফ্লো-কন্ট্রোল নোড রাখে, চূড়ান্ত আউটপুট থেকে ফ্লো-কন্ট্রোল নোডে লুপব্যাক সংযোগ সহ। এইভাবে ফ্লো-কন্ট্রোল নোড ডাউনস্ট্রিম গ্রাফে কতগুলি টাইমস্ট্যাম্প প্রক্রিয়া করা হচ্ছে তা ট্র্যাক রাখতে সক্ষম হয় এবং যদি এই সংখ্যাটি (কনফিগারযোগ্য) সীমাতে আঘাত করে তবে প্যাকেটগুলি ফেলে দেয়; এবং যেহেতু প্যাকেটগুলি উজানে ড্রপ করা হয়, তাই আমরা নষ্ট কাজ এড়িয়ে যাই যা আংশিকভাবে একটি টাইমস্ট্যাম্প প্রক্রিয়াকরণ এবং তারপর মধ্যবর্তী পর্যায়ের মধ্যে প্যাকেট ড্রপ করার ফলে হবে।
এই ক্যালকুলেটর-ভিত্তিক পদ্ধতি গ্রাফ লেখককে প্যাকেটগুলি কোথায় ফেলে দেওয়া যেতে পারে তার নিয়ন্ত্রণ দেয় এবং সম্পদের সীমাবদ্ধতার উপর নির্ভর করে গ্রাফের আচরণকে মানিয়ে নেওয়া এবং কাস্টমাইজ করার ক্ষেত্রে নমনীয়তার অনুমতি দেয়।