مجموعة أدوات اختبار LiteRT Accelerator (ATS)

مجموعة اختبارات LiteRT Accelerator Test Suite (ATS) هي أداة شاملة تُستخدَم للتحقّق من صحة الوظائف وقياس أداء عمليات تنفيذ أدوات تسريع مخصّصة مدمَجة مع إطار عمل LiteRT.

نظرة عامة والوظائف الأساسية

الوظيفة الأساسية لأداة ATS هي تنفيذ نماذج تعلُّم الآلة المحدّدة مسبقًا على مسرّع مستهدف ومقارنة النتائج ببرنامج الخلفية العادي لوحدة المعالجة المركزية في LiteRT.

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

بيانات الاختبار (النماذج)

تستخدم مجموعة ATS مجموعة من .tflite النماذج المستخدَمة على نطاق واسع كبيانات اختبار. يتم إنشاء بيانات الإدخال بشكل عشوائي استنادًا إلى نوع البيانات ويمكن إدخالها حسب الحاجة.

الطُرز المضمّنة

يتم تلقائيًا تضمين النماذج التالية وتنزيلها للاختبار (قد تتغيّر):

  • hf_all_minilm_l6_v2
  • hf_mobilevit_small
  • qai_hub_midas
  • qai_hub_real_esrgan_x4plus
  • torchvision_mobilenet_v2
  • torchvision_resnet18
  • torchvision_squeezenet1_1
  • u2net_lite
  • whisper_tiny_decoder
  • whisper_tiny_encoder
  • yamnet
  • yolo11n

استرداد النموذج يدويًا

في حين يتم تنزيل النماذج تلقائيًا أثناء bazel run، يمكنك استرداد مجموعة النماذج بأكملها يدويًا باستخدام wget:

wget -p -O <target_file> https://storage.googleapis.com/litert/ats_models.tar.gz

تحديد مجموعة اختبارات ATS باستخدام Bazel

استخدِم ماكرو litert_define_ats Bazel لضبط وتحديد هدف اختبار ATS خاص بالمسرّع.

ينشئ الماكرو تلقائيًا هدفَين قابلَين للتنفيذ:

  1. اختبار JIT على الجهاز العادي (للتنفيذ والتحقّق)
  2. اختبار مخصّص لوضع "التجميع فقط" في AOT (للتجميع على الجهاز المضيف)

مثال litert_define_ats الاستخدام

يحدّد المثال مجموعة ATS باسم example_ats لمسرّع يحمل اسم الخلفية example:

# Emits aot-mode and jit-mode test targets, one for running compilation test on host
# and another for running JIT and inference on device
# These targets are named with their respective suffix attribute.
litert_define_ats(
    name = "example_ats",
    backend = "example",
    compile_only_suffix = "_aot",
    do_register = [
        "*mobilenet*",
    ],
    extra_flags = ["--limit=1"],
    jit_suffix = "",
)

التنفيذ

لتنفيذ الاختبار العادي المستهدَف لنظام التشغيل Android (الذي يتعامل مع جميع عمليات adb):

# Handles environment setup, and build + push of library and data dependencies to the device,
# executes the suite on the target.
bazel run -c opt --config=android_arm64 :example_ats

لتنفيذ اختبار تجميع AOT، اتّبِع الخطوات التالية:

# Handle environment setup, and builds library dependencies for host platform.
# Executes the ats compile only flow. The "--compile_mode" flag is already
# bound to the program arguments.
bazel run :example_ats_aot

تنفيذ Linux (المضيف)

لتنفيذ Linux، حيث يتم تشغيل ATS على الجهاز نفسه الذي يتم فيه الإنشاء، على المستخدمين استخدام ثنائي :ats مباشرةً:

bazel run -c opt :ats

تنفيذ إنترنت الأشياء

لتنفيذ عمليات إنترنت الأشياء، على المستخدمين إنشاء الرمز الثنائي على المضيف ونقله يدويًا إلى أجهزتهم.

علامات سطر الأوامر

يقبل الملف التنفيذي ats عدة علامات للتحكّم الدقيق في الاختبارات وإعداد التقارير.

