Android 11'den başlayarak NNAPI, bir uygulamanın modellerinin göreceli önceliklerini, belirli bir modelin hazırlanması için beklenen maksimum süreyi ve modelin hazırlanması için beklenen maksimum süreyi belirtmesine izin vererek daha iyi hizmet kalitesi (QoS) sunar. Belirli bir infazın tamamlanması gerekiyor. Ayrıca Android 11, bir hizmetin bir hata oluştuğunda neyin yanlış gittiğini daha doğru bir şekilde belirtmesine olanak tanıyan ek NNAPI hata değerleri sunar, böylece istemci uygulaması daha iyi tepki verebilir ve durumu kurtarabilir.
Öncelik
Android 11 ve üzeri için modeller NN HAL 1.3 öncelikli olarak hazırlanmaktadır. Bu öncelik, aynı uygulamanın sahip olduğu diğer hazırlanmış modellere göredir. Yüksek öncelikli yürütmeler, düşük öncelikli yürütmelere göre daha fazla bilgi işlem kaynağı kullanabilir ve düşük öncelikli yürütmeleri engelleyebilir veya sonlandırabilir.
Açık bir bağımsız değişken olarak Priority
içeren NN HAL 1.3 çağrısı IDevice::prepareModel_1_3
. IDevice::prepareModelFromCache_1_3
önbellek bağımsız değişkenlerinde örtülü olarak Priority
içerdiğini unutmayın.
Sürücünün ve hızlandırıcının yeteneklerine bağlı olarak öncelikleri desteklemek için birçok olası strateji vardır. İşte birkaç strateji:
- Yerleşik öncelik desteğine sahip sürücüler için
Priority
alanını doğrudan gaz pedalına iletin. - 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.
Hızlandırıcıyı yüksek öncelikli modelleri yürütmek üzere serbest bırakmak için yürütülen düşük öncelikli modelleri duraklatın veya iptal edin. Bunu, düşük öncelikli modellere ulaşıldığında mevcut yürütmenin zamanından önce durdurulması gerekip gerekmediğini belirlemek için bir bayrak sorgulayan denetim noktaları ekleyerek veya modeli alt modellere bölerek ve alt model yürütmeleri arasındaki bayrağı sorgulayarak yapın. Öncelikli olarak hazırlanan modellerde denetim noktalarının veya alt modellerin kullanılmasının, NN HAL 1.3'ün altındaki sürümlerde önceliği olmayan modellerde mevcut olmayan ek yük getirebileceğini unutmayın.
- Önceliği 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 sürdürmek için bu yürütme bağlamını kullanın.
- Tam önleme desteği gerekli değildir, dolayısıyla yürütme bağlamının korunmasına gerek yoktur. NNAPI modeli yürütmeleri deterministik olduğundan, yürütmeler daha sonra sıfırdan yeniden başlatılabilir.
Android, hizmetlerin bir AID (Android UID) kullanımı yoluyla farklı arama uygulamaları arasında ayrım yapmasına olanak tanır. HIDL, çağıran uygulamanın UID'sini ::android::hardware::IPCThreadState::getCallingUid
yöntemi aracılığıyla almak için yerleşik mekanizmalara sahiptir. AID'lerin bir listesi libcutils/include/cutils/android_filesystem_config.h
dosyasında bulunabilir.
Son teslim tarihleri
Android 11'den itibaren model hazırlama ve yürütmeler 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 sürücünün 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 argümanı, görevin son tarihe kadar tamamlanmaması veya son tarihin geçmesi durumunda sürücüyü görevi iptal etmeye zorlamaz. Son tarih bağımsız değişkeni, sürücü içindeki bilgi işlem kaynaklarını serbest bırakmak ve son tarih olmadan mümkün olandan daha hızlı bir şekilde kontrolü uygulamaya geri döndürmek için kullanılabilir.
Bağımsız değişken olarak OptionalTimePoint
son tarihlerini içeren NN HAL 1.3 ç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 için, 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ülerin durumlarını daha iyi iletmesine ve uygulamaların daha sorunsuz bir şekilde iyileşmesine olanak tanır. Bunlar ErrorStatus
hata kodu değerleridir.
-
MISSED_DEADLINE_TRANSIENT
-
MISSED_DEADLINE_PERSISTENT
-
RESOURCE_EXHAUSTED_TRANSIENT
-
RESOURCE_EXHAUSTED_PERSISTENT
Android 10 veya önceki sürümlerde, bir sürücü yalnızca GENERAL_FAILURE
hata kodu aracılığıyla bir arızayı belirtebiliyordu. Android 11'den itibaren, iki MISSED_DEADLINE
hata kodu, son tarihe ulaşıldığı için veya sürücünün iş yükünün son tarihe kadar tamamlanmayacağını tahmin etmesi nedeniyle iş yükünün iptal edildiğini belirtmek için kullanılabilir. İki RESOURCE_EXHAUSTED
hata kodu, sürücünün çağrı için yeterli belleğe sahip olmaması gibi sürücü içindeki bir kaynak sınırlaması 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ılacak 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 yoğun kaynak kullanan bir işle meşgul olduğunda bu hata kodu döndürülmelidir; ancak sürücü önceki işle meşgul değilse yeni görev başarıyla tamamlanacaktır. Her iki hatanın 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şullar altında bile görevin son teslim tarihine kadar tamamlanmayacağını tahmin ettiğinde veya model doğası gereği çok büyük olduğunda ve sürücünün kaynaklarını aştığında bu hata kodu döndürülmelidir.
Doğrulama
Hizmet işlevselliğinin kalitesi NNAPI VTS testlerinde ( VtsHalNeuralnetworksV1_3Target
) test edilir. Bu, sürücünün geçersiz öncelikleri reddetmesini sağlamak için doğrulamaya yönelik bir dizi testi ( TestGenerated/ValidationTest#Test/
) ve sürücünün son teslim tarihlerini doğru şekilde işlediğinden emin olmak için DeadlineTest
( TestGenerated/DeadlineTest#Test/
) adı verilen bir dizi testi içerir.