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, ek NNAPI hata değerleri sunar. Bu sayede hizmet, bir hata oluştuğunda sorunun ne olduğunu daha doğru bir şekilde belirtebilir. Böylece istemci uygulaması daha iyi tepki verebilir ve durumu kurtarabilir.

Öncelik

Android 11 veya sonraki sürümler için modeller NN HAL 1.3 öncelikli olarak hazırlanır. Bu öncelik, aynı uygulamaya ait hazırlanan diğer modellere göre belirlenir. Yüksek öncelikli yürütmeler, düşük öncelikli yürütmelere göre daha fazla işlem kaynağı kullanabilir ve daha düşük öncelikli yürütmeleri önceden engelleyebilir veya açlık yaratabilir.

Açık bağımsız değişken olarak Priority içeren NN HAL 1.3 çağrısı IDevice::prepareModel_1_3 şeklindedir. IDevice::prepareModelFromCache_1_3 öğesinin, önbellek bağımsız değişkenlerine dolaylı olarak Priority içerdiğini unutmayın.

Sürücünün ve gaz pedalının becerilerine bağlı olarak öncelikleri desteklemek için pek çok olası strateji vardır. Aşağıda birkaç strateji belirtilmiştir:

  • Yerleşik öncelik desteğine sahip sürücüler için Priority alanını doğrudan hızlandırıcıya yayın.
  • Bir yürütme hızlandırıcıya ulaşmadan önce bile farklı öncelikleri desteklemek için uygulama başına öncelik sırası kullanın.
  • Yüksek öncelikli modelleri yürütmesi için hızlandırıcıyı serbest bırakmak amacıyla yürütülmekte olan düşük öncelikli modelleri duraklatın veya iptal edin. Bunu, düşük öncelikli modellere kontrol noktaları ekleyerek veya ulaşıldığında mevcut yürütmenin erken durdurulmasının gerekip gerekmediğini belirlemek için bir işareti sorgulayarak ya da modeli alt modeller halinde bölümlendirerek ve alt model yürütmeleri arasında işareti sorgulayarak yapabilirsiniz. Öncelikli olarak hazırlanan modellerde kontrol noktası veya alt modellerin kullanılmasının, NN HAL 1.3'ten düşük sürümlerde önceliği olmayan modeller için mevcut olmayan ek yüke yol açabileceğ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. Yürütmeyi daha sonra devam ettirmek için bu yürütme bağlamını kullanın.
    • Tam önceden alma desteği gerekli olmadığı için yürütme bağlamının korunması gerekmez. NNAPI model yürütmeleri belirleyici olduğundan yürütmeler daha sonra sıfırdan yeniden başlatılabilir.

Android, AID (Android UID) kullanarak hizmetlerin farklı arama uygulamalarını birbirinden ayırt etmesini sağlar. 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.

Teslim tarihleri

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 teslim tarihinden önce tamamlanamayacağını tahmin etmesi durumunda sürücünün görevi başlamadan önce iptal etmesine olanak tanır. Benzer şekilde teslim tarihi, sürücünün teslim tarihinden önce tamamlanmayacağını tahmin ettiği devam eden bir görevi iptal etmesine de olanak tanır. Son tarih bağımsız değişkeni, görev son tarihe kadar tamamlanmamışsa 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 bilgi işlem kaynaklarını serbest bırakmak ve kontrolü uygulamaya son tarih olmadan daha hızlı bir şekilde geri vermek için kullanılabilir.

OptionalTimePoint için son tarihleri bağımsız değişken olarak içeren NN HAL 1.3 çağrıları:

  • 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. Böylece sürücüler, durumlarını daha iyi iletebilir ve uygulamaları daha sorunsuz bir şekilde kurtarabilir. 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. Sürücüdeki bir kaynak sınırlaması (Sürücüde çağrı için yeterli bellek olmaması gibi) nedeniyle görevin başarısız olduğunu belirtmek için iki RESOURCE_EXHAUSTED hata kodu kullanılabilir.

Her iki hatanın TRANSIENT sürümü, sorunun geçici olduğunu ve aynı göreve yapılacak gelecekteki çağrıların kısa bir gecikmenin ardından 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şullar altında bile görevin teslim tarihine kadar tamamlanmayacağını tahmin ettiğinde veya model yapısı gereği ç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, NNAPI VTS testlerinde (VtsHalNeuralnetworksV1_3Target) test edilir. Sürücünün geçersiz öncelikleri reddettiğinden emin olmak amacıyla bir dizi doğrulama testi (TestGenerated/ValidationTest#Test/) ve sürücünün teslim tarihlerini doğru şekilde ele aldığından emin olmak için DeadlineTest(TestGenerated/DeadlineTest#Test/) adlı bir dizi testi içerir.