علم النوع الوصف
--backend std::string مطلوبة تحديد نظام LiteRT الخلفي الذي سيتم استخدامه كمسرّع قيد الاختبار (النظام "الفعلي"). الخيارات هي cpu أو npu أو gpu.
--compile_mode bool إذا كانت القيمة صحيحة، يتم تنفيذ خطوة تجميع AOT على محطة العمل بدلاً من تنفيذها على الجهاز. ملاحظة: يتم ربط هذا الخيار تلقائيًا بهدف الإنشاء "aot" ولا يحتاج إلى ضبطه بشكل صريح.
--models_out std::string مسار الدليل الذي يتم فيه حفظ النماذج المتسلسلة (المجمّعة) ذات التأثيرات الجانبية. لا ينطبق ذلك إلا على التجميع المسبق أو التجميع أثناء التنفيذ.
--dispatch_dir std::string مسار الدليل الذي يحتوي على مكتبة الإرسال الخاصة بأداة التسريع (ذات صلة بوحدة المعالجة العصبية).
--plugin_dir std::string مسار الدليل الذي يحتوي على مكتبة المكوّن الإضافي لبرنامج تجميع أداة التسريع (ذو صلة بوحدة المعالجة العصبية).
--soc_manufacturer std::string الشركة المصنّعة لنظام التشغيل على الشريحة التي سيتم استهدافها لتجميع AOT (ذو صلة بتجميع وحدة المعالجة العصبية).
--soc_model std::string طراز نظام التشغيل على الشريحة الذي سيتم استهدافه لتجميع AOT (ذو صلة بالتجميع على وحدة المعالجة العصبية).
--iters_per_test size_t عدد التكرارات التي سيتم تنفيذها لكل اختبار، وكلّ منها يتضمّن بيانات موتر عشوائية مختلفة.
--max_ms_per_test int64_t الحد الأقصى للوقت بالمللي ثانية لتشغيل كل اختبار قبل انتهاء المهلة
--fail_on_timeout bool تحديد ما إذا كان يجب أن يتعذّر إجراء الاختبار إذا انتهت مهلة التنفيذ
--csv std::string مسار الملف لحفظ التقرير المفصّل بتنسيق CSV
--dump_report bool تحديد ما إذا كان سيتم عرض تفاصيل التقرير الكاملة مباشرةً في ناتج وحدة تحكّم المستخدم.
--data_seed std::optional<int> قيمة أولية واحدة لإنشاء البيانات العامة
--do_register std::vector<std::string> تعبيرات Regex لتضمين اختبارات معيّنة بشكل صريح (مثلاً: *mobilenet*).
--dont_register std::vector<std::string> تعبيرات regex لاستبعاد اختبارات معيّنة
--extra_models std::vector<std::string> قائمة اختيارية بالأدلة أو ملفات النماذج التي سيتم إضافتها إلى مجموعة الاختبار.
--limit int32_t تحديد الحدّ الأقصى لعدد الاختبارات المسجّلة والتي تم تنفيذها
--quiet bool تقليل ناتج التسجيل أثناء تنفيذ الاختبار

استخدام أدوات الإنشاء litert_device_script لنظام ATS

تستهدف أدوات ATS المستخدمين الذين يتم تنفيذهم تلقائيًا، وتتضمّن نقطة دخول shell تعالج جميع عمليات إعداد البيئة، وأي عمليات نقل للمكتبات المطلوبة عندما يختلف الجهاز المستهدف عن الجهاز المضيف الذي تم إكمال عملية الإنشاء عليه (مثل adb push).

يتم توفير هذه الوظيفة بشكل عام من خلال أدوات litert_device_script التي تستخدمها بنية ATS في الخلفية. هناك عملية تسجيل يجب أن تجريها برامج تسريع التطوير للوصول إلى وظيفة الإنشاء هذه. بالإضافة إلى إتاحة ats، يمكن استخدام هذه الأدوات بشكل مستقل لمحاكاة cc_binary وcc_test اللذين من المفترض تنفيذهما على جهاز مختلف عن مضيف الإصدار الذي يتطلّب إرسال التبعيات.

التسجيل في الخلفية

لتفعيل أداة تسريع جديدة لاستخدامها مع litert_device_script (وبالتالي ATS)، يجب تسجيل المكتبات المطلوبة في ملف litert_device_common.bzl Bazel. تستند عملية التسجيل إلى اسم"نظام خلفي" فريد يتم ربطه بمجموعة من المكتبات القابلة للإنشاء أو المجمّعة مسبقًا واللازمة لتشغيل LiteRT مع هذا المحسّن.

خطوات التسجيل

  1. تحديد دالة BackendSpec: أنشئ دالة تعرض قاموسًا يتضمّن مواصفات أداة التسريع الجديدة.

  2. تحديد المكتبات (libs): هذه قائمة بصفوف تتضمّن تفاصيل مسار عنصر Bazel الخاص بالمكتبة المشترَكة ومتغيّر البيئة (LD_LIBRARY_PATH) المطلوب لكي يعثر عليه الرابط على الجهاز.

    • مكتبة الإرسال: مطلوبة للتنفيذ في وقت التشغيل.
    • مكتبة المكوّنات الإضافية للمجمّع: مطلوبة لوضع التجميع المسبق (AOT).
  3. تحديد أسماء المكتبات (plugin وdispatch): أدخِل أسماء ملفات المكوّن الإضافي ومكتبات الإرسال.

  4. تسجيل المواصفات: ادمِج وظيفة المواصفات الجديدة في وظيفة _Specs الرئيسية لإتاحتها من خلال رقم التعريف الفريد للخادم الخلفي.

مثال على التسجيل (_ExampleSpec)

يوضّح الرمز التالي من litert_device_common.bzl كيفية تسجيل أداة تسريع "example":

def _ExampleSpec():
    return {
        # The unique backend ID
        "example": BackendSpec(
            id = "example",
            libs = [
                # Dispatch Library and how to find it on device
                ("//third_party/odml/litert/litert/vendors/examples:libLiteRtDispatch_Example.so", "LD_LIBRARY_PATH"),
                # Compiler Plugin Library
                ("//third_party/odml/litert/litert/vendors/examples:libLiteRtCompilerPlugin_Example.so", "LD_LIBRARY_PATH"),
            ],
            plugin = "libLiteRtCompilerPlugin_Example.so",
            dispatch = "libLiteRtDispatch_Example.so",
        ),
    }

# ... (Other specs are defined here)

def _Specs(name):
    # Your new spec function must be included here
    return (_QualcommSpec() | _GoogleTensorSpec() | _MediatekSpec() | _CpuSpec() | _GpuSpec() | _ExampleSpec())[name]

الاستفادة من ميزة التسجيل باستخدام litert_device_exec

بعد التسجيل، استخدِم litert_device_exec ووحدات الماكرو ذات الصلة مع backend_id الجديد. يجمع هذا الماكرو تلقائيًا المكتبات المطلوبة وأي ملفات بيانات محددة مع الملف الثنائي المستهدف.

cc_binary(
    name = "example_bin",
    srcs = ["example_bin.cc"],
)

litert_device_exec(
    name = "example_bin_device",
    backend_id = "example",  # Uses the libraries registered under "example"
    data = [
        "//third_party/odml/litert/litert/test:testdata/constant_output_tensor.tflite",
    ],
    target = ":example_bin",
)

سيؤدي تشغيل هذا الهدف (bazel run ... :example_bin_device) إلى:

  1. أنشئ ملف example_bin C++ الثنائي.
  2. أرسِل الملف الثنائي libLiteRtDispatch_Example.so والملف libLiteRtCompilerPlugin_Example.so والملف .tflite إلى الجهاز.
  3. نفِّذ الملف الثنائي باستخدام adb shell.

ملاحظة حول مسارات الأجهزة: يعكس الموقع الأساسي للملفات على الجهاز بنية ملفات التشغيل في Bazel، وتحديدًا /data/local/tmp/runfiles/runfiles_relative_path. يتولّى البرنامج النصي للجهاز تلقائيًا ضبط المسارات المناسبة للرابط الديناميكي.

وضع التجميع (AOT)

بالنسبة إلى أدوات التسريع التي تتضمّن خطوة الترجمة المسبقة (AOT)، يمكن تنفيذ ATS في "وضع الترجمة" مخصّص.

  • الغرض: تم تصميم هذا الوضع ليتم تشغيله على محطة عمل (الجهاز المضيف)، وليس على الجهاز المستهدف. ويجمع النماذج للأجهزة المستهدَفة المحدّدة بدون تنفيذها.
  • الناتج: يتم إخراج جميع النماذج التي تم تجميعها إلى دليل محدّد على محطة العمل.
  • التفعيل: ستُصدر وحدات الماكرو الخاصة بإنشاء ATS هدفًا محدّدًا لـ AOT حيث يتم إنشاء المكتبات للنظام الأساسي المضيف. يمكن تفعيل هذا المسار على أي برنامج ثنائي باستخدام العلامة --compile_mode، ولكن يتم ربطه تلقائيًا بوسيطات الإصدار المسبق.

مشاريع التوسّع المستقبلية

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