TensorFlow Lite NNAPI temsilcisi

Android Sinir Ağları API'si (NNAPI) , Android 8.1 (API seviyesi 27) veya üzeri çalıştıran tüm Android cihazlarda kullanılabilir. Desteklenen donanım hızlandırıcılara sahip Android cihazlarda TensorFlow Lite modelleri için hızlandırma sağlar:

  • Grafik İşleme Birimi (GPU)
  • Dijital Sinyal İşlemci (DSP)
  • Sinir İşleme Birimi (NPU)

Performans, cihazda bulunan belirli donanıma bağlı olarak değişecektir.

Bu sayfada NNAPI temsilcisinin Java ve Kotlin'de TensorFlow Lite Yorumlayıcı ile nasıl kullanılacağı açıklanmaktadır. Android C API'leri için lütfen Android Yerel Geliştirici Kiti belgelerine bakın .

NNAPI temsilcisini kendi modelinizde denemek

Gradle ithalatı

NNAPI temsilcisi, TensorFlow Lite Android yorumlayıcısının bir parçasıdır, sürüm 1.14.0 veya üstü. Aşağıdakileri modül gradle dosyanıza ekleyerek projenize aktarabilirsiniz:

dependencies {
   implementation 'org.tensorflow:tensorflow-lite:2.0.0'
}

NNAPI temsilcisini başlatma

TensorFlow Lite yorumlayıcısını başlatmadan önce NNAPI temsilcisini başlatmak için kodu ekleyin.

import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.nnapi.NnApiDelegate;

Interpreter.Options options = (new Interpreter.Options());
NnApiDelegate nnApiDelegate = null;
// Initialize interpreter with NNAPI delegate for Android Pie or above
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    nnApiDelegate = new NnApiDelegate();
    options.addDelegate(nnApiDelegate);
}

// Initialize TFLite interpreter
try {
    tfLite = new Interpreter(loadModelFile(assetManager, modelFilename), options);
} catch (Exception e) {
    throw new RuntimeException(e);
}

// Run inference
// ...

// Unload delegate
tfLite.close();
if(null != nnApiDelegate) {
    nnApiDelegate.close();
}

En iyi uygulamalar

Dağıtmadan önce performansı test edin

Çalışma zamanı performansı, model mimarisi, boyutu, işlemler, donanım kullanılabilirliği ve çalıştırma zamanı donanım kullanımına bağlı olarak önemli ölçüde değişebilir. Örneğin, bir uygulama oluşturma için GPU'yu yoğun bir şekilde kullanıyorsa, NNAPI hızlandırma, kaynak çekişmesi nedeniyle performansı iyileştirmeyebilir. Çıkarım süresini ölçmek için hata ayıklama günlüğünü kullanarak basit bir performans testi yapmanızı öneririz. NNAPI'yi üretimde etkinleştirmeden önce, kullanıcı tabanınızı temsil eden farklı yonga setlerine (üretici veya aynı üreticiye ait modeller) sahip birkaç telefonda testi çalıştırın.

İleri düzey geliştiriciler için TensorFlow Lite ayrıca Android için bir model karşılaştırma aracı sunar.

Cihaz dışlama listesi oluşturun

Üretimde, NNAPI'nin beklendiği gibi çalışmadığı durumlar olabilir. Geliştiricilerin, belirli modellerle birlikte NNAPI hızlandırmayı kullanmaması gereken cihazların bir listesini tutmalarını öneririz. Bu listeyi, aşağıdaki kod parçacığını kullanarak alabileceğiniz "ro.board.platform" değerine göre oluşturabilirsiniz:

String boardPlatform = "";

try {
    Process sysProcess =
        new ProcessBuilder("/system/bin/getprop", "ro.board.platform").
        redirectErrorStream(true).start();

    BufferedReader reader = new BufferedReader
        (new InputStreamReader(sysProcess.getInputStream()));
    String currentLine = null;

    while ((currentLine=reader.readLine()) != null){
        boardPlatform = line;
    }
    sysProcess.destroy();
} catch (IOException e) {}

Log.d("Board Platform", boardPlatform);

İleri düzey geliştiriciler için, bu listeyi uzaktan bir yapılandırma sistemi aracılığıyla korumayı düşünün. TensorFlow ekibi, optimum NNAPI yapılandırmasını keşfetmeyi ve uygulamayı basitleştirme ve otomatikleştirme yolları üzerinde aktif olarak çalışıyor.

Niceleme

Niceleme, hesaplama için 32-bit kayan değerler yerine 8-bit tamsayılar veya 16-bit kayan değerler kullanarak model boyutunu küçültür. 8 bitlik tam sayı model boyutları, 32 bitlik kayan sürümlerin dörtte biridir; 16 bitlik kayan değerler, boyutun yarısıdır. İşlem bazı model doğruluğunu değiştirebilse de niceleme performansı önemli ölçüde artırabilir.

Çok sayıda eğitim sonrası niceleme tekniği vardır, ancak mevcut donanımda maksimum destek ve hızlanma için tam tamsayı nicemlemeyi öneririz. Bu yaklaşım hem ağırlığı hem de işlemleri tam sayılara dönüştürür. Bu niceleme işleminin çalışması için temsili bir veri kümesi gerekir.

Desteklenen modelleri ve işlemleri kullanın

NNAPI temsilcisi bir modeldeki bazı işlemleri veya parametre kombinasyonlarını desteklemiyorsa, çerçeve yalnızca hızlandırıcıda grafiğin desteklenen bölümlerini çalıştırır. Kalan kısım CPU üzerinde çalışır ve bu da bölünmüş yürütme ile sonuçlanır. CPU / hızlandırıcı senkronizasyonunun yüksek maliyeti nedeniyle, bu, tüm ağı yalnızca CPU üzerinde yürütmekten daha yavaş performansa neden olabilir.

NNAPI, modeller yalnızca desteklenen işlemleri kullandığında en iyi performansı gösterir. Aşağıdaki modellerin NNAPI ile uyumlu olduğu bilinmektedir:

Model dinamik boyutlu çıktılar içerdiğinde de NNAPI hızlandırma desteklenmez. Bu durumda, aşağıdaki gibi bir uyarı alacaksınız:

ERROR: Attempting to use a delegate that only supports static-sized tensors \
with a graph that has dynamic-sized tensors.

NNAPI CPU uygulamasını etkinleştirin

Bir hızlandırıcı tarafından tamamen işlenemeyen bir grafik, NNAPI CPU uygulamasına geri dönebilir. Ancak, bu genellikle TensorFlow yorumlayıcısından daha az performans gösterdiğinden, bu seçenek Android 10 (API Düzeyi 29) veya üzeri için NNAPI temsilcisinde varsayılan olarak devre dışı bırakılmıştır. Bu davranışı, set geçersiz kılmak için setUseNnapiCpu için true de NnApiDelegate.Options nesne.