LiteRT Accelerator Test Suite (ATS) adalah alat komprehensif yang digunakan untuk memvalidasi kebenaran fungsional dan mengukur performa implementasi akselerator kustom yang terintegrasi dengan framework LiteRT.
Ringkasan dan Fungsi Inti
Fungsi utama ATS adalah menjalankan model machine learning yang telah ditentukan sebelumnya terhadap akselerator target dan membandingkan hasilnya dengan backend CPU standar LiteRT.
- Validasi: Suite ini melakukan validasi numerik dengan membandingkan tensor output (aktivasi) yang dihasilkan oleh akselerator dengan tensor yang dihasilkan oleh backend CPU yang berfungsi dengan baik. Hal ini memastikan penerapan akselerator mempertahankan presisi dan kebenaran yang diperlukan.
- Metrik Performa: Metrik ini otomatis mengambil dan merekam detail performa penting, termasuk latensi dan metrik relevan lainnya, yang tersedia bagi pengguna.
- Eksekusi: Pengujian biasanya dijalankan di perangkat target (misalnya, ponsel Android) dan dikelola oleh wrapper skrip shell yang menangani transfer file dan penyiapan menggunakan alat
adb(Android Debug Bridge).
Data Pengujian (Model)
Rangkaian ATS menggunakan kumpulan model .tflite yang banyak digunakan sebagai data pengujiannya. Data input dibuat secara acak berdasarkan jenis data dan dapat di-seed
sesuai kebutuhan.
Model yang Disertakan
Model berikut disertakan dan didownload secara otomatis untuk pengujian (dapat berubah):
hf_all_minilm_l6_v2hf_mobilevit_smallqai_hub_midasqai_hub_real_esrgan_x4plustorchvision_mobilenet_v2torchvision_resnet18torchvision_squeezenet1_1u2net_litewhisper_tiny_decoderwhisper_tiny_encoderyamnetyolo11n
Pengambilan Model Manual
Meskipun model didownload secara otomatis selama bazel run, Anda dapat mengambil seluruh set model secara manual menggunakan wget:
wget -p -O <target_file> https://storage.googleapis.com/litert/ats_models.tar.gz
Menentukan Kumpulan ATS dengan Bazel
Gunakan makro Bazel litert_define_ats untuk mengonfigurasi dan menentukan target pengujian ATS khusus untuk akselerator mereka.
Makro akan otomatis membuat dua target yang dapat dijalankan:
- Pengujian JIT di perangkat standar (untuk eksekusi dan validasi).
- Pengujian mode AOT "compile only" khusus (untuk kompilasi host).
Contoh Penggunaan litert_define_ats
Contoh ini menentukan rangkaian ATS bernama
example_ats
untuk akselerator dengan nama backend 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 = "",
)
Eksekusi
Untuk menjalankan pengujian standar yang ditujukan untuk Android (yang menangani semua operasi 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
Untuk menjalankan pengujian kompilasi 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
Eksekusi Linux (Host)
Untuk eksekusi Linux, jika ATS dijalankan di mesin yang sama yang melakukan build, pengguna harus menggunakan biner :ats secara langsung:
bazel run -c opt :ats
Eksekusi IoT
Untuk eksekusi IoT, pengguna harus membuat biner di host dan mendorongnya ke perangkat secara manual.
Tanda Command Line
Dapat dieksekusi ats menerima beberapa tanda untuk kontrol terperinci atas pengujian dan
pelaporan.
| Bendera | Jenis | Deskripsi |
|---|---|---|
--backend |
std::string |
Wajib. Backend LiteRT mana yang akan digunakan sebagai akselerator dalam pengujian (yang "sebenarnya"). Opsinya adalah cpu, npu, atau gpu. |
--compile_mode |
bool |
Jika benar (true), menjalankan langkah kompilasi AOT di workstation, bukan eksekusi di perangkat. CATATAN: opsi ini otomatis terikat ke target build "aot" dan tidak perlu ditetapkan secara eksplisit. |
--models_out |
std::string |
Jalur direktori tempat model serial (dikompilasi) efek samping disimpan. Hanya relevan untuk kompilasi AOT atau JIT. |
--dispatch_dir |
std::string |
Jalur ke direktori yang berisi library pengiriman akselerator (relevan untuk NPU). |
--plugin_dir |
std::string |
Jalur ke direktori yang berisi library plugin compiler akselerator (relevan untuk NPU). |
--soc_manufacturer |
std::string |
Produsen SOC yang akan ditargetkan untuk kompilasi AOT (relevan untuk kompilasi NPU). |
--soc_model |
std::string |
Model SOC yang akan ditargetkan untuk kompilasi AOT (relevan untuk kompilasi NPU). |
--iters_per_test |
size_t |
Jumlah iterasi yang akan dijalankan per pengujian, masing-masing dengan data tensor acak yang berbeda. |
--max_ms_per_test |
int64_t |
Waktu maksimum dalam milidetik untuk menjalankan setiap pengujian sebelum waktu tunggu habis. |
--fail_on_timeout |
bool |
Apakah pengujian harus gagal jika waktu tunggu eksekusi habis. |
--csv |
std::string |
Jalur file untuk menyimpan laporan mendetail dalam format CSV. |
--dump_report |
bool |
Apakah akan mencetak seluruh detail laporan langsung ke output konsol pengguna. |
--data_seed |
std::optional<int> | Satu nilai awal untuk pembuatan data global. |
--do_register |
std::vector<std::string> | Regex untuk menyertakan pengujian tertentu secara eksplisit (misalnya, *mobilenet*). |
--dont_register |
std::vector<std::string> | Regex untuk mengecualikan pengujian tertentu. |
--extra_models |
std::vector<std::string> | Daftar opsional direktori atau file model yang akan ditambahkan ke rangkaian pengujian. |
--limit |
int32_t |
Batasi jumlah total pengujian yang terdaftar dan dijalankan. |
--quiet |
bool |
Minimalkan output logging selama menjalankan pengujian. |
Menggunakan utilitas build litert_device_script untuk ATS
Target ATS yang dijalankan pengguna secara otomatis mencakup titik entri shell yang menangani semua penyiapan lingkungan, dan setiap pengiriman library yang diperlukan saat perangkat target berbeda dengan host tempat build diselesaikan (misalnya, adb push).
Fungsi ini disediakan secara umum melalui utilitas litert_device_script yang digunakan ATS di balik layar. Ada proses pendaftaran yang harus dilakukan akselerator untuk mengakses fungsi build ini. Selain mendukung ats, utilitas ini dapat digunakan secara mandiri untuk menyimulasikan cc_binary dan cc_test yang dimaksudkan untuk dieksekusi di perangkat yang berbeda dari host build yang memerlukan dependensi yang didorong.
Pendaftaran Backend
Untuk mengaktifkan akselerator baru agar dapat digunakan dengan litert_device_script (dan oleh karena itu ATS), library yang diperlukan harus didaftarkan dalam file Bazel
litert_device_common.bzl. Pendaftaran didasarkan pada
"backend" name unik yang dipetakan ke serangkaian library yang dapat dibangun atau telah dikompilasi sebelumnya
yang diperlukan agar LiteRT dapat beroperasi dengan akselerator tersebut.
Langkah-Langkah Pendaftaran
Tentukan fungsi
BackendSpec: Buat fungsi yang menampilkan kamus yang berisi spesifikasi akselerator baru Anda.Tentukan Library (
libs): Ini adalah daftar tuple yang menjelaskan jalur target Bazel untuk library bersama dan variabel lingkungan (LD_LIBRARY_PATH) yang diperlukan agar linker perangkat dapat menemukannya.- Dispatch Library: Diperlukan untuk eksekusi runtime.
- Library Plugin Compiler: Diperlukan untuk mode kompilasi AOT.
Tentukan Nama Library (
plugin,dispatch): Berikan nama file plugin dan library pengiriman.Daftarkan Spesifikasi: Gabungkan fungsi spesifikasi baru Anda ke dalam fungsi
_Specsutama agar tersedia berdasarkan ID backend uniknya.
Contoh Pendaftaran (_ExampleSpec)
Kode berikut dari litert_device_common.bzl mengilustrasikan cara mendaftarkan akselerator "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]
Memanfaatkan Pendaftaran dengan litert_device_exec
Setelah terdaftar, gunakan litert_device_exec dan makro terkait dengan
backend_id baru. Makro ini secara otomatis menggabungkan library yang diperlukan dan file data yang ditentukan dengan biner target.
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",
)
Menjalankan target ini (bazel run ... :example_bin_device) akan:
- Buat biner C++
example_bin. - Kirim file biner,
libLiteRtDispatch_Example.so,libLiteRtCompilerPlugin_Example.so, dan.tfliteke perangkat. - Jalankan biner menggunakan
adb shell.
Catatan tentang Jalur Perangkat: Lokasi kanonis untuk file di perangkat mencerminkan hierarki runfile Bazel, khususnya
/data/local/tmp/runfiles/runfiles_relative_path. Skrip perangkat secara otomatis menangani penetapan jalur yang sesuai untuk penaut dinamis.
Mode Kompilasi (AOT)
Untuk akselerator yang mendukung langkah kompilasi Ahead-of-Time (AOT), ATS dapat dieksekusi dalam "mode kompilasi" khusus.
- Tujuan: Mode ini dirancang untuk dijalankan di workstation (mesin host), bukan perangkat target. Model ini mengompilasi model untuk hardware target yang ditentukan tanpa menjalankannya.
- Output: Semua model yang dikompilasi akan di-output ke direktori yang ditentukan di workstation.
- Aktivasi: Makro build ATS akan memancarkan target tertentu untuk AOT
tempat library dibangun untuk platform host. Alur ini dapat diaktifkan di
biner apa pun dengan tanda
--compile_mode, tetapi secara otomatis terikat ke argumen build aot.
Pengembangan di Masa Mendatang
Rangkaian ini direncanakan akan diperluas untuk menyertakan pengujian khusus untuk operasi (ops) tunggal, selain model lengkap.