Hizmet kalitesi

Android 11'den itibaren NNAPI, bir uygulamanın modellerinin göreceli önceliklerini, belirli bir modelin hazırlanması için beklenen maksimum süreyi ve belirli bir yürütmenin tamamlanması için beklenen maksimum süreyi belirtmesine olanak tanıyarak daha iyi hizmet kalitesi (QoS) sunar. Ayrıca Android 11, bir hizmetin hata oluştuğunda neyin yanlış gittiğini daha doğru şekilde belirtmesini sağlayan ek NNAPI hata değerleri sunar. Böylece istemci uygulaması daha iyi tepki verebilir ve daha iyi kurtarma yapabilir.

Öncelik

Android 11 veya sonraki sürümlerde modeller, NN HAL 1.3'te öncelikli olarak hazırlanır. Bu öncelik, aynı uygulamaya ait diğer hazırlanmış modellere göredir. Daha yüksek öncelikli yürütmeler, daha düşük öncelikli yürütmelerden daha fazla bilgi işlem kaynağı kullanabilir ve daha düşük öncelikli yürütmeleri bekletebilir veya kaynaktan mahrum bırakabilir.

Priority'ü açık bir bağımsız değişken olarak içeren NN HAL 1.3 çağrısı IDevice::prepareModel_1_3 şeklindedir. IDevice::prepareModelFromCache_1_3, önbelleğe alma bağımsız değişkenlerine Priority'ı dolaylı olarak dahil eder.

Sürücünün ve hızlandırıcının özelliklerine bağlı olarak öncelikleri desteklemek için birçok olası strateji vardır. Aşağıda birkaç strateji verilmiştir:

  • Yerleşik öncelik desteğine sahip sürücüler için Priority alanını doğrudan hızlandırıcıya yayınlayın.
  • Bir yürütme hızlandırıcıya ulaşmadan önce bile farklı öncelikleri desteklemek için uygulama başına öncelikli sıra kullanın.
  • Hızlandırıcının yüksek öncelikli modelleri çalıştırması için yürütülmekte olan düşük öncelikli modelleri duraklatın veya iptal edin. Bunu, düşük öncelikli modellere kontrol noktaları ekleyerek (bu noktaya ulaşıldığında mevcut yürütmenin erken durdurulup durdurulmayacağını belirlemek için bir işaret sorgular) veya modeli alt modellere ayırıp alt model yürütmeleri arasında işareti sorgulamayı seçerek yapabilirsiniz. Öncelikli olarak hazırlanmış modellerde kontrol noktalarının veya alt modellerin kullanılmasının, NN HAL 1.3'ten önceki sürümlerde önceliği olmayan modellerde bulunmayan ek yükü beraberinde getirebileceğini unutmayın.

    • Öncelikli yürütmeyi desteklemek için, yürütülecek bir sonraki işlem veya alt model ve ilgili tüm ara operatör verileri dahil olmak üzere yürütme bağlamını koruyun. Daha sonra yürütmeyi devam ettirmek için bu yürütme bağlamını kullanın.
    • Tam öncelikli satın alma desteği gerekli olmadığından yürütme bağlamının korunmasına gerek yoktur. NNAPI model çalıştırmaları belirlenmiş olduğundan, çalıştırmalar daha sonra sıfırdan yeniden başlatılabilir.

Android, hizmetlerin AID (Android UID) kullanarak farklı arama uygulamalarını ayırt etmesine olanak tanır. HIDL, ::android::hardware::IPCThreadState::getCallingUid yöntemi aracılığıyla çağıran uygulamanın UID'sini almak için yerleşik mekanizmalara sahiptir. AID'lerin listesini libcutils/include/cutils/android_filesystem_config.h adresinde bulabilirsiniz.

Son tarihler

Android 11'den itibaren model hazırlama ve yürütme işlemleri, OptionalTimePoint son tarih bağımsız değişkeniyle başlatılabilir. Bir görevin ne kadar süreceğini tahmin edebilecek sürücüler için bu son tarih, sürücünün görevin son tarihten önce tamamlanamayacağını tahmin etmesi durumunda görevi başlamadan önce iptal etmesine olanak tanır. Benzer şekilde, son tarih, sürücünün son tarihten önce tamamlanmayacağını tahmin ettiği devam eden bir görevi iptal etmesine olanak tanır. Son tarih bağımsız değişkeni, son tarihe kadar tamamlanmayan veya son tarih geçen görevleri iptal etmeye sürücüyü zorlamaz. Son tarih bağımsız değişkeni, sürücüdeki bilgi işlem kaynaklarını boşaltmak ve kontrolü son tarih olmadan mümkün olandan daha hızlı bir şekilde uygulamaya döndürmek için kullanılabilir.

NN HAL 1.3 çağrılarında, OptionalTimePoint son tarihleri bağımsız değişken olarak kullanılır:

  • IDevice::prepareModel_1_3
  • IDevice::prepareModelFromCache_1_3
  • IPreparedModel::execute_1_3
  • IPreparedModel::executeSynchronously_1_3
  • IPreparedModel::executeFenced

Yukarıdaki yöntemlerin her biri için son tarih özelliğinin referans uygulamasını görmek istiyorsanız frameworks/ml/nn/driver/sample/SampleDriver.cpp adresindeki NNAPI örnek sürücüye bakın.

Hata kodları

Android 11, hata raporlamayı iyileştirmek için NN HAL 1.3'te dört hata kodu değeri içerir. Bu sayede sürücüler durumlarını daha iyi iletebilir ve uygulamalar daha sorunsuz bir şekilde kurtarılabilir. Bunlar, ErrorStatus içindeki hata kodu değerleridir.

  • MISSED_DEADLINE_TRANSIENT
  • MISSED_DEADLINE_PERSISTENT
  • RESOURCE_EXHAUSTED_TRANSIENT
  • RESOURCE_EXHAUSTED_PERSISTENT

Android 10 veya önceki sürümlerde sürücüler yalnızca GENERAL_FAILURE hata kodunu kullanarak hatayı belirtebilir. Android 11'den itibaren, son tarihe ulaşıldığı veya sürücünün iş yükünün son tarihe kadar tamamlanmayacağını tahmin ettiği için iş yükünün iptal edildiğini belirtmek üzere iki MISSED_DEADLINE hata kodu kullanılabilir. İki RESOURCE_EXHAUSTED hata kodu, sürücüdeki bir kaynak sınırlaması (ör. sürücünün arama için yeterli belleğe sahip olmaması) nedeniyle görevin başarısız olduğunu belirtmek için kullanılabilir.

Her iki hatanın da TRANSIENT sürümü, sorunun geçici olduğunu ve aynı göreve yapılan gelecekteki çağrıların kısa bir gecikme sonrasında başarılı olabileceğini gösterir. Örneğin, sürücü uzun süren veya yoğun kaynak kullanan bir işle meşgulken bu hata kodu döndürülmelidir. Ancak sürücü önceki işle meşgul olmasaydı yeni görevin başarıyla tamamlanacağı anlamına gelir. Her iki hatanın da PERSISTENT sürümü, aynı göreve yapılacak gelecekteki çağrıların her zaman başarısız olmasının beklendiğini gösterir. Örneğin, sürücü mükemmel koşullarda bile görevin son tarihe kadar tamamlanamayacağını veya modelin özünde çok büyük olduğunu ve sürücünün kaynaklarını aştığını tahmin ettiğinde bu hata kodu döndürülmelidir.

Doğrulama

Hizmet kalitesi işlevi, NNAPI VTS testlerinde (VtsHalNeuralnetworksV1_3Target) test edilir. Bu testler arasında, sürücünün geçersiz öncelikleri reddetmesini sağlamak için doğrulama (TestGenerated/ValidationTest#Test/) testleri ve sürücünün son tarihleri doğru şekilde işlemesini sağlamak için DeadlineTest (TestGenerated/DeadlineTest#Test/) adlı bir test grubu bulunur.