المزامنة

ميكانيكا الجدولة

تحدث معالجة البيانات في الرسم البياني MediaPipe داخل عقد المعالجة التي يتم تحديدها على أنها فئات فرعية من CalculatorBase. يقرر نظام الجدولة وقت تشغيل كل حاسبة.

يحتوي كل رسم بياني على قائمة انتظار برامج جدولة واحدة على الأقل. تحتوي كل قائمة انتظار لبرامج الجدولة على executor واحد بالضبط. يتم تعيين العُقد بشكل ثابت إلى قائمة انتظار (وبالتالي إلى منفذ تنفيذ). بشكل تلقائي، توجد قائمة انتظار واحدة، يكون منفّذها مجموعة سلاسل مع عدد من سلاسل التعليمات بناءً على إمكانات النظام.

لكل عقدة حالة جدولة، يمكن أن تكون غير جاهزة أو جاهزة أو قيد التشغيل. تحدّد دالة الاستعداد ما إذا كانت العقدة جاهزة للتشغيل. يتم استدعاء هذه الدالة عند إعداد الرسم البياني، كلما انتهت عقدة قيد التشغيل، وكلما تغيرت حالة إدخالات العقدة.

تعتمد دالة الجاهزية المستخدَمة على نوع العقدة. تُعرَف العُقدة التي لا تتضمّن إدخالات بمصدر البيانات باسم عقدة المصدر، وتكون العُقد المصدر جاهزة دائمًا للتشغيل، إلى أن تُعلم إطار العمل بأنّها لا تحتاج إلى إخراج المزيد من البيانات، وفي هذه المرحلة تكون مغلقة.

تكون العُقد غير المصدر جاهزة إذا كانت لها مدخلات لمعالجتها، وإذا كانت هذه المُدخلات تشكّل مجموعة إدخال صالحة وفقًا للشروط التي تحدّدها سياسة الإدخال للعقدة (المناقشة أدناه). تستخدم معظم العُقد سياسة الإدخال الافتراضية، لكن بعض العُقد تحدد سياسة مختلفة.

عندما تصبح العقدة جاهزة، تتم إضافة مهمة إلى قائمة انتظار نظام الجدولة المقابلة، وهي قائمة انتظار الأولوية. دالة الأولوية ثابتة حاليًا، وتأخذ في الاعتبار الخصائص الثابتة للعُقد وترتيبها الطوبولوجي داخل الرسم البياني. على سبيل المثال، تكون العُقد الأقرب إلى جانب الإخراج في الرسم البياني ذات أولوية أعلى، بينما تكون العُقد المصدر لها أدنى أولوية.

يتم تقديم كل قائمة انتظار بواسطة التنفيذ، وهو المسئول عن تشغيل المهمة بالفعل من خلال استدعاء رمز الآلة الحاسبة. يمكن توفير أدوات تنفيذ مختلفة وإعدادها، ويمكن استخدام هذا لتخصيص استخدام موارد التنفيذ، مثلاً عن طريق تشغيل عُقد معينة على سلاسل التعليمات ذات الأولوية الأقل.

مزامنة الطوابع الزمنية

تنفيذ الرسم البياني MediaPipe لامركزي: لا توجد ساعة عالمية، ويمكن للعقد المختلفة معالجة البيانات من طوابع زمنية مختلفة في نفس الوقت. وهذا يسمح بإنتاجية أعلى عبر المسارات.

ومع ذلك، فإن معلومات الوقت مهمة جدًا للعديد من مهام سير عمل التصورات. تحتاج العُقد التي تتلقى ساحات الإدخال المتعددة بشكل عام إلى تنسيقها بطريقة ما. على سبيل المثال، قد ينتج عن أداة رصد الأجسام قائمة بمستطيلات الحدود من إطار، وقد يتم إدخال هذه المعلومات في عقدة عرض، ومن المفترض أن تعالجها مع الإطار الأصلي.

ولذلك، تتمثل إحدى المسؤوليات الرئيسية لإطار عمل MediaPipe في توفير مزامنة المدخلات للعُقد. من حيث آلية إطار العمل، يتمثّل الدور الأساسي للطابع الزمني في العمل كمفتاح مزامنة.

بالإضافة إلى ذلك، تم تصميم MediaPipe لدعم العمليات الحتمية، وهو أمر مهم في العديد من السيناريوهات (الاختبار، والمحاكاة، والمعالجة المجمّعة، وما إلى ذلك)، مع السماح لمؤلفي الرسم البياني بالتخفيف من الحتمية عند الحاجة لاستيفاء القيود في الوقت الفعلي.

يكمن هدفا المزامنة والحتمية في العديد من خيارات التصميم. وعلى وجه التحديد، يجب أن ترتفع الطوابع الزمنية للحِزم التي يتم إرسالها إلى بث معيّن بشكل رتيب: وهذا ليس افتراضًا مفيدًا للعديد من العُقد فحسب، بل يعتمد عليه أيضًا منطق المزامنة. يكون لكل بث طابع زمني محدد، وهو أقل طابع زمني ممكن يتم السماح به لإضافة حزمة جديدة في البث. عند وصول حزمة ذات طابع زمني T، يتقدّم النطاق المرتبط تلقائيًا إلى T+1، ما يعكس المتطلبات الأحادية. ويتيح ذلك لإطار العمل التأكّد من عدم وصول المزيد من الحزم ذات الطابع الزمني الأقل من T.

سياسات الإدخال

يتم التعامل مع المزامنة محليًا في كل عقدة، باستخدام سياسة الإدخال التي تحدّدها العقدة.

توفّر سياسة الإدخال التلقائية التي تحدّدها DefaultInputStreamHandler مزامنة محددة للمدخلات مع الضمانات التالية:

  • إذا تم توفير حِزم ذات الطابع الزمني نفسه في عمليات بث إدخال متعددة، ستتم معالجتها دائمًا معًا بغض النظر عن ترتيب وصولها في الوقت الفعلي.

  • تتمّ معالجة مجموعات الإدخال بترتيب زمني تصاعدي تمامًا.

  • لا يتم تجاهل أي حِزم، وتكون المعالجة حتمية تمامًا.

  • وتصبح العقدة جاهزة لمعالجة البيانات في أقرب وقت ممكن وفقًا للضمانات المذكورة أعلاه.

لشرح آلية عملها، نحتاج إلى تقديم تعريف للطابع الزمني الثابت. نقول أنّه يتم ضبط الطابع الزمني في بث إذا كان أقل من حدّ الطابع الزمني. بمعنى آخر، يتم ضبط طابع زمني للبث بعد أن تكون حالة المدخلات عند هذا الطابع الزمني معروفة بشكل لا رجعة فيه: إما أن تكون هناك حزمة أو يكون هناك يقين بأنّ حزمة ذات هذا الطابع الزمني لن تصل.

يتم ضبط طابع زمني على مستوى عدة أحداث بث إذا تم ضبطه على كل بث منها. علاوة على ذلك، إذا تم تحديد طابع زمني، يعني ذلك أنّه تمّ أيضًا ضبط كل الطوابع الزمنية السابقة. وبالتالي، يمكن معالجة الطوابع الزمنية المستقرة بترتيب تصاعدي بشكل محدد.

وحسب هذا التعريف، تكون الآلة الحاسبة التي تستند إلى سياسة الإدخال التلقائية جاهزة إذا كان هناك طابع زمني ثابت في جميع مصادر الإدخال ويحتوي على حزمة في مصدر إدخال واحد على الأقل. توفّر سياسة الإدخال جميع الحزم المتاحة للطابع الزمني المستقر كمجموعة إدخال واحدة للآلة الحاسبة.

إحدى نتائج هذا السلوك الحتمي هي أنّه بالنسبة إلى العُقد التي تحتوي على عمليات بث إدخال متعددة، يمكن أن يكون هناك انتظار غير محدود نظريًا لضبط طابع زمني، ويمكن تخزين عدد غير محدود من الحزم مؤقتًا في الوقت الحالي. (يمكنك وضع عقدة ذات تدفقي إدخال، أحدهما يستمر في إرسال الحُزم بينما لا يرسل الآخر أي شيء ولا يتقدم إلى الحد.)

لذلك، نوفّر أيضًا سياسات إدخال مخصّصة: على سبيل المثال، تقسيم الإدخالات في مجموعات مزامنة مختلفة تحدّدها SyncSetInputStreamHandler، أو تجنُّب المزامنة تمامًا ومعالجة المُدخلات على الفور عند وصولها وفقًا لما هو محدّد في ImmediateInputStreamHandler.

التحكم في التدفق

هناك آليتان رئيسيتان للتحكم في التدفق. تُحدِّد آلية الضغط العكسي تنفيذ العُقد الرئيسية عندما تصل الحُزم المخزَّنة مؤقتًا في ساحة مشاركات إلى الحدّ الأقصى (القابل للضبط) الذي يتم تحديده من خلال CalculatorGraphConfig::max_queue_size. تحافظ هذه الآلية على سلوك حتمي، وتتضمن نظامًا لتجنب التوقف عن العمل الذي يخفف الحدود التي تم تكوينها عند الحاجة.

يتكوّن النظام الثاني من إدراج عُقد خاصة يمكنها إسقاط حِزم البيانات وفقًا لقيود الوقت الفعلي (عادةً باستخدام سياسات الإدخال المخصّصة) المحدّدة من خلال FlowLimiterCalculator. على سبيل المثال، يضع النمط الشائع عقدة التحكم في التدفق عند إدخال الرسم البياني الفرعي، مع اتصال استرجاع من الإخراج النهائي إلى عقدة التحكم في التدفق. وبالتالي، يمكن لعقدة التحكم في التدفق تتبُّع عدد الطوابع الزمنية التي تتم معالجتها في الرسم البياني لتدفق البيانات، وإفلات الحزم إذا وصلت إلى الحد الأقصى (القابل للإعداد). وبما أنّ الحزم يتم إسقاطها من البث، فإننا نتجنب العمل المهدر الذي قد ينتج عن المعالجة الجزئية للطابع الزمني ومن ثم إهمال الحزم بين المراحل المتوسطة.

يمنح هذا النهج القائم على الآلة الحاسبة لمؤلف الرسم البياني التحكم في مكان إسقاط الحزم، ويسمح بالمرونة في تكييف سلوك الرسم البياني وتخصيصه اعتمادًا على قيود الموارد.