مجموعة اختبارات LiteRT Accelerator Test Suite (ATS) هي أداة شاملة تُستخدَم للتحقّق من صحة الوظائف وقياس أداء عمليات تنفيذ أدوات تسريع مخصّصة مدمَجة مع إطار عمل LiteRT.
نظرة عامة والوظائف الأساسية
الوظيفة الأساسية لأداة ATS هي تنفيذ نماذج تعلُّم الآلة المحدّدة مسبقًا على مسرّع مستهدف ومقارنة النتائج ببرنامج الخلفية العادي لوحدة المعالجة المركزية في LiteRT.
- التحقّق من الصحة: تجري الحزمة التحقّق من الصحة الرقمية من خلال مقارنة موترات الإخراج (عمليات التنشيط) التي تنتجها أداة التسريع بتلك التي ينتجها البرنامج الخلفي لوحدة المعالجة المركزية المعروفة بأنّها تعمل بشكل جيد. ويضمن ذلك أنّ عملية تنفيذ أداة التسريع تحافظ على الدقة والصحة المطلوبتَين.
- مقاييس الأداء: يتم تلقائيًا تسجيل تفاصيل الأداء المهمة، بما في ذلك وقت الاستجابة والمقاييس الأخرى ذات الصلة، وإتاحتها للمستخدم.
- التنفيذ: يتم عادةً تنفيذ الاختبارات على جهاز مستهدف (مثل هاتف Android)، ويتم إدارتها من خلال برنامج تضمين نص برمجي shell يتولى عمليات نقل الملفات والإعداد باستخدام أداة
adb(Android Debug Bridge).
بيانات الاختبار (النماذج)
تستخدم مجموعة ATS مجموعة من .tflite النماذج المستخدَمة على نطاق واسع كبيانات اختبار. يتم إنشاء بيانات الإدخال بشكل عشوائي استنادًا إلى نوع البيانات ويمكن إدخالها حسب الحاجة.
الطُرز المضمّنة
يتم تلقائيًا تضمين النماذج التالية وتنزيلها للاختبار (قد تتغيّر):
hf_all_minilm_l6_v2hf_mobilevit_smallqai_hub_midasqai_hub_real_esrgan_x4plustorchvision_mobilenet_v2torchvision_resnet18torchvision_squeezenet1_1u2net_litewhisper_tiny_decoderwhisper_tiny_encoderyamnetyolo11n
استرداد النموذج يدويًا
في حين يتم تنزيل النماذج تلقائيًا أثناء bazel run، يمكنك استرداد مجموعة النماذج بأكملها يدويًا باستخدام wget:
wget -p -O <target_file> https://storage.googleapis.com/litert/ats_models.tar.gz
تحديد مجموعة اختبارات ATS باستخدام Bazel
استخدِم ماكرو litert_define_ats Bazel لضبط وتحديد هدف اختبار ATS خاص بالمسرّع.
ينشئ الماكرو تلقائيًا هدفَين قابلَين للتنفيذ:
- اختبار JIT على الجهاز العادي (للتنفيذ والتحقّق)
- اختبار مخصّص لوضع "التجميع فقط" في 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 مع هذا المحسّن.
خطوات التسجيل
تحديد دالة
BackendSpec: أنشئ دالة تعرض قاموسًا يتضمّن مواصفات أداة التسريع الجديدة.تحديد المكتبات (
libs): هذه قائمة بصفوف تتضمّن تفاصيل مسار عنصر Bazel الخاص بالمكتبة المشترَكة ومتغيّر البيئة (LD_LIBRARY_PATH) المطلوب لكي يعثر عليه الرابط على الجهاز.- مكتبة الإرسال: مطلوبة للتنفيذ في وقت التشغيل.
- مكتبة المكوّنات الإضافية للمجمّع: مطلوبة لوضع التجميع المسبق (AOT).
تحديد أسماء المكتبات (
pluginوdispatch): أدخِل أسماء ملفات المكوّن الإضافي ومكتبات الإرسال.تسجيل المواصفات: ادمِج وظيفة المواصفات الجديدة في وظيفة
_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) إلى:
- أنشئ ملف
example_binC++ الثنائي. - أرسِل الملف الثنائي
libLiteRtDispatch_Example.soوالملفlibLiteRtCompilerPlugin_Example.soوالملف.tfliteإلى الجهاز. - نفِّذ الملف الثنائي باستخدام
adb shell.
ملاحظة حول مسارات الأجهزة: يعكس الموقع الأساسي للملفات على الجهاز بنية ملفات التشغيل في Bazel، وتحديدًا
/data/local/tmp/runfiles/runfiles_relative_path. يتولّى البرنامج النصي للجهاز تلقائيًا ضبط المسارات المناسبة للرابط الديناميكي.
وضع التجميع (AOT)
بالنسبة إلى أدوات التسريع التي تتضمّن خطوة الترجمة المسبقة (AOT)، يمكن تنفيذ ATS في "وضع الترجمة" مخصّص.
- الغرض: تم تصميم هذا الوضع ليتم تشغيله على محطة عمل (الجهاز المضيف)، وليس على الجهاز المستهدف. ويجمع النماذج للأجهزة المستهدَفة المحدّدة بدون تنفيذها.
- الناتج: يتم إخراج جميع النماذج التي تم تجميعها إلى دليل محدّد على محطة العمل.
- التفعيل: ستُصدر وحدات الماكرو الخاصة بإنشاء ATS هدفًا محدّدًا لـ AOT
حيث يتم إنشاء المكتبات للنظام الأساسي المضيف. يمكن تفعيل هذا المسار على أي برنامج ثنائي باستخدام العلامة
--compile_mode، ولكن يتم ربطه تلقائيًا بوسيطات الإصدار المسبق.
مشاريع التوسّع المستقبلية
من المخطّط توسيع هذه الحزمة لتشمل اختبارات مخصّصة للعمليات الفردية، بالإضافة إلى النماذج الكاملة.