استنتاج النوع

تم بدء تشغيل StableHLO في الأصل من لهجة MHLO، وقد ورثت تنفيذ MHLO للاستنتاج النوعي. يتم تتبّع مستوى تقدّم التنفيذ في status.md.

تهدف الإرشادات المقترحة أدناه إلى ضمان تنفيذ أدوات التحقق عالية الجودة وتشكيل وظائف لعمليات StableHLO.

الاقتراح

وتنطبق هذه الاقتراحات على كلّ من إعادة النظر في عمليات التنفيذ الحالية وتحقيق عمليات جديدة حتى تتم تغطية شاملة.

(P1) استخدام مواصفات StableHLO كمصدر للحقيقة

spec هي مصدر الحقيقة لجميع أدوات التحقق وتشكل وظائف عمليات StableHLO. ويجب إعادة النظر في أدوات التحقق الحالية ووظائف الشكل لكل عملية تشغيل لكي تتماشى تمامًا مع المواصفات. لاحظ أن وثيقة المواصفات تتطور باستمرار. في الحالات التي لا تتوفّر فيها مواصفات إحدى عمليات التشغيل، يجب استخدام تنفيذ XLA كمصدر للحقيقة بدلاً من ذلك، بما في ذلك xla/service/shape_inference.cc وxla/service/hlo_verifier.cc. لا يغطي تنفيذ XLA الديناميكية غير المحدودة، لذا بالنسبة إلى الديناميكية غير المحدودة، سنطبق المنطق السليم حتى يتوفر RFC الديناميكي.

(مستوى الأولوية P2) الاستفادة إلى أقصى حدّ من قانون الخدمات الرقمية

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

هل نحتاج إلى إضافة اختبارات للقيود من نظام ODS؟ يُرجى الاطّلاع على وضع إرشادات متعلقة بالاختبار.

(P3) الاحتفاظ برمز التحقق في أدوات التحقق وتشكيل الوظائف

كلاهما:

  • أدوات التحقُّق: يتم تنفيذها بواسطة Op::verify()
  • دوال الشكل: يتم تنفيذها بواسطة InferTypeOpInterface مثل Op::inferReturnTypes() أو Op::inferReturnTypeComponents

على رمز تحقّق للتحقّق من المعاملات/السمات/النتائج. قد يكون التقسيم الأولي كما يلي: دع أدوات التحقق تتحقق من المعاملات/السمات، ثم اترك دوال الشكل تحسب أنواع النتائج المستنتَجة فقط وتتحقق من التوافق في مقابل أنواع النتائج الحقيقية. ومع ذلك، في الواقع، يحتوي هذا التقسيم على بعض المشكلات:

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

يكون الحل على النحو التالي:

  1. بالنسبة إلى معظم العمليات التي لا تحتوي على مناطق (مثل PadOp): جرِّب وضع رمز التحقّق بالكامل في دوال الشكل، وتجاهل أدوات التحقق تمامًا. في الحالات التي لاReshapeOpBroadcastInDimOp قد تحتاج العمليات التي يمكن استنتاجها عادةً، مثل AddOp، إلى أداة تحقّق لإجراء عمليات تحقّق إضافية، لأنّها تتحقّق من قيود نوع الإرجاع المقدَّم، والتي لا يمكن الوصول إليها من خلال طرق استنتاج النوع أو الشكل.

  2. بالنسبة إلى العمليات ذات المناطق (مثل ReduceOp/IfOp، والقائمة الكاملة متوفّرة هنا): لا تستخدم منصات الإنشاء تلقائيًا المناطق كمعلَمات، ومن ثم إذا كانت منصات الإنشاء هذه تتضمن استنتاجًا من النوع، سيتم استدعاء دالة الشكل بمناطق فارغة (راجع هذا المثال).

    1. إذا لم تكن المناطق مطلوبة لاستنتاج النوع (مثل ReduceOp)، ضَع منطق إثبات الملكية المرتبط بالمنطقة في أدوات التحقّق بدلاً من دوال الشكل. يمكنك تكرار بعض الرموز إذا كان لا مفرّ منه.

    2. إذا كانت المناطق مطلوبة لاستنتاج النوع (IfOp/CaseOp/MapOp)، يجب أيضًا أن تتحقّق دالة الشكل من أنّ المناطق ليست فارغة بشكلٍ صريح، على الرغم من أنّ نظام ODS قد يضمن وجودها في تعريف Op.

(مستوى الأولوية P4) وضع إرشادات الاختبار

هل نحتاج إلى إضافة/إجراء اختبارات لعمليات التحقّق المشمولة ببنود ODS؟

نحن لا نفعل ذلك. يجب أن تركز الاختبارات على أدوات التحقق ووظائف الشكل، في حين أن التغييرات على ODS تحتاج إلى إعادة زيارة هذه العملية.

لكن كن حذرًا بشأن الأجزاء المفقودة: على سبيل المثال، إذا كانت العملية تحتوي على السمة SameOperandsAndResultShape، التي تتحقق فقط من الأشكال وليس نوع العنصر، فإن التحقق من أنواع العناصر من المعاملات/النتائج لا يزال بحاجة إلى اختبارات.

أين يمكن إجراء اختبارات لأدوات التحقّق والاستدلال على الكتابة؟

يحتوي ops_stablehlo.mlir على الحالات الإيجابية للعمليات، واختبار سلبي واحد (على الأقل) لكل خطأ في عملية التحقّق. يمكنها أيضًا التحقق من أن نوع العرض الذي تم استنتاجه متوافق مع نوع النتيجة الحقيقي (وليس تمامًا مثل!).

يتأكد infer_stablehlo.mlir من توفُّر دالة الشكل لنتيجة عملية بسطر تلو الآخر باستخدام hlo_test_infer.get_return_type_components"(%x):... وتتحقّق من تطابق النوع المستنتج تمامًا كما هو متوقع. نتيجة اختبار إيجابية واحدة لكل عملية بشكل عام.

ما يجب فعله

عند تنفيذ أو إعادة زيارة أداة التحقق و/أو تشكيل وظيفة إحدى العمليات:

  1. ضع جميع الحالات الإيجابية والسلبية في ops_stablehlo.mlir.

  2. أضِف اختبارًا إيجابيًا واحدًا في infer_stablehlo.mlir لاختبار الواجهة.

  3. (اختياري) إذا كانت العملية معقدة ويمكن أن تحتوي على الكثير من الاختبارات، ننصحك بإضافة ملف اختبار منفصل باسم verify_<op_name>.mlir أو verify_<your_topic>.mlir ضمن المجلد نفسه.