Hizmet kalitesi

NNAPI, Android 11'den itibaren 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 bölerek ve 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.

    • Engellemeyi desteklemek için yürütülecek bir sonraki işlem veya alt model ve ilgili tüm ara işlenen 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 değildir. Bu nedenle, yürütme bağlamının korunmasına gerek yoktur. NNAPI model yürütmeleri belirleyici olduğundan yürütmeler 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, çağrı yapan uygulamanın UID'sini ::android::hardware::IPCThreadState::getCallingUid yöntemi üzerinden 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, görev son tarihe kadar tamamlanmazsa veya son tarih geçerse sürücüyü görevi iptal etmeye 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 isterseniz 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üler yalnızca GENERAL_FAILURE hata kodu aracılığıyla hata olduğunu belirtebilir. Android 11'den itibaren iki MISSED_DEADLINE hata kodu, teslim tarihine 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 amacıyla 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ü önceden uzun süreli veya kaynak yoğun bir çalışmayla meşgulken, sürücü önceki işle meşgul değilse yeni görevin başarıyla tamamlanacağını belirtir. Her iki hatanın PERSISTENT sürümü, aynı göreve gelecekte yapılacak ç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.