اندازه گیری عملکرد

ابزارهای بنچمارک

ابزارهای بنچمارک LiteRT در حال حاضر آمار مربوط به معیارهای عملکرد مهم زیر را اندازه‌گیری و محاسبه می‌کنند:

  • زمان اولیه سازی
  • زمان استنتاج حالت گرم شدن
  • زمان استنتاج حالت پایدار
  • استفاده از حافظه در زمان مقداردهی اولیه
  • استفاده کلی از حافظه

ابزارهای بنچمارک به صورت برنامه‌های بنچمارک برای اندروید و iOS و همچنین به صورت فایل‌های باینری خط فرمان از پیش ساخته شده در دسترس هستند و همه آنها منطق اندازه‌گیری عملکرد اصلی یکسانی را به اشتراک می‌گذارند. توجه داشته باشید که گزینه‌های موجود و فرمت‌های خروجی به دلیل تفاوت در محیط زمان اجرا، کمی متفاوت هستند.

باینری معیار از پیش ساخته شده (با استفاده از CompiledModel API)

دو گزینه برای استفاده از ابزار بنچمارک با اندروید وجود دارد. یکی یک فایل باینری بنچمارک بومی (مبتنی بر CompiledModel API) و دیگری یک برنامه بنچمارک اندروید (مبتنی بر Interpreter API) است. ابزار LiteRT Benchmark به عنوان یک benchmark_model باینری داخلی ارائه شده است. می‌توانید این ابزار را از طریق خط فرمان shell در لینوکس، macOS، ویندوز، Raspberry Pi، دستگاه‌های تعبیه‌شده و دستگاه‌های اندروید با شتاب‌دهنده GPU فعال اجرا کنید.

فایل باینری را دانلود یا بسازید

با دنبال کردن لینک‌های زیر، فایل‌های باینری خط فرمان از پیش ساخته شده nightly را دانلود کنید:

همچنین می‌توانید فایل باینری معیار را از منبع روی رایانه خود بسازید.

bazel build -c opt //litert/tools:benchmark_model

برای ساخت با استفاده از ابزار Android NDK، ابتدا باید محیط ساخت را با دنبال کردن این راهنما تنظیم کنید، یا از تصویر داکر همانطور که در این راهنما توضیح داده شده است استفاده کنید.

bazel build -c opt --config=android_arm64 \
  //litert/tools:benchmark_model

اجرای بنچمارک

برای اجرای بنچمارک‌ها روی رایانه خود، فایل باینری را از طریق shell اجرا کنید.

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

شما می‌توانید از همان مجموعه پارامترهایی که قبلاً ذکر شد، با فایل باینری خط فرمان از پیش ساخته شده استفاده کنید.

شتاب‌دهنده پردازنده گرافیکی

این فایل‌های باینری از پیش ساخته شده شامل شتاب‌دهنده گرافیکی جدید LiteRT است که از OpenCL و WebGPU پشتیبانی شده توسط Vulkan (لینوکس)، Metal (مک او اس) و Direct3D (ویندوز) پشتیبانی می‌کند.

برای استفاده از شتاب‌دهنده‌ی پردازنده‌ی گرافیکی (GPU Accelerator)، از پرچم --use_gpu=true استفاده کنید.

گزینه‌های مدل پروفایل

فایل باینری مدل معیار همچنین به شما امکان می‌دهد عملیات مدل را پروفایل کنید و زمان اجرای هر عملگر را دریافت کنید. برای انجام این کار، در هنگام فراخوانی، پرچم --use_profiler=true را به benchmark_model ارسال کنید.

برنامه بنچمارک اندروید (با استفاده از API مفسر)

یک برنامه‌ی بنچمارک اندروید مبتنی بر API مفسر نسخه ۱ نیز ارائه شده است. این ابزار، معیار بهتری برای سنجش عملکرد مدل در یک برنامه‌ی اندروید است. اعداد حاصل از ابزار بنچمارک، همچنان کمی با اعداد حاصل از اجرای استنتاج با مدل در برنامه‌ی واقعی متفاوت خواهند بود.

این برنامه بنچمارک اندروید هیچ رابط کاربری ندارد. آن را با استفاده از دستور adb نصب و اجرا کنید و با استفاده از دستور adb logcat نتایج را بازیابی کنید.

برنامه را دانلود یا بسازید

برنامه‌های بنچمارک اندروید از پیش ساخته شده Nightly را با استفاده از لینک‌های زیر دانلود کنید:

برای برنامه‌های بنچمارک اندروید که از عملیات TF از طریق Flex delegate پشتیبانی می‌کنند، از لینک‌های زیر استفاده کنید:

همچنین می‌توانید با دنبال کردن این دستورالعمل‌ها، برنامه را از منبع (source) بسازید.

تهیه بنچمارک

قبل از اجرای برنامه بنچمارک، برنامه را نصب کنید و فایل مدل را به صورت زیر به دستگاه منتقل کنید:

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

اجرای بنچمارک

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

graph یک پارامتر الزامی است.

  • graph : string
    مسیر فایل مدل TFLite.

شما می‌توانید پارامترهای اختیاری بیشتری را برای اجرای بنچمارک مشخص کنید.

  • num_threads : int (پیش‌فرض=۱)
    تعداد نخ‌هایی که برای اجرای مفسر TFLite استفاده می‌شوند.
  • use_gpu : bool پیش‌فرض (bool)
    از نماینده GPU استفاده کنید.
  • use_xnnpack : bool (پیش‌فرض = false )
    از نماینده XNNPACK استفاده کنید.

بسته به دستگاهی که استفاده می‌کنید، ممکن است برخی از این گزینه‌ها در دسترس نباشند یا هیچ تاثیری نداشته باشند. برای پارامترهای عملکردی بیشتری که می‌توانید با برنامه بنچمارک اجرا کنید، به پارامترها مراجعه کنید.

نتایج را با استفاده از دستور logcat مشاهده کنید:

adb logcat | grep "Inference timings"

نتایج بنچمارک به شرح زیر گزارش شده است:

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

برنامه بنچمارک iOS

برای اجرای بنچمارک‌ها روی دستگاه iOS، باید برنامه را از منبع بسازید. فایل مدل LiteRT را در دایرکتوری benchmark_data از درخت منبع قرار دهید و فایل benchmark_params.json را تغییر دهید. این فایل‌ها در برنامه بسته‌بندی می‌شوند و برنامه داده‌ها را از دایرکتوری می‌خواند. برای دستورالعمل‌های دقیق، به برنامه بنچمارک iOS مراجعه کنید.

معیارهای عملکرد برای مدل‌های شناخته‌شده

این بخش، معیارهای عملکرد LiteRT را هنگام اجرای مدل‌های شناخته‌شده در برخی از دستگاه‌های اندروید و iOS فهرست می‌کند.

بنچمارک‌های عملکرد اندروید

این اعداد معیار عملکرد با استفاده از فایل باینری معیار بومی تولید شده‌اند.

برای بنچمارک‌های اندروید، میزان وابستگی پردازنده به گونه‌ای تنظیم شده است که از هسته‌های بزرگ روی دستگاه استفاده کند تا واریانس کاهش یابد ( جزئیات را ببینید).

فرض بر این است که مدل‌ها دانلود و در دایرکتوری /data/local/tmp/tflite_models از حالت فشرده خارج شده‌اند. فایل باینری معیار با استفاده از این دستورالعمل‌ها ساخته شده و فرض بر این است که در دایرکتوری /data/local/tmp قرار دارد.

برای اجرای بنچمارک:

adb shell /data/local/tmp/benchmark_model \
  --num_threads=4 \
  --graph=/data/local/tmp/tflite_models/${GRAPH} \
  --warmup_runs=1 \
  --num_runs=50

برای اجرا با نماینده GPU، --use_gpu=true را تنظیم کنید.

مقادیر عملکرد زیر در اندروید ۱۰ اندازه‌گیری شده‌اند.

نام مدل دستگاه پردازنده، ۴ رشته پردازنده گرافیکی
Mobilenet_1.0_224 (شناور) پیکسل ۳ ۲۳.۹ میلی‌ثانیه ۶.۴۵ میلی‌ثانیه
پیکسل ۴ ۱۴.۰ میلی‌ثانیه ۹.۰ میلی‌ثانیه
Mobilenet_1.0_224 (کمی) پیکسل ۳ ۱۳.۴ میلی‌ثانیه ---
پیکسل ۴ ۵.۰ میلی‌ثانیه ---
موبایل NASNet پیکسل ۳ ۵۶ میلی‌ثانیه ---
پیکسل ۴ ۳۴.۵ میلی‌ثانیه ---
اسکوئیزنت پیکسل ۳ ۳۵.۸ میلی‌ثانیه ۹.۵ میلی‌ثانیه
پیکسل ۴ ۲۳.۹ میلی‌ثانیه ۱۱.۱ میلی‌ثانیه
Inception_ResNet_V2 پیکسل ۳ ۴۲۲ میلی‌ثانیه ۹۹.۸ میلی‌ثانیه
پیکسل ۴ ۲۷۲.۶ میلی‌ثانیه ۸۷.۲ میلی‌ثانیه
اینسپشن_وی۴ پیکسل ۳ ۴۸۶ میلی‌ثانیه ۹۳ میلی‌ثانیه
پیکسل ۴ ۳۲۴.۱ میلی‌ثانیه ۹۷.۶ میلی‌ثانیه

بنچمارک‌های عملکرد iOS

این اعداد بنچمارک عملکرد با برنامه بنچمارک iOS تولید شده‌اند.

برای اجرای بنچمارک‌های iOS، برنامه بنچمارک اصلاح شد تا مدل مناسب را در بر بگیرد و benchmark_params.json طوری اصلاح شد که num_threads روی ۲ تنظیم کند. برای استفاده از نماینده GPU، گزینه‌های "use_gpu" : "1" و "gpu_wait_type" : "aggressive" نیز به benchmark_params.json اضافه شدند.

نام مدل دستگاه پردازنده، ۲ رشته پردازشی پردازنده گرافیکی
Mobilenet_1.0_224 (شناور) آیفون ایکس اس ۱۴.۸ میلی‌ثانیه ۳.۴ میلی‌ثانیه
Mobilenet_1.0_224 (کمی) آیفون ایکس اس ۱۱ میلی‌ثانیه ---
موبایل NASNet آیفون ایکس اس ۳۰.۴ میلی‌ثانیه ---
اسکوئیزنت آیفون ایکس اس ۲۱.۱ میلی‌ثانیه ۱۵.۵ میلی‌ثانیه
Inception_ResNet_V2 آیفون ایکس اس ۲۶۱.۱ میلی‌ثانیه ۴۵.۷ میلی‌ثانیه
اینسپشن_وی۴ آیفون ایکس اس ۳۰۹ میلی‌ثانیه ۵۴.۴ میلی‌ثانیه

قطعات داخلی Trace LiteRT

ردیابی داخلی LiteRT در اندروید

رویدادهای داخلی از مفسر LiteRT یک برنامه اندروید می‌توانند توسط ابزارهای ردیابی اندروید ثبت شوند. این رویدادها همان رویدادهایی هستند که در Android Trace API نیز وجود دارند، بنابراین رویدادهای ثبت شده از کد جاوا/کاتلین همراه با رویدادهای داخلی LiteRT مشاهده می‌شوند.

چند نمونه از رویدادها عبارتند از:

  • فراخوانی عملگر
  • اصلاح گراف توسط نماینده
  • تخصیص تانسوری

در میان گزینه‌های مختلف برای ثبت ردپاها، این راهنما به Android Studio CPU Profiler و برنامه System Tracing می‌پردازد. برای گزینه‌های دیگر به ابزار خط فرمان Perfetto یا ابزار خط فرمان Systrace مراجعه کنید.

افزودن رویدادهای ردیابی در کد جاوا

این یک قطعه کد از برنامه نمونه طبقه‌بندی تصویر است. مفسر LiteRT در بخش recognizeImage/runInference اجرا می‌شود. این مرحله اختیاری است، اما برای کمک به تشخیص محل فراخوانی استنتاج مفید است.

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

فعال کردن ردیابی LiteRT

برای فعال کردن ردیابی LiteRT، قبل از شروع برنامه اندروید، ویژگی سیستمی اندروید debug.tflite.trace روی ۱ تنظیم کنید.

adb shell setprop debug.tflite.trace 1

اگر این ویژگی هنگام مقداردهی اولیه مفسر LiteRT تنظیم شده باشد، رویدادهای کلیدی (مثلاً فراخوانی عملگر) از مفسر ردیابی می‌شوند.

پس از اینکه تمام ردپاها را ثبت کردید، با تنظیم مقدار ویژگی روی ۰، ردیابی را غیرفعال کنید.

adb shell setprop debug.tflite.trace 0

ابزار پروفایل پردازنده اندروید استودیو

با دنبال کردن مراحل زیر، ردپاها را با استفاده از Android Studio CPU Profiler ضبط کنید:

  1. از منوی بالا، گزینه‌ی «اجرا» > «برنامه‌ی پروفایل» را انتخاب کنید.

  2. وقتی پنجره Profiler ظاهر شد، روی هر قسمتی از جدول زمانی CPU کلیک کنید.

  3. از بین حالت‌های پروفایلینگ CPU، گزینه «ردیابی تماس‌های سیستمی» را انتخاب کنید.

    «ردیابی تماس‌های سیستمی» را انتخاب کنید

  4. دکمه «ضبط» را فشار دهید.

  5. دکمه «توقف» را فشار دهید.

  6. نتیجه ردیابی را بررسی کنید.

    ردیابی اندروید استودیو

در این مثال، می‌توانید سلسله مراتب رویدادها در یک نخ و آمار مربوط به هر زمان اپراتور و همچنین جریان داده کل برنامه را بین نخ‌ها مشاهده کنید.

برنامه ردیابی سیستم

با دنبال کردن مراحل شرح داده شده در برنامه System Tracing، بدون نیاز به اندروید استودیو، ردپاها را ثبت کنید.

در این مثال، رویدادهای TFLite یکسانی ضبط و بسته به نسخه دستگاه اندروید، با فرمت Perfetto یا Systrace ذخیره شدند. فایل‌های ردیابی ضبط‌شده را می‌توان در رابط کاربری Perfetto باز کرد.

ردیابی کامل

ردیابی داخلی LiteRT در iOS

رویدادهای داخلی از مفسر LiteRT یک برنامه iOS را می‌توان توسط ابزار Instruments که در Xcode موجود است، ثبت کرد. این رویدادها، رویدادهای راهنمای iOS هستند، بنابراین رویدادهای ثبت شده از کد Swift/Objective-C همراه با رویدادهای داخلی LiteRT دیده می‌شوند.

چند نمونه از رویدادها عبارتند از:

  • فراخوانی عملگر
  • اصلاح گراف توسط نماینده
  • تخصیص تانسوری

فعال کردن ردیابی LiteRT

متغیر محیطی debug.tflite.trace با دنبال کردن مراحل زیر تنظیم کنید:

  1. از منوی بالای Xcode، مسیر Product > Scheme > Edit Scheme... را انتخاب کنید.

  2. در پنل سمت چپ، روی «پروفایل» کلیک کنید.

  3. کادر انتخاب «استفاده از آرگومان‌ها و متغیرهای محیطیِ اجرای عملیات» را از حالت انتخاب خارج کنید.

  4. debug.tflite.trace در بخش «متغیرهای محیطی» اضافه کنید.

    متغیر محیطی را تنظیم کنید

اگر می‌خواهید رویدادهای LiteRT را هنگام پروفایل کردن برنامه iOS حذف کنید، ردیابی را با حذف متغیر محیطی غیرفعال کنید.

ابزارهای XCode

با دنبال کردن مراحل زیر، ردپاها را ثبت کنید:

  1. از منوی بالای Xcode، گزینه Product > Profile را انتخاب کنید.

  2. هنگام اجرای ابزار Instruments، از میان قالب‌های پروفایلینگ ، روی Logging کلیک کنید.

  3. دکمه «شروع» را فشار دهید.

  4. دکمه «توقف» را فشار دهید.

  5. برای گسترش موارد زیرسیستم ثبت وقایع سیستم عامل، روی «os_signpost» کلیک کنید.

  6. روی زیرسیستم ثبت وقایع سیستم عامل «org.tensorflow.lite» کلیک کنید.

  7. نتیجه ردیابی را بررسی کنید.

    ردیابی ابزارهای Xcode

در این مثال، می‌توانید سلسله مراتب رویدادها و آمار را برای هر زمان اپراتور مشاهده کنید.

استفاده از داده‌های ردیابی

داده‌های ردیابی به شما امکان می‌دهد تنگناهای عملکرد را شناسایی کنید.

در اینجا چند نمونه از بینش‌هایی که می‌توانید از پروفایلر و راه‌حل‌های بالقوه برای بهبود عملکرد دریافت کنید، آورده شده است:

  • اگر تعداد هسته‌های CPU موجود کمتر از تعداد رشته‌های استنتاج باشد، سربار زمان‌بندی CPU می‌تواند منجر به عملکرد پایین‌تر از حد متوسط ​​شود. می‌توانید سایر وظایف فشرده CPU را در برنامه خود مجدداً زمان‌بندی کنید تا از همپوشانی با استنتاج مدل خود جلوگیری کنید یا تعداد رشته‌های مفسر را تنظیم کنید.
  • اگر عملگرها به طور کامل واگذار نشده باشند، برخی از بخش‌های نمودار مدل به جای شتاب‌دهنده سخت‌افزاری مورد انتظار، روی CPU اجرا می‌شوند. می‌توانید عملگرهای پشتیبانی نشده را با عملگرهای پشتیبانی شده مشابه جایگزین کنید.