LiteRT Accelerator Test Suite (ATS)

LiteRT Hızlandırıcı Test Paketi (ATS), LiteRT çerçevesiyle entegre edilmiş özel hızlandırıcı uygulamalarının işlevsel doğruluğunu doğrulamak ve performansını ölçmek için kullanılan kapsamlı bir araçtır.

Genel Bakış ve Temel İşlevler

ATS'nin temel işlevi, önceden tanımlanmış makine öğrenimi modellerini hedef hızlandırıcıya göre yürütmek ve sonuçları LiteRT standart CPU arka ucuyla karşılaştırmaktır.

  • Doğrulama: Paket, hızlandırıcı tarafından üretilen çıkış tensörlerini (etkinleştirmeler) bilinen iyi CPU arka ucu tarafından üretilenlerle karşılaştırarak sayısal doğrulama gerçekleştirir. Bu, hızlandırıcı uygulamasının gerekli hassasiyeti ve doğruluğu korumasını sağlar.
  • Performans Metrikleri: Gecikme ve diğer alakalı metrikler dahil olmak üzere kritik performans ayrıntılarını otomatik olarak yakalayıp kaydeder ve kullanıcıya sunar.
  • Yürütme: Testler genellikle hedef cihazda (ör. Android telefon) yürütülür ve adb (Android Debug Bridge) aracı kullanılarak dosya aktarımlarını ve kurulumu yöneten bir kabuk komut dosyası sarmalayıcı tarafından yönetilir.

Test Verileri (Modeller)

ATS paketi, test verileri olarak yaygın şekilde kullanılan bir dizi .tflite model kullanır. Giriş verileri, veri türüne göre rastgele oluşturulur ve gerektiğinde başlatılabilir.

Dahil Edilen Modeller

Aşağıdaki modeller, test için otomatik olarak dahil edilir ve indirilir (değişikliğe tabidir):

  • 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

Manuel Model Alma

Modeller bazel run sırasında otomatik olarak indirilir ancak wget kullanarak model setinin tamamını manuel olarak alabilirsiniz:

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

Bazel ile ATS paketi tanımlama

litert_define_ats Bazel makrosunu kullanarak hızlandırıcılarına özel bir ATS testi hedefi yapılandırıp tanımlayabilirler.

Makro, otomatik olarak iki çalıştırılabilir hedef oluşturur:

  1. Standart cihaz üzerinde JIT testi (yürütme ve doğrulama için).
  2. Özel bir AOT "yalnızca derleme" modu testi (ana makine derlemesi için).

Örnek litert_define_ats Kullanım

Örnekte, arka uç adı example olan bir hızlandırıcı için example_ats adlı bir ATS paketi tanımlanmaktadır:

# 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 = "",
)

Yürütme

Android'i hedefleyen standart testi yürütmek için (tüm adb işlemlerini gerçekleştirir):

# 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 derleme testini yürütmek için:

# 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'ta yürütme (ana makine)

ATS'nin derlemenin yapıldığı makineyle aynı makinede çalıştırıldığı Linux yürütme için kullanıcıların doğrudan :ats ikili dosyasını kullanması gerekir:

bazel run -c opt :ats

IoT Uygulaması

IoT yürütme için kullanıcıların ikili dosyayı ana makinede oluşturması ve manuel olarak cihazına göndermesi gerekir.

Komut satırı işaretleri

ats yürütülebilir dosyası, test ve raporlama üzerinde ayrıntılı kontrol için çeşitli işaretler kabul eder.

İşaret Tür Açıklama
--backend std::string Zorunludur. Test edilen hızlandırıcı olarak kullanılacak LiteRT arka ucu ("gerçek"). Seçenekler cpu, npu veya gpu'dir.
--compile_mode bool Doğruysa cihaz üzerinde yürütme yerine iş istasyonunda AOT derleme adımını çalıştırır. NOT: Bu seçenek, "aot" derleme hedefiyle otomatik olarak bağlanır ve açıkça ayarlanması gerekmez.
--models_out std::string Yan etkiyle serileştirilmiş (derlenmiş) modellerin kaydedildiği dizin yolu. Yalnızca AOT veya JIT derleme için geçerlidir.
--dispatch_dir std::string Hızlandırıcının gönderme kitaplığını içeren dizinin yolu (NPU için geçerlidir).
--plugin_dir std::string Hızlandırıcının derleyici eklenti kitaplığını içeren dizinin yolu (NPU için geçerlidir).
--soc_manufacturer std::string AOT derlemesi için hedeflenecek SOC üreticisi (NPU derlemesi için geçerlidir).
--soc_model std::string AOT derlemesi için hedeflenecek SOC modeli (NPU derlemesi için geçerlidir).
--iters_per_test size_t Her biri farklı rastgeleleştirilmiş tensör verileriyle test başına çalıştırılacak yineleme sayısı.
--max_ms_per_test int64_t Zaman aşımından önce her testin çalıştırılacağı maksimum süre (milisaniye cinsinden).
--fail_on_timeout bool Yürütme zaman aşımına uğrarsa testin başarısız olup olmayacağı.
--csv std::string Ayrıntılı raporu CSV biçiminde kaydetmek için dosya yolu.
--dump_report bool Raporun tüm ayrıntılarının doğrudan kullanıcının konsol çıkışına dökülüp dökülmeyeceği.
--data_seed std::optional<int> Küresel veri oluşturma için tek bir başlangıç.
--do_register std::vector<std::string> Belirli testleri açıkça dahil etmek için normal ifadeler (ör. *mobilenet*).
--dont_register std::vector<std::string> Belirli testleri hariç tutmak için kullanılan normal ifadeler.
--extra_models std::vector<std::string> Test paketine eklenecek dizinlerin veya model dosyalarının isteğe bağlı listesi.
--limit int32_t Kaydedilen ve çalıştırılan toplam test sayısını sınırlayın.
--quiet bool Test çalıştırma sırasında günlük kaydı çıkışını en aza indirin.

ATS için litert_device_script derleme yardımcı programlarını kullanma

ATS hedefli kullanıcılar, tüm ortam kurulumunu ve hedef cihazın derlemenin tamamlandığı ana makineden farklı olduğu durumlarda gerekli kitaplıkların gönderilmesini (ör. adb push) otomatik olarak işleyen bir kabuk giriş noktası içerir.

Bu işlev, ATS derlemelerinin arka planda kullandığı litert_device_script yardımcı programları aracılığıyla genel olarak sağlanır. Bu derleme işlevine erişmek için hızlandırıcıların kayıt sürecini tamamlaması gerekir. ats'yı desteklemenin yanı sıra bu yardımcı programlar, cc_binary ve cc_test'yi simüle etmek için bağımsız olarak da kullanılabilir. Bu simülasyonlar, gönderilen bağımlılıklar gerektiren derleme ana makinesinden farklı bir cihazda yürütülmek üzere tasarlanmıştır.

Arka uç kaydı

litert_device_script (ve dolayısıyla ATS) ile kullanılacak yeni bir hızlandırıcıyı etkinleştirmek için gerekli kitaplıklarının litert_device_common.bzl Bazel dosyasında kaydedilmesi gerekir. Kaydolma işlemi, LiteRT'nin bu hızlandırıcıyla çalışması için gereken, derlenebilir veya önceden derlenmiş bir kitaplıklar grubuna eşlenen benzersiz bir "arka uç" adına dayanır.

Kayıt Adımları

  1. BackendSpec işlevi tanımlayın: Yeni hızlandırıcınızın spesifikasyonunu içeren bir sözlük döndüren bir işlev oluşturun.

  2. Kitaplıkları belirtin (libs): Bu, paylaşılan kitaplığın Bazel hedef yolunu ve cihaz bağlayıcısının kitaplığı bulması için gereken ortam değişkenini (LD_LIBRARY_PATH) ayrıntılı olarak açıklayan bir demet listesidir.

    • Dispatch Library: Çalışma zamanı yürütmesi için gereklidir.
    • Derleyici Eklenti Kitaplığı: AOT derleme modu için gereklidir.
  3. Kitaplık Adlarını Belirtin (plugin, dispatch): Eklenti ve dağıtım kitaplıklarının dosya adlarını girin.

  4. Spec'i Kaydetme: Yeni spec işlevinizi, benzersiz arka uç kimliğiyle kullanılabilir hale getirmek için ana _Specs işleviyle birleştirin.

Örnek Kayıt (_ExampleSpec)

litert_device_common.bzl kaynağındaki aşağıdaki kodda "example" hızlandırıcısının nasıl kaydedildiği gösterilmektedir:

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 ile kayıt özelliğinden yararlanma

Kaydolduktan sonra, litert_device_exec ve ilgili makroları yeni backend_id ile kullanın. Bu makro, gerekli kitaplıkları ve belirtilen tüm veri dosyalarını hedef ikiliyle otomatik olarak paketler.

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",
)

Bu hedefi (bazel run ... :example_bin_device) çalıştırmak için:

  1. example_bin C++ ikilisini oluşturun.
  2. İkili dosya, libLiteRtDispatch_Example.so, libLiteRtCompilerPlugin_Example.so ve .tflite dosyasını cihaza aktarın.
  3. adb shell kullanarak ikili dosyayı yürütün.

Cihaz Yollarıyla İlgili Not: Cihazdaki dosyaların standart konumu, Bazel'in runfile ağacını yansıtır. Özellikle /data/local/tmp/runfiles/runfiles_relative_path. Cihaz komut dosyası, dinamik bağlayıcı için uygun yolların ayarlanmasını otomatik olarak gerçekleştirir.

Derleme Modu (AOT)

Önceden derleme (AOT) adımını destekleyen hızlandırıcılar için ATS, özel bir "derleme modunda" yürütülebilir.

  • Amaç: Bu mod, hedef cihazda değil, iş istasyonunda (ana makine) çalışacak şekilde tasarlanmıştır. Belirtilen hedef donanım için modelleri yürütmeden derler.
  • Çıkış: Derlenen tüm modeller, iş istasyonundaki belirlenmiş bir dizine çıkış olarak verilir.
  • Etkinleştirme: ATS derleme makroları, kitaplıkların ana makine platformu için oluşturulduğu aot için belirli bir hedef yayar. Bu akış, --compile_mode işareti olan tüm ikili programlarda etkinleştirilebilir ancak aot derlemesinin bağımsız değişkenlerine otomatik olarak bağlanır.

Gelecekteki genişleme

Paketin, tam modellerin yanı sıra tek işlemler (ops) için özel testleri de içerecek şekilde genişletilmesi planlanmaktadır.