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, hizmetin bir hata oluştuğunda neyin yanlış gittiğini daha doğru bir şekilde belirtmesini sağlayan ek NNAPI hata değerlerini kullanıma sunar. Böylece istemci uygulaması daha iyi tepki verebilir ve kurtarılabilir.

Ö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öre belirlenir. Daha yüksek öncelikli yürütmeler, daha düşük öncelikli yürütmelere kıyasla daha fazla işlem kaynağı kullanabilir ve daha düşük öncelikli yürütmeleri öncelikli olarak çalıştırabilir veya kaynak yetersizliğine neden olabilir.

Priority öğesini 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'ın, Priority'ı önbellek bağımsız değişkenlerine örtülü olarak dahil ettiğini unutmayın.

Sürücü 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 öncelikli destek özelliği olan sürücüler için Priority alanını doğrudan hızlandırıcıya yayınlayın.
  • 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ıyı yüksek öncelikli modelleri çalıştıracak şekilde serbest bırakmak için düşük öncelikli modelleri duraklatın veya iptal edin. Bunu, düşük öncelikli modellere kontrol noktaları ekleyerek (bu noktalara ulaşıldığında, mevcut yürütmenin erken durdurulup durdurulmayacağını belirlemek için bir işaret sorgulanır) veya modeli alt modellere bölüp alt model yürütmeleri arasında işareti sorgulayarak yapabilirsiniz. Öncelikli olarak hazırlanan modellerde kontrol noktalarının veya alt modellerin kullanılmasının, NN HAL 1.3'ten önceki sürümlerde öncelikli olmayan modellerde bulunmayan ek yük getirebileceğini unutmayın.

    • Önceliği desteklemek için yürütme bağlamını (yürütülecek bir sonraki işlem veya alt model ve ilgili tüm ara işlenen verileri dahil) koruyun. Bu yürütme bağlamını kullanarak yürütmeye daha sonra devam edin.
    • Tam öncelik desteği gerekli olmadığından yürütme bağlamının korunması gerekmez. NNAPI model yürütmeleri deterministik olduğundan yürütmeler daha sonra baştan başlatılabilir.

Android, AID (Android UID) kullanarak hizmetlerin farklı arama uygulamaları arasında ayrım yapmasına olanak tanır. HIDL, ::android::hardware::IPCThreadState::getCallingUid yöntemiyle arayan uygulamanın UID'sini almak için yerleşik mekanizmalara sahiptir. AIDs 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 edebilen 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, görev son tarihe kadar tamamlanmazsa veya son tarih geçmişse sürücüyü görevi iptal etmeye zorlamaz. Son tarih bağımsız değişkeni, sürücüdeki 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.

Bağımsız ağ HAL 1.3'ün, bağımsız değişken olarak OptionalTimePoint son tarihlerini içeren çağrıları şunlardı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 üzere frameworks/ml/nn/driver/sample/SampleDriver.cpp adresindeki NNAPI örnek sürücüsüne 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ü, yalnızca GENERAL_FAILURE hata kodu aracılığıyla bir arızayı belirtebiliyordu. Android 11'den itibaren, iş yükünün son tarihe ulaşıldığı veya sürücü tarafından iş yükünün son tarihe kadar tamamlanmayacağı tahmin edildiği için iptal edildiğini belirtmek üzere iki MISSED_DEADLINE hata kodu kullanılabilir. İki RESOURCE_EXHAUSTED hata kodu, görevin sürücüdeki bir kaynak sınırlaması nedeniyle başarısız olduğunu belirtmek için kullanılabilir. Örneğin, sürücünün arama için yeterli belleği olmayabilir.

Her iki hatanın TRANSIENT sürümü, sorunun geçici olduğunu ve aynı göreve yapılan gelecekteki çağrıların kısa bir gecikmeden sonra başarılı olabileceğini gösterir. Örneğin, sürücü daha önce uzun süren veya kaynak yoğun bir işle meşgulken bu hata kodu döndürülmelidir. Ancak sürücü daha önceki işle meşgul olmasaydı yeni görev başarıyla tamamlanırdı. Her iki hatanın PERSISTENT sürümü, aynı göreve yapılan gelecekteki çağrıların her zaman başarısız olmasının beklendiğini gösterir. Örneğin, sürücü görevin mükemmel koşullarda bile son tarihe kadar tamamlanamayacağını tahmin ettiğinde veya modelin doğası gereği çok büyük olduğu ve sürücünün kaynaklarını aştığı durumlarda bu hata kodu döndürülmelidir.

Doğrulama

Hizmet kalitesi işlevi, NNAPI VTS testlerinde (VtsHalNeuralnetworksV1_3Target) test edilir. Bu testler, sürücünün geçersiz öncelikleri reddettiğinden emin olmak için bir doğrulama testi grubu (TestGenerated/ValidationTest#Test/) ve sürücünün son tarihleri doğru şekilde işlediğinden emin olmak için DeadlineTest (TestGenerated/DeadlineTest#Test/) adlı bir test grubu içerir.