Android Neural Networks API (NNAPI), uygulamaları çalıştırmak için tasarlanmış bir Android C API'dir Android cihazlarda makine öğrenimi için işlem açısından yoğun işlemler. NNAPI, daha yüksek düzeydeki kullanıcılar için temel bir işlevsellik katmanı sunmak çerçeveleri kullanarak TensorFlow Lite Nöral ağlar oluşturup eğiten Caffe2'ye bakalım. API kullanılabilir Android 8.1 (API düzeyi 27) veya sonraki sürümleri çalıştıran tüm Android cihazlarda.
NNAPI, Android cihazlardan önceki verilere uygulayarak çıkarımı destekler tanımlı modellerin eğitilmesidir. Çıkarım örnekleri arasında sınıflandırma yer alır. kullanıcı davranışını tahmin etme ve belirli bir soruna uygun yanıtları seçme anlamına gelir.
Cihaz üzerinde çıkarım yapmanın birçok avantajı vardır:
- Gecikme: Ağ bağlantısı üzerinden istek göndermeniz gerekmez ve yanıt bekleyin. Örneğin bu, video uygulamaları için çerçeveleri işleyecek şekilde yeniden üretiyoruz.
- Kullanılabilirlik: Uygulama, ağ kapsamının dışında olsa bile çalışır.
- Hız: Nöral ağ işlemeye özgü yeni donanım Tek başına genel amaçlı bir CPU'ya göre çok daha hızlı işlem sağlar.
- Gizlilik: Veriler Android cihazdan dışarı çıkmaz.
- Maliyet: Tüm hesaplamalar üzerinde işlem yapıldığında sunucu grubu gerekmez Android cihaz.
Geliştiricilerin göz önünde bulundurması gereken bazı ödünler de vardır:
- Sistem kullanımı: Nöral ağların değerlendirilmesi aşamasında bu da pil gücü kullanımını artırabilir. Şunları göz önünde bulundurmalısınız: Özellikle uygulamanız için bir sorun varsa, pil sağlığını izlemek oldukça basit bir araç haline geldi.
- Uygulama boyutu: Modellerinizin boyutuna dikkat edin. Modeller megabayt yer kaplar. APK'nızda büyük modeller gruplanıyorsa kullanıcılarınızı fazlaca etkileyecekse, söz konusu uygulamanın modellerini kullanarak veya uygulamanızı çalıştırdıktan sonra daha yüksek bir bulut ortamına sahip. NNAPI, çalıştırma işlevi sağlamaz modeller.
Bkz. Android Neural Networks API örneği adresine göz atın.
Neural Networks API çalışma zamanını anlama
NNAPI; makine öğrenimi kitaplıkları, çerçeveleri ve araçları tarafından çağrılmalıdır. Geliştiricilerin modellerini cihaz dışında eğitip Android'de dağıtmasına olanak tanıyan cihazlar. Uygulamalar genelde NNAPI'yi doğrudan kullanmaz, makine öğrenimi çerçevelerini kullanabilirsiniz. Bu çerçeveler de Desteklenen cihazlarda donanım hızlandırmalı çıkarım işlemleri gerçekleştirmek için NNAPI.
Bir uygulamanın gereksinimlerine ve Android'deki donanım özelliklerine dayanır Android’in nöral ağı çalışma zamanı sayesinde cihaz üzerinde kullanılabilir işlemciler genelindeki işlem iş yükü ve nöral ağ donanımı, grafik işlem birimleri (GPU'lar) ve dijital sinyal veri işleyenler için de geçerlidir.
Özel bir tedarikçi sürücüsü bulunmayan Android cihazlarda NNAPI çalışma zamanı istekleri CPU'da yürütür.
Şekil 1'de NNAPI için üst düzey sistem mimarisi gösterilmiştir.
'nı inceleyin.Neural Networks API programlama modeli
NNAPI kullanarak hesaplamalar yapmak için öncelikle yönlendirilmiş bir yapılacak hesaplamaları tanımlayan grafik. Bu hesaplama grafiği, (örneğin, bir alt kümeden aşağı aktarılan ağırlıklar ve sapmalar) makine öğrenimi çerçevesi) NNAPI çalışma zamanı değerlendirmesi için model oluşturur.
NNAPI dört ana özetleme kullanır:
- Model: Matematiksel işlemlerin ve sabit değerin hesaplama grafiği
öğrenilen değerleri ifade eder. Bu işlemler,
nöral ağlardır. 2 boyutlu (2D)
konvolüsyon,
lojistik
(sigmoid)
etkinleştirme,
düzeltilmiş doğrusal
(ReLU) etkinleştirmesi ve daha fazlası. Model oluşturma, eşzamanlı bir işlemdir.
Başarılı bir şekilde oluşturulduktan sonra ileti dizilerinde ve derlemelerde yeniden kullanılabilir.
NNAPI'de bir model
ANeuralNetworksModel
örneğidir. - Derleme: Bir NNAPI modelini aşağıdaki örnekte derlemek için kullanılan bir yapılandırmayı temsil eder:
alt düzey kod. Derleme oluşturma eşzamanlı bir işlemdir. Bir kez
başarıyla oluşturulduktan sonra, ileti dizilerinde ve yürütmelerde yeniden kullanılabilir. İçinde
her derleme temsil edilir.
ANeuralNetworksCompilation
örneğidir. - Bellek: Paylaşılan belleği, bellekle eşlenen dosyaları ve benzer belleği temsil eder
tamponları kullanır. Bellek arabelleği kullanmak, NNAPI çalışma zamanı verilerini sürücülere aktarmasına olanak tanır.
verimli bir şekilde
işlemesini sağlar. Uygulamalar genellikle
bir modeli tanımlamak için gereken her tensörü içerir. Hafızayı da kullanabilirsiniz.
arabelleğe alır. NNAPI'de
her bellek arabelleği
ANeuralNetworksMemory
örneğidir. Yürütme: Bir NNAPI modelini bir dizi girişe uygulama ve yardımcı olur. Yürütme işlemi eşzamanlı veya eşzamansız olarak gerçekleştirilebilir.
Eşzamansız yürütme için birden fazla iş parçacığı aynı yürütmeyi bekleyebilir. Bu yürütme işlemi tamamlandığında, tüm ileti dizileri yayınlandı.
NNAPI'de her yürütme
ANeuralNetworksExecution
örneğidir.
Şekil 2'de temel programlama akışı gösterilmektedir.
'nı inceleyin.Bu bölümün geri kalanında, NNAPI modelinizi hesaplama yapma, modeli derleme ve derlenen modeli yürütme.
Eğitim verilerine erişim sağlama
Eğitilen ağırlık ve ağırlıklandırma verileriniz büyük olasılıkla bir dosyada depolanır. Sağlamak için
Bu verilere etkili erişimle NNAPI çalışma zamanı, bir
ANeuralNetworksMemory
öğesini çağırarak
ANeuralNetworksMemory_createFromFd()
işlevini kullanabilir ve açılan veri dosyasının dosya tanımlayıcısını iletebilirsiniz. Ayrıca
bellek koruma bayraklarını ve paylaşılan bellek bölgesinin
dosya içinde başlar.
// Create a memory buffer from the file that contains the trained data
ANeuralNetworksMemory* mem1 = NULL;
int fd = open("training_data", O_RDONLY);
ANeuralNetworksMemory_createFromFd(file_size, PROT_READ, fd, 0, &mem1);
Bu örnekte yalnızca bir
ANeuralNetworksMemory
Örneğin tüm ağırlıklarımız için birden fazla
Birden fazla dosya için ANeuralNetworksMemory
örneği.
Yerel donanım arabelleklerini kullan
Yerel donanım arabelleklerini kullanabilirsiniz
giriş, çıkış ve sabit işlem göreni değerler kullanır. Bazı durumlarda,
NNAPI hızlandırıcı erişebilir
AHardwareBuffer
veya sürücünün verileri kopyalaması gerekmez. AHardwareBuffer
alanında çok sayıda
farklı yapılandırmalara sahiptir ve her NNAPI hızlandırıcı tüm
izin vermez. Bu sınırlama nedeniyle, ilgili sınırlamaların
şurada listeleniyor:
ANeuralNetworksMemory_createFromAHardwareBuffer
referans belgeleri
Böylece derleme ve yürütme işlemlerinin
tamamlandığından emin olmak için
AHardwareBuffer
kullanan kişiler,
cihaz ataması kullanarak hızlandırıcıyı belirtin.
NNAPI çalışma zamanının bir AHardwareBuffer
nesnesine erişmesine izin vermek için
ANeuralNetworksMemory
öğesini çağırarak
ANeuralNetworksMemory_createFromAHardwareBuffer
fonksiyonunu göstererek
AHardwareBuffer
nesnesini ifade eder:
// Configure and create AHardwareBuffer object AHardwareBuffer_Desc desc = ... AHardwareBuffer* ahwb = nullptr; AHardwareBuffer_allocate(&desc, &ahwb); // Create ANeuralNetworksMemory from AHardwareBuffer ANeuralNetworksMemory* mem2 = NULL; ANeuralNetworksMemory_createFromAHardwareBuffer(ahwb, &mem2);
NNAPI'nin artık AHardwareBuffer
nesnesine erişmesi gerekmediğinde
karşılık gelen ANeuralNetworksMemory
örneği:
ANeuralNetworksMemory_free(mem2);
Not:
- Tekliflerinizi otomatikleştirmek ve optimize etmek için
AHardwareBuffer
yalnızca arabelleğin tamamı için geçerlidir; şununla kullanamazsınız: birARect
parametresidir. - NNAPI çalışma zamanı temizlenmiyor hazırlanır. Giriş ve çıkış tamponlarının her zaman erişilebilir hale getirebilirsiniz.
- için dosya tanımlayıcılarını senkronize edin.
- Şu yeri içeren
AHardwareBuffer
için: özel biçimler ve kullanım bitleri vardır. Bu, tedarikçi firmanın uygulamasına bağlıdır temizlik malzemesinin temizlenmesinden istemcinin mi yoksa sürücünün mi sorumlu önbellek.
Model
Model, NNAPI'deki temel hesaplama birimidir. Her model tanımlanmış işleyen veya işlem gücüne sahip olur.
İşlem görenler
İşlemciler, grafiği tanımlamada kullanılan veri nesneleridir. Bunlar arasında, ve çıkışları, yani bu verileri içeren ara düğümler bir işlemden diğerine geçer ve bu işlemden geçen sabit değerler bu işlemleri yapabilirsiniz.
NNAPI modellerine eklenebilecek iki tür işlenen vardır: skalerler ve tensörler olarak değiştirin.
Skaler, tek bir değeri temsil eder. NNAPI, boole'de skaler değerleri destekler. 16 bit kayan nokta, 32 bit kayan nokta, 32 bit tam sayı ve imzasız 32 bit tam sayı biçimleri.
NNAPI'deki çoğu işlem tensörleri içerir. Tensörler, n boyutlu dizilerdir. NNAPI, 16 bit kayan noktalı, 32 bit kayan noktalı, 8 bitli tensörleri destekler ölçülmüş, 16 bit nicelenmiş, 32 bit tam sayı ve 8 bit boole değerleri.
Örneğin, Şekil 3'te iki işlem içeren bir model gösterilmektedir: ve ardından bir çarpma işlemi gelir. Model, bir giriş tensörü alır ve çıkış tensörü için de geçerlidir.
'nı inceleyin.Yukarıdaki modelin yedi işleneni vardır. Bu işlenenler, dolaylı olarak modele eklendikleri sıranın dizinini de içerir. İlk işlenen ekinin dizini 0, ikincisinin dizini 1'dir ve bu şekilde devam eder. 1, 2, 3, ve 5 sabit işlenendir.
İşlem görenleri hangi sırayla eklediğiniz önemli değildir. Örneğin, model çıkış işleneni, eklenen ilk olabilir. Önemli olan, işlenene atıfta bulunurken doğru dizin değeri.
İşlem görenlerin türleri vardır. Bunlar modele eklendiklerinde belirtilir.
İşlem gören, bir modelin hem girişi hem çıkışı olarak kullanılamaz.
Her işlenen; model girişi, sabit veya çıkış işleneni olmalıdır. sahip olmanız gerekir.
İşlem görenleri kullanma hakkında daha fazla bilgi için bkz. İşlem görenler hakkında daha fazla bilgi edinin.
İşlemler
Bir işlem, yapılacak hesaplamaları belirtir. Her işlem şu öğelerden oluşur:
- bir işlem türü (ör. toplama, çarpma, evrişim),
- İşlemin giriş için kullandığı işlem görenlerin dizinlerinin listesi ve
- işlemin çıkış için kullandığı işlenenlerin dizinlerinin listesi.
Bu listelerdeki sıra önemlidir; bkz. Beklenen girişler için NNAPI API referansı ve çıkışları arasında geçiş yapacaktır.
Bir işlemin tükettiği veya ürettiği işlem görenleri modele eklemeniz gerekir kontrol edin.
İşlemleri ekleme sıranız önemli değildir. NNAPI, işlem grafiğinin oluşturduğu bağımlılıkları işlemlerin yürütüleceği sırayı belirler.
NNAPI'nin desteklediği işlemler aşağıdaki tabloda özetlenmiştir:
API düzeyi 28'de bilinen sorun: İletilirken
ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
tensörleri
ANEURALNETWORKS_PAD
şu anda Android 9 (API düzeyi 28) ve sonraki sürümlerde kullanılabilen
NNAPI'den alınan çıkış, üst düzey makine öğreniminden elde edilen çıkışla eşleşmeyebilir
çerçeveler, örneğin
TensorFlow Lite. Siz
yalnızca
ANEURALNETWORKS_TENSOR_FLOAT32
.
Bu sorun, Android 10 (API düzeyi 29) ve sonraki sürümlerde çözülmüştür.
Modeller oluşturun
Aşağıdaki örnekte, şekil 3.
Modeli oluşturmak için aşağıdaki adımları izleyin:
Şunu çağırın:
ANeuralNetworksModel_create()
işlevini kullanın.ANeuralNetworksModel* model = NULL; ANeuralNetworksModel_create(&model);
Numarayı çağırarak işlenenleri modelinize ekleyin
ANeuralNetworks_addOperand()
. Veri türleriANeuralNetworksOperandType
veri yapısı.// In our example, all our tensors are matrices of dimension [3][4] ANeuralNetworksOperandType tensor3x4Type; tensor3x4Type.type = ANEURALNETWORKS_TENSOR_FLOAT32; tensor3x4Type.scale = 0.f; // These fields are used for quantized tensors tensor3x4Type.zeroPoint = 0; // These fields are used for quantized tensors tensor3x4Type.dimensionCount = 2; uint32_t dims[2] = {3, 4}; tensor3x4Type.dimensions = dims;
// We also specify operands that are activation function specifiers ANeuralNetworksOperandType activationType; activationType.type = ANEURALNETWORKS_INT32; activationType.scale = 0.f; activationType.zeroPoint = 0; activationType.dimensionCount = 0; activationType.dimensions = NULL;
// Now we add the seven operands, in the same order defined in the diagram ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 0 ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 1 ANeuralNetworksModel_addOperand(model, &activationType); // operand 2 ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 3 ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 4 ANeuralNetworksModel_addOperand(model, &activationType); // operand 5 ANeuralNetworksModel_addOperand(model, &tensor3x4Type); // operand 6Sizin belirlediğiniz ağırlıklar ve sapmalar gibi sabit değerlere sahip edinilen bilgileri kullanıyorsanız,
ANeuralNetworksModel_setOperandValue()
veANeuralNetworksModel_setOperandValueFromMemory()
işlevlerine dahildir.Aşağıdaki örnekte, eğitim veri dosyasından sabit değerler belirledik. eğitim verileri.
// In our example, operands 1 and 3 are constant tensors whose values were // established during the training process const int sizeOfTensor = 3 * 4 * 4; // The formula for size calculation is dim0 * dim1 * elementSize ANeuralNetworksModel_setOperandValueFromMemory(model, 1, mem1, 0, sizeOfTensor); ANeuralNetworksModel_setOperandValueFromMemory(model, 3, mem1, sizeOfTensor, sizeOfTensor);
// We set the values of the activation operands, in our example operands 2 and 5 int32_t noneValue = ANEURALNETWORKS_FUSED_NONE; ANeuralNetworksModel_setOperandValue(model, 2, &noneValue, sizeof(noneValue)); ANeuralNetworksModel_setOperandValue(model, 5, &noneValue, sizeof(noneValue));Yönlendirilmiş grafikteki hesaplama yapmak istediğiniz her işlem için işlemini modelinize
ANeuralNetworksModel_addOperation()
işlevini kullanın.Bu çağrının parametreleri olarak uygulamanız şunları sağlamalıdır:
- işlem türü
- giriş değerlerinin sayısı
- giriş işlenenleri için dizin dizisi
- çıkış değerlerinin sayısı
- çıkış işlenenleri için dizin dizisi
İşlem görenin, aynı öğenin hem girişi hem çıkışı için kullanılamayacağını unutmayın. işlemidir.
// We have two operations in our example // The first consumes operands 1, 0, 2, and produces operand 4 uint32_t addInputIndexes[3] = {1, 0, 2}; uint32_t addOutputIndexes[1] = {4}; ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_ADD, 3, addInputIndexes, 1, addOutputIndexes);
// The second consumes operands 3, 4, 5, and produces operand 6 uint32_t multInputIndexes[3] = {3, 4, 5}; uint32_t multOutputIndexes[1] = {6}; ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_MUL, 3, multInputIndexes, 1, multOutputIndexes);Modelin hangi işlenenleri giriş ve çıkış olarak değerlendirmesi gerektiğini
ANeuralNetworksModel_identifyInputsAndOutputs()
işlevini kullanın.// Our model has one input (0) and one output (6) uint32_t modelInputIndexes[1] = {0}; uint32_t modelOutputIndexes[1] = {6}; ANeuralNetworksModel_identifyInputsAndOutputs(model, 1, modelInputIndexes, 1 modelOutputIndexes);
İsteğe bağlı olarak,
ANEURALNETWORKS_TENSOR_FLOAT32
kadar düşük bir aralık veya hassasiyetle hesaplanabilmesine IEEE 754 16 bit kayan nokta biçimi içinANeuralNetworksModel_relaxComputationFloat32toFloat16()
.ANeuralNetworksModel_finish()
numaralı telefonu arayın modelinizin tanımını tamamlayın. Hiç hata yoksa bu işlevi, şunun sonuç kodunu döndürür:ANEURALNETWORKS_NO_ERROR
.ANeuralNetworksModel_finish(model);
Bir model oluşturduktan sonra bu modeli istediğiniz sayıda derleyebilir ve her bir modeli yürütebilirsiniz. derlemenize izin verir.
Akışı kontrol etme
NNAPI modeline kontrol akışı eklemek için aşağıdakileri yapın:
İlgili yürütme alt grafiklerini (
then
veelse
alt grafikleri) oluşturun birIF
ifadesi,WHILE
döngüsü içincondition
vebody
alt grafikleri) bağımsızANeuralNetworksModel*
modelleri olarak:ANeuralNetworksModel* thenModel = makeThenModel(); ANeuralNetworksModel* elseModel = makeElseModel();
Kontrol akışı:
ANeuralNetworksOperandType modelType = { .type = ANEURALNETWORKS_MODEL, }; ANeuralNetworksModel_addOperand(model, &modelType); // kThenOperandIndex ANeuralNetworksModel_addOperand(model, &modelType); // kElseOperandIndex ANeuralNetworksModel_setOperandValueFromModel(model, kThenOperandIndex, &thenModel); ANeuralNetworksModel_setOperandValueFromModel(model, kElseOperandIndex, &elseModel);
Kontrol akışı işlemini ekleyin:
uint32_t inputs[] = {kConditionOperandIndex, kThenOperandIndex, kElseOperandIndex, kInput1, kInput2, kInput3}; uint32_t outputs[] = {kOutput1, kOutput2}; ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_IF, std::size(inputs), inputs, std::size(output), outputs);
.
Derleme
Derleme adımı, modelinizin hangi işlemcilerde yürütüleceğini belirler ve ilgili sürücülerden uygulamayı yürütmeye hazırlanmalarını istiyor. Bu modelinizin işlemcilerine özel makine kodunun oluşturulmasını içerir üzerinde çalışır.
Model derlemek için şu adımları uygulayın:
Şunu çağırın:
ANeuralNetworksCompilation_create()
işlevini kullanın.// Compile the model ANeuralNetworksCompilation* compilation; ANeuralNetworksCompilation_create(model, &compilation);
İsteğe bağlı olarak, cihaz ataması özelliğini kullanarak hangi cihazlarda yürütüleceğini seçin.
İsterseniz çalışma zamanının pil gücü arasında nasıl denge kuracağını etkileyebilirsiniz. ve yürütme hızını artırır. Bu işlemi,
ANeuralNetworksCompilation_setPreference()
.// Ask to optimize for low power consumption ANeuralNetworksCompilation_setPreference(compilation, ANEURALNETWORKS_PREFER_LOW_POWER);
Belirtebileceğiniz tercihler şunlardır:
ANEURALNETWORKS_PREFER_LOW_POWER
: Uygulamanın, pil tüketimini en aza indirecek şekilde uygulanmasını tercih edin. Bu istenen bir şey derlemeler için hazırlandı.ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER
: Bu soruna neden olsa bile en kısa sürede tek bir yanıt vermeyi tercih edin güç tüketimini artırır. Bu, varsayılan ayardır.ANEURALNETWORKS_PREFER_SUSTAINED_SPEED
: Birbirini izleyen karelerin performansını en üst düzeye çıkarmayı tercih edin. Örneğin, karelerin işlenmesine neden olur.
İsterseniz derlemeleri önbelleğe almak için
ANeuralNetworksCompilation_setCaching
.// Set up compilation caching ANeuralNetworksCompilation_setCaching(compilation, cacheDir, token);
getCodeCacheDir()
kullanıncacheDir
için. Belirtilentoken
, içindeki her model için benzersiz olmalıdır takip edebilirsiniz.Şu kodu çağırarak derleme tanımını tamamlayın:
ANeuralNetworksCompilation_finish()
. Hata yoksa bu işlev şunun sonuç kodunu döndürür:ANEURALNETWORKS_NO_ERROR
.ANeuralNetworksCompilation_finish(compilation);
Cihaz bulma ve atama
NNAPI, Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran Android cihazlarda makine öğrenimi çerçeve kitaplıklarının ve uygulamalarının kullanılabilir cihazlarla ilgili bilgi edinin ve kullanılacak cihazları belirtin birkaç adım var. Kullanılabilir cihazlar hakkında bilgi vermek uygulamaların şunları almasını sağlar: bilinen iki sürücüden kaçınmak için bir cihazda bulunan sürücülerin arasındaki farkları konuşacağız. Uygulamalara, hangi cihazların abone olacağını belirtmek için bir modelin farklı bölümlerini yürütebildiğinden, uygulamalar Android için dağıtıldığı cihazları belirtir.
Cihaz bulma
Tekliflerinizi otomatikleştirmek ve optimize etmek için
ANeuralNetworks_getDeviceCount
kullanılabilir cihaz sayısını görebilirsiniz. Her cihaz için
ANeuralNetworks_getDevice
o cihaza referans için ANeuralNetworksDevice
örneği ayarlayın.
Cihaz referansı edindikten sonra Google Play Yardım Merkezi'ndeki şu işlevleri kullanarak yapabilirsiniz:
ANeuralNetworksDevice_getFeatureLevel
ANeuralNetworksDevice_getName
ANeuralNetworksDevice_getType
ANeuralNetworksDevice_getVersion
Cihaz ataması
Tekliflerinizi otomatikleştirmek ve optimize etmek için
ANeuralNetworksModel_getSupportedOperationsForDevices
kullanarak bir modelin belirli cihazlarda hangi işlemlerin çalıştırılabileceğini keşfedebilirsiniz.
Yürütme için hangi hızlandırıcıların kullanılacağını kontrol etmek için
ANeuralNetworksCompilation_createForDevices
(ANeuralNetworksCompilation_create
yerine).
Oluşturulan ANeuralNetworksCompilation
nesnesini normal şekilde kullanın.
Sağlanan model aşağıdaki gibi işlemler içeriyorsa, işlev bir hata döndürür:
seçilen cihazlar tarafından desteklenmiyor.
Birden fazla cihaz belirtilirse dağıtımdan çalışma zamanı sorumludur pek çok farklı cihazda çalıştım.
Diğer cihazlara benzer şekilde NNAPI CPU uygulaması bir
nnapi-reference
adında ve türde ANeuralNetworksDevice
ANEURALNETWORKS_DEVICE_TYPE_CPU
. Ararken
ANeuralNetworksCompilation_createForDevices
, CPU uygulaması
model derleme ve yürütme hata durumlarını işlemek için kullanılır.
Bir modeli, alan adındaki alt modellere ayırmak uygulamanın
çalıştırılabilir. Manuel işlem gerektirmeyen uygulamalar
bölümlendirme, daha basit şekilde
ANeuralNetworksCompilation_create
hızlandırmak için mevcut tüm cihazları (CPU dahil) kullanmalarını
modeli. Model, belirttiğiniz cihazlar tarafından tam olarak desteklenmiyorsa
ANeuralNetworksCompilation_createForDevices
kullanılıyor,
ANEURALNETWORKS_BAD_DATA
hatası döndürülür.
Model bölümlendirme
Model için birden fazla cihaz varsa NNAPI çalışma zamanı
yayan
ekibin çalışmasını cihazlar arasında paylaştırır. Örneğin, birden fazla cihaz
belirtilen tüm değerler ANeuralNetworksCompilation_createForDevices
diğer kişiler de göz önünde bulundurulacaktır. CPU cihazın
listede olmadığından CPU yürütmesi devre dışı bırakılacak. ANeuralNetworksCompilation_create
kullanılırken
CPU dahil mevcut tüm cihazlar dikkate alınır.
Dağıtım, kullanılabilir cihazlar listesinden seçim yaparak yapılır.
modeldeki işlemleri, işlemi destekleyen cihazı ve
en iyi performansı (ör. en hızlı yürütme süresini veya
tarafından belirtilen yürütme tercihine bağlı olarak en düşük güç tüketimi
teslim edilir. Bu bölümlendirme algoritması,
verimsizlikleri oluşturur. Bu nedenle,
birden fazla işlemci belirtmeniz (
ANeuralNetworksCompilation_createForDevices
veya dolaylı olarak
ANeuralNetworksCompilation_create
), elde edilen sonucun profilini çıkarmak ve
bir uygulamadır.
Modelinizin NNAPI tarafından nasıl bölümlendirildiğini anlamak için
Bir mesaj için Android günlükleri (ExecutionPlan
etiketiyle bilgi düzeyinde):
ModelBuilder::findBestDeviceForEachOperation(op-name): device-index
op-name
, işlemin grafikteki açıklayıcı adıdır ve
device-index
, cihaz listesindeki aday cihazın dizinidir.
Bu liste, ANeuralNetworksCompilation_createForDevices
için sağlanan giriştir
veya ANeuralNetworksCompilation_createForDevices
kullanıyorsanız cihazların listesi
ANeuralNetworks_getDeviceCount
ve üzeri kullanılarak tüm cihazlarda yineleme yapıldığında döndürülür
ANeuralNetworks_getDevice
.
Mesaj (ExecutionPlan
etiketiyle bilgi düzeyinde):
ModelBuilder::partitionTheWork: only one best device: device-name
Bu mesaj, cihazda tüm grafiğin hızlandırıldığını gösterir
device-name
Uygulama
Yürütme adımı, modeli bir dizi girişe uygular ve uygulamanızın bir veya daha fazla kullanıcı arabelleğine ya da bellek alanına tahsis edilmiştir.
Derlenmiş bir modeli yürütmek için şu adımları izleyin:
Şunu çağırın:
ANeuralNetworksExecution_create()
işlevini kullanın.// Run the compiled model against a set of inputs ANeuralNetworksExecution* run1 = NULL; ANeuralNetworksExecution_create(compilation, &run1);
Uygulamanızın hesaplama için giriş değerlerini nerede okuyacağını belirtin. Uygulamanız bir kullanıcı arabelleğinden veya ayrılan bir bellek alanından giriş değerlerini okuyabilir telefonla arayarak
ANeuralNetworksExecution_setInput()
veyaANeuralNetworksExecution_setInputFromMemory()
tıklayın.// Set the single input to our sample model. Since it is small, we won't use a memory buffer float32 myInput[3][4] = { ...the data... }; ANeuralNetworksExecution_setInput(run1, 0, NULL, myInput, sizeof(myInput));
.Uygulamanızın çıkış değerlerini nereye yazacağını belirtin. Uygulamanız, öğesini çağırarak kullanıcı arabelleğine veya ayrılan bellek alanına
ANeuralNetworksExecution_setOutput()
veyaANeuralNetworksExecution_setOutputFromMemory()
tıklayın.// Set the output float32 myOutput[3][4]; ANeuralNetworksExecution_setOutput(run1, 0, NULL, myOutput, sizeof(myOutput));
ANeuralNetworksExecution_startCompute()
işlevini kullanın. Hata yoksa bu işlev şunun sonuç kodunu döndürür:ANEURALNETWORKS_NO_ERROR
.// Starts the work. The work proceeds asynchronously ANeuralNetworksEvent* run1_end = NULL; ANeuralNetworksExecution_startCompute(run1, &run1_end);
ANeuralNetworksEvent_wait()
numaralı telefonu arayın işlevini çağırın. Yürütme işlemi başarılı olursa bu işlev şunun sonuç kodunu döndürür:ANEURALNETWORKS_NO_ERROR
. Bekleme, yürütmeyi başlatandan farklı bir iş parçacığında yapılabilir.// For our example, we have no other work to do and will just wait for the completion ANeuralNetworksEvent_wait(run1_end); ANeuralNetworksEvent_free(run1_end); ANeuralNetworksExecution_free(run1);
Dilerseniz aşağıdaki adımları uygulayarak derlenen modele farklı bir giriş grubu uygulayabilirsiniz: aynı derleme örneğini kullanarak yeni bir
ANeuralNetworksExecution
örneğidir.// Apply the compiled model to a different set of inputs ANeuralNetworksExecution* run2; ANeuralNetworksExecution_create(compilation, &run2); ANeuralNetworksExecution_setInput(run2, ...); ANeuralNetworksExecution_setOutput(run2, ...); ANeuralNetworksEvent* run2_end = NULL; ANeuralNetworksExecution_startCompute(run2, &run2_end); ANeuralNetworksEvent_wait(run2_end); ANeuralNetworksEvent_free(run2_end); ANeuralNetworksExecution_free(run2);
Eşzamanlı yürütme
Eşzamansız yürütme, iş parçacıklarını oluşturmak ve senkronize etmek için zaman harcar. Ayrıca gecikme, en uzun süre, değişkenlik gösteren bir iş parçacığının bildirildiği zaman arasında 500 mikrosaniyeye kadar olan gecikmeler veya bağlı olduğu süreyi gösterir.
Gecikmeyi iyileştirmek için bunun yerine bir uygulamayı eşzamanlı hale getirmeye yönlendirebilirsiniz
çağrısından yararlanır. Bu çağrı, yalnızca bir çıkarım
tam olarak tamamlanması
anlamına gelir. Bunun yerine
arama
ANeuralNetworksExecution_startCompute
için çalışma zamanına yönelik eşzamansız bir çıkarım çağrısı için
ANeuralNetworksExecution_compute
çağrısında bulunmayı da unutmayın. Bir
ANeuralNetworksExecution_compute
, ANeuralNetworksEvent
kabul etmiyor ve
ANeuralNetworksEvent_wait
numaralı telefona yapılan bir aramayla eşlenmedi.
Seri çekim yürütmeler
NNAPI, Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran Android cihazlarda seri çekimi destekler
proje yaşam döngüsü boyunca
ANeuralNetworksBurst
nesnesini tanımlayın. Seri çekim yürütmeler, aynı derlemeyi içeren bir dizi yürütmedir
hızlı art arda gerçekleşen (ör. bir kamera kareleri üzerinde çalışan işlemler)
örnek ses kayıtları kullanılabilir. ANeuralNetworksBurst
nesne kullanıldığında
Bu da hızlandırıcılara kaynakların kısa sürede yürütülmesini sağlayacağı için
tekrar kullanılmalı ve hızlandırıcıların belirli bir süre içinde
çalışmaya devam eder.
ANeuralNetworksBurst
, normal yürütmede yalnızca küçük bir değişiklik yapıyor
yol'a dokunun. Seri çekim nesnesini
ANeuralNetworksBurst_create
aşağıdaki kod snippet'inde gösterildiği gibidir:
// Create burst object to be reused across a sequence of executions ANeuralNetworksBurst* burst = NULL; ANeuralNetworksBurst_create(compilation, &burst);
Seri çekim yürütmeler eşzamanlıdır. Ancak,
ANeuralNetworksExecution_compute
her çıkarımı yapmak için, her bir çıkarımı
ANeuralNetworksExecution
işleve yapılan çağrılarda aynı ANeuralNetworksBurst
öğesine sahip nesneler
ANeuralNetworksExecution_burstCompute
// Create and configure first execution object // ... // Execute using the burst object ANeuralNetworksExecution_burstCompute(execution1, burst); // Use results of first execution and free the execution object // ... // Create and configure second execution object // ... // Execute using the same burst object ANeuralNetworksExecution_burstCompute(execution2, burst); // Use results of second execution and free the execution object // ...
Şununla ANeuralNetworksBurst
nesnesini serbest bırakın:
ANeuralNetworksBurst_free
gerektiğinde de kullanabilirsiniz.
// Cleanup ANeuralNetworksBurst_free(burst);
Eşzamansız komut sıraları ve sınırlı yürütme
NNAPI, Android 11 ve sonraki sürümlerde ek bir planlama yöntemini destekler.
ANeuralNetworksExecution_startComputeWithDependencies()
yöntemidir. Bu yöntemi kullandığınızda yürütme, bağlı olan
işaretlenecek etkinliklerdir. Yürütme işlemi tamamlandıktan sonra
ve çıkışlar kullanıma hazır olduğunda, döndürülen etkinlik
işaret eder.
Yürütmeyi gerçekleştiren cihazlara bağlı olarak etkinlik,
çitleri senkronize edin. Siz
aramalı
ANeuralNetworksEvent_wait()
etkinliği beklemek ve yürütmenin kullandığı kaynakları geri yüklemek. Siz
içe aktarma işini bir etkinlik nesnesine aktarmak için
ANeuralNetworksEvent_createFromSyncFenceFd()
ve bir etkinlik nesnesindeki senkronizasyon sınırlarını dışa aktarabilirsiniz.
ANeuralNetworksEvent_getSyncFenceFd()
.
Dinamik olarak boyutlandırılmış çıkışlar
Çıkış boyutunun girişe bağlı olduğu modelleri desteklemek için
verileri (yani model yürütülürken boyutun belirlenemediği)
zaman—kullan
ANeuralNetworksExecution_getOutputOperandRank
ve
ANeuralNetworksExecution_getOutputOperandDimensions
.
Aşağıdaki kod örneğinde bunun nasıl yapılacağı gösterilmektedir:
// Get the rank of the output uint32_t myOutputRank = 0; ANeuralNetworksExecution_getOutputOperandRank(run1, 0, &myOutputRank); // Get the dimensions of the output std::vector<uint32_t> myOutputDimensions(myOutputRank); ANeuralNetworksExecution_getOutputOperandDimensions(run1, 0, myOutputDimensions.data());
Temizle
Temizleme adımı, hesaplamadır.
// Cleanup ANeuralNetworksCompilation_free(compilation); ANeuralNetworksModel_free(model); ANeuralNetworksMemory_free(mem1);
Hata yönetimi ve CPU yedeği
Bölümlendirme sırasında bir hata oluşursa, sürücü bir kodu derleyemezse modelin derlenmiş (parça) bir modeli çalıştıramazsa sürücü, NNAPI, kendi CPU uygulamasını kullanmaya devam edebilir. Bunun için anlamına gelir.
NNAPI istemcisi, işlemin optimize edilmiş sürümlerini içeriyorsa ( TFLite gibi), CPU yedeğini devre dışı bırakmak ve İstemcinin optimize edilmiş işlem uygulamasıyla hataları ele alma.
Android 10'da derleme,
ANeuralNetworksCompilation_createForDevices
, ardından CPU yedeği devre dışı bırakılacak.
Android P'de, sürücüde yürütme başarısız olursa NNAPI yürütme işlemi CPU'ya geri döner.
Bu durum, ANeuralNetworksCompilation_create
yerine Android 10'da da geçerlidir.
ANeuralNetworksCompilation_createForDevices
daha kullanıldı.
İlk yürütme bu tek bölüm için geri döner ve hâlâ başarısız olursa modelin tamamını CPU'da yeniden dener.
Bölümlendirme veya derleme başarısız olursa modelin tamamı CPU'da denenir.
Bazı işlemlerin CPU'da desteklenmediği durumlar ve derleme veya yürütme yöntemlerinin geri çekilmesine neden olacağı anlamına gelebilir.
CPU yedeğini devre dışı bıraktıktan sonra bile modelde hâlâ işlemler olabilir
önceden planlamaya
başladım. CPU, sağlanan işlemciler listesindeyse
ve ANeuralNetworksCompilation_createForDevices
arasında yalnızca
olduğunu iddia eden bir işleyen veya
performansa sahip olması durumunda, bu işlem birincil (yedek olmayan) olarak seçilir.
yürütür.
CPU yürütmesi olmadığından emin olmak için ANeuralNetworksCompilation_createForDevices
komutunu kullanın
nnapi-reference
cihaz listesinden hariç tutuldu.
Android P'den başlayarak, çalıştırma sırasında yedeği devre dışı bırakmak mümkündür
HATA AYIKLAMA, debug.nn.partition
özelliği 2 değerine ayarlanarak derleme oluşturur.
Bellek alanları
NNAPI, Android 11 ve sonraki sürümlerde ayırıcı sağlayan bellek alan adlarını destekler. opak anılar için arayüz oluşturuyoruz. Bu, uygulamaların cihazda yerel ayarı geçirmesine olanak tanır yürütmelerde hafızalarda tutulur. Böylece NNAPI, verileri kopyalamaz veya dönüştürmez. gereksiz yere uygulamaz.
Bellek alanı özelliği, çoğunlukla dahili ve harici ve istemci tarafına sık sık erişmesi gerekmez. Örnekler bu tür tensörler, dizi modellerindeki durum tensörlerini içerir. Şuna ihtiyacı olan tensörler için: yerine paylaşılan bellek havuzlarını kullanın.
Opak bellek ayırmak için aşağıdaki adımları uygulayın:
Şunu çağırın:
ANeuralNetworksMemoryDesc_create()
işlevini kullanın:// Create a memory descriptor ANeuralNetworksMemoryDesc* desc; ANeuralNetworksMemoryDesc_create(&desc);
İstenen tüm giriş ve çıkış rollerini çağırmak için şunu çağırın:
ANeuralNetworksMemoryDesc_addInputRole()
veANeuralNetworksMemoryDesc_addOutputRole()
.// Specify that the memory may be used as the first input and the first output // of the compilation ANeuralNetworksMemoryDesc_addInputRole(desc, compilation, 0, 1.0f); ANeuralNetworksMemoryDesc_addOutputRole(desc, compilation, 0, 1.0f);
İsteğe bağlı olarak,
ANeuralNetworksMemoryDesc_setDimensions()
.// Specify the memory dimensions uint32_t dims[] = {3, 4}; ANeuralNetworksMemoryDesc_setDimensions(desc, 2, dims);
Şu kodu çağırarak açıklayıcı tanımını kesinleştirin:
ANeuralNetworksMemoryDesc_finish()
.ANeuralNetworksMemoryDesc_finish(desc);
Açıklayıcıyı
ANeuralNetworksMemory_createFromDesc()
.// Allocate two opaque memories with the descriptor ANeuralNetworksMemory* opaqueMem; ANeuralNetworksMemory_createFromDesc(desc, &opaqueMem);
Artık ihtiyaç duymadığınızda bellek tanımlayıcısını boşaltın.
ANeuralNetworksMemoryDesc_free(desc);
İstemci, oluşturulan ANeuralNetworksMemory
nesnesini yalnızca
ANeuralNetworksExecution_setInputFromMemory()
veya
Rollere göre ANeuralNetworksExecution_setOutputFromMemory()
ANeuralNetworksMemoryDesc
nesnesinde belirtilir. Ofset ve uzunluk
bağımsız değişkenler, belleğin tamamının kullanıldığını gösterecek şekilde 0 olarak ayarlanmalıdır. Müşteri
ANeuralNetworksMemory_copy()
.
Belirtilmemiş boyut veya sıralama rollerine sahip opak anılar oluşturabilirsiniz.
Bu durumda, bellek oluşturma işlemi
Temel kuruluş tarafından desteklenmiyorsa ANEURALNETWORKS_OP_FAILED
durumu
gerekir. Müşterinin, bir veri kümesi dağıtıp bir
Ashmem veya BLOB modu AHardwareBuffer
destekli yeterince büyük bir arabellek.
NNAPI'nin artık opak bellek nesnesine erişmesi gerekmediğinde
karşılık gelen ANeuralNetworksMemory
örneği:
ANeuralNetworksMemory_free(opaqueMem);
Performansı ölçün
Uygulamanızın performansını, yürütme süresini ölçerek veya profil çıkarma.
Yürütme süresi
Çalışma zamanı boyunca toplam yürütme süresini belirlemek istediğinizde
yardımcı olabilir ve çağrının süresini ölçmenizi sağlar. Google Takvim widget'ını
daha düşük bir yazılım seviyesi üzerinden toplam yürütme süresini belirlemek istiyorsanız
toplu olarak
ANeuralNetworksExecution_setMeasureTiming
ve
ANeuralNetworksExecution_getDuration
almak için:
- bir hızlandırıcıda yürütme süresi (ana makinede çalışan sürücüde değil) için geçerlidir).
- hızlandırıcıdaki süre de dahil olmak üzere sürücüdeki yürütme süresi.
Sürücüdeki yürütme süresine, çalışma zamanı gibi ek yük dahil değildir kendisi ve sürücüyle iletişim kurması için gereken IPC.
Bu API'ler, gönderilen çalışma ile tamamlanan çalışma arasındaki süreyi ölçer sürücünün veya hızlandırıcının performansa ayırdığı zaman yerine zaman bağlam değişimiyle kesintiye uğrayabilir.
Örneğin, 1. çıkarım başlarsa sürücü ilgili işlemi gerçekleştirmek için işi durdurur. çıkarım 2, çıkarım 1'i devam ettirir ve çıkarım 1'i tamamlar. çıkarım 1, çıkarım 2'nin gerçekleştirilmesi için çalışmanın durdurulduğu zamanı içerir.
Bu zamanlama bilgileri bir çevrimdışı kullanım için telemetri toplama uygulaması. Zamanlama verilerini şu amaçlarla kullanabilirsiniz: uygulamayı daha yüksek performans sağlayacak şekilde değiştirebilirsiniz.
Bu işlevi kullanırken aşağıdakileri göz önünde bulundurun:
- Zamanlama bilgilerinin toplanmasının performans maliyeti olabilir.
- Yalnızca sürücü kendi başına veya araçta geçirilen zamanı hesaplayabilir hızlandırıcı (NNAPI çalışma zamanında ve IPC'de harcanan süre hariç).
- Bu API'leri yalnızca şuna sahip bir
ANeuralNetworksExecution
ile kullanabilirsiniz:ANeuralNetworksExecution
numDevices = 1
ileANeuralNetworksCompilation_createForDevices
ile oluşturuldu. - Zamanlama bilgilerini bildirebilmek için herhangi bir sürücüye gerek yoktur.
Android Systrace ile uygulamanızın profilini oluşturun
NNAPI, Android 10'dan itibaren otomatik olarak systrace etkinlikleri uygulamanızın profilini belirlemek için kullanabilirsiniz.
NNAPI Kaynağı,parse_systrace
systrace etkinlikleri içeren systrace etkinlikleri ile birlikte,
model yaşam döngüsünün farklı aşamalarında harcanan süre (Örnekleme,
(hazırlık, derleme, yürütme ve feshetme) ve farklı seviyelerde
izin verir. Uygulamanızın bölündüğü katmanlar şunlardır:
Application
: ana uygulama koduRuntime
: NNAPI Çalışma ZamanıIPC
: NNAPI Çalışma Zamanı ile Sürücü arasındaki işlemler arası iletişim kodDriver
: hızlandırıcı sürücü işlemi.
Profil çıkarma analiz verilerini oluşturma
$ANDROID_BUILD_TOP ve AOSP kaynak ağacını kontrol ettiğiniz TFLite resim sınıflandırma örneğini kullanarak NNAPI profil verilerini oluşturmak için kullanılacak şu adımları uygulayın:
- Aşağıdaki komutla Android sistem izlemeyi başlatın:
$ANDROID_BUILD_TOP/external/chromium-trace/systrace.py -o trace.html -a org.tensorflow.lite.examples.classification nnapi hal freq sched idle load binder_driver
-o trace.html
parametresi, izlerin
trace.html
dilinde yazılmıştır. Kendi uygulamanızın profilini çıkarırken
org.tensorflow.lite.examples.classification
yerine işlem adını yazın
uygulama manifestinizde belirtilir.
Bu, kabuk konsollarınızdan birini meşgul tutacaktır, komutu şurada çalıştırmayın:
etkileşimli olarak enter
sonlandırılmasını beklediği için arka planda çalışır.
- Sistem izleme toplayıcısı başlatıldıktan sonra, uygulamanızı başlatın ve karşılaştırma testi yapabilirsiniz.
Bu örnekte, Görüntü Sınıflandırma uygulamasını Android Studio'dan başlatabilirsiniz. veya uygulama zaten yüklenmişse doğrudan test telefonunuzun kullanıcı arayüzünden kullanabilirsiniz. NNAPI verileri oluşturmak için uygulamayı NNAPI kullanacak şekilde yapılandırmanız gerekir: Uygulama yapılandırma iletişim kutusunda hedef cihaz olarak NNAPI'nin seçilmesi
Test tamamlandığında sistem izlemeyi sonlandırarak şurada
enter
tuşuna basın: 1. adımdan beri konsol terminali etkin.Kümülatif istatistikler oluşturmak için
systrace_parser
yardımcı programını çalıştırın:
$ANDROID_BUILD_TOP/frameworks/ml/nn/tools/systrace_parser/parse_systrace.py --total-times trace.html
Ayrıştırıcı aşağıdaki parametreleri kabul eder:
- --total-times
: Zaman da dahil olmak üzere bir katmanda harcanan toplam süreyi gösterir
temel katmana yapılan bir çağrıda yürütülmeyi bekleyerek harcanan
- --print-detail
: Sistem izlemeden toplanan tüm etkinlikleri yazdırır
- --per-execution
: yalnızca yürütmeyi ve alt aşamalarını yazdırır
(yürütme başına süreler olarak) döndürerek, her aşamaya ait istatistikler yerine
- --json
: Çıkışı JSON biçiminde üretir
Çıkışın bir örneği aşağıda gösterilmiştir:
===========================================================================================================================================
NNAPI timing summary (total time, ms wall-clock) Execution
----------------------------------------------------
Initialization Preparation Compilation I/O Compute Results Ex. total Termination Total
-------------- ----------- ----------- ----------- ------------ ----------- ----------- ----------- ----------
Application n/a 19.06 1789.25 n/a n/a 6.70 21.37 n/a 1831.17*
Runtime - 18.60 1787.48 2.93 11.37 0.12 14.42 1.32 1821.81
IPC 1.77 - 1781.36 0.02 8.86 - 8.88 - 1792.01
Driver 1.04 - 1779.21 n/a n/a n/a 7.70 - 1787.95
Total 1.77* 19.06* 1789.25* 2.93* 11.74* 6.70* 21.37* 1.32* 1831.17*
===========================================================================================================================================
* This total ignores missing (n/a) values and thus is not necessarily consistent with the rest of the numbers
Toplanan etkinlikler tam bir değeri temsil etmezse ayrıştırıcı başarısız olabilir izin verir. Özellikle sistem izleme etkinlikleri oluşturulduysa başarısız olabilir. ilişkilendirilmiş olmadan izlemede mevcut olan bir bölümün sonunu işaretlemek bölümü başlangıç etkinliği. Bu durum genellikle önceki bir etkinlikteki systrace toplayıcıyı başlattığınızda profil oluşturma oturumu oluşturuluyor. Bu durumda, profil oluşturma işlemini tekrar çalıştırmanız gerekir.
Uygulama kodunuzun istatistiklerini systrace_parser çıkışına ekleyin
ayrıştır_systrace uygulaması, yerleşik Android sistem izleme üzerine kuruludur. işlevi görür. Uygulamanızdaki belirli işlemler için systrace API (Java için , yerel uygulamalar için ) özel etkinlik adlarını kullanın.
Özel etkinliklerinizi Uygulama yaşam döngüsünün aşamalarıyla ilişkilendirmek için: etkinlik adınızın başına aşağıdaki dizelerden birini ekleyin:
[NN_LA_PI]
: Başlatma için uygulama düzeyinde etkinlik[NN_LA_PP]
: Hazırlık için uygulama düzeyinde etkinlik[NN_LA_PC]
: Derleme için uygulama düzeyinde etkinlik[NN_LA_PE]
: Yürütme için uygulama düzeyinde etkinlik
Aşağıda, TFLite resim sınıflandırma örneğini nasıl değiştirebileceğinize dair bir örnek verilmiştir:
Execution
aşaması için bir runInferenceModel
bölümü ve
Şu özelliklere sahip başka bölümleri içeren Application
katman: preprocessBitmap
NNAPI izlerinde dikkate alınmaz. runInferenceModel
bölümü,
nnapi systrace ayrıştırıcısı tarafından işlenen systrace etkinliklerinin bir bölümü:
Kotlin
/** Runs inference and returns the classification results. */ fun recognizeImage(bitmap: Bitmap): List{ // This section won’t appear in the NNAPI systrace analysis Trace.beginSection("preprocessBitmap") convertBitmapToByteBuffer(bitmap) Trace.endSection() // Run the inference call. // Add this method in to NNAPI systrace analysis. Trace.beginSection("[NN_LA_PE]runInferenceModel") long startTime = SystemClock.uptimeMillis() runInference() long endTime = SystemClock.uptimeMillis() Trace.endSection() ... return recognitions }
Java
/** Runs inference and returns the classification results. */ public ListrecognizeImage(final Bitmap bitmap) { // This section won’t appear in the NNAPI systrace analysis Trace.beginSection("preprocessBitmap"); convertBitmapToByteBuffer(bitmap); Trace.endSection(); // Run the inference call. // Add this method in to NNAPI systrace analysis. Trace.beginSection("[NN_LA_PE]runInferenceModel"); long startTime = SystemClock.uptimeMillis(); runInference(); long endTime = SystemClock.uptimeMillis(); Trace.endSection(); ... Trace.endSection(); return recognitions; }
Hizmet kalitesi
NNAPI, Android 11 ve sonraki sürümlerde bir uygulamanın, sahip olduğu modellerin göreli önceliklerini, bir modeli hazırlamak için gereken maksimum süre ve belirli bir hesaplamayı tamamlaması için beklenen süre. Android 11 ayrıca ek NNAPI sonuç kodları uygulamaların, eksik yürütme gibi hataları anlamasını sağlayan teslim tarihlerine uymalısınız.
İş yükünün önceliğini ayarlama
Bir NNAPI iş yükünün önceliğini ayarlamak için şunu arayın:
ANeuralNetworksCompilation_setPriority()
ANeuralNetworksCompilation_finish()
numaralı telefonu aramadan önce.
Son tarihler belirleyin
Uygulamalar hem model derleme hem de çıkarım için son tarihler ayarlayabilir.
- Derleme zaman aşımını ayarlamak için şunu arayın:
ANeuralNetworksCompilation_setTimeout()
ANeuralNetworksCompilation_finish()
numaralı telefonu aramadan önce. - Çıkarım zaman aşımını ayarlamak için şunu arayın:
ANeuralNetworksExecution_setTimeout()
önce (derlemeye başlamadan) emin olun.
İşlem görenler hakkında daha fazla bilgi
Aşağıdaki bölümde, işlenenlerin kullanımıyla ilgili ileri düzey konular ele alınmaktadır.
Nicel tensörler
Nicelleştirilmiş tensör, n boyutlu bir diziyi temsil etmenin en küçük yoludur. kayan nokta değerleridir.
NNAPI, 8 bit asimetrik nicelenmiş tensörleri destekler. Bu tensörler için her hücrenin değeri 8 bitlik bir tam sayıyla temsil edilir. Şununla ilişkili: tensör bir ölçek ve sıfır puan değeridir. Bunlar, 8 bit'i dönüştürmek için kullanılır. tamsayı değerlerini temsil edilen kayan nokta değerlerine çevirin.
Formül şöyledir:
(cellValue - zeroPoint) * scale
Burada sıfır Nokta değeri 32 bitlik bir tam sayı, ölçek ise 32 bitlik kayan puan değeri
32 bitlik kayan nokta değerlerinin tensörleriyle karşılaştırıldığında, 8 bitlik nicelenmiş tensörler iki avantajı vardır:
- Eğitilen ağırlıklar boyutun dörtte birini oluşturduğundan uygulamanız daha küçüktür bir yazılımdır.
- Hesaplamalar genellikle daha hızlı yürütülebilir. Bunun nedeni, bellekten getirilmesi gereken verilerin ve işlemcilerin verimliliğinden Şelale'yi kapsayabilir.
Kayan nokta modelini nicel bir modele dönüştürmek mümkün olsa da, tecrübeleri niceliksel bir eğitimle daha iyi sonuçlar elde edildiğini göstermiştir. modelinizi doğrudan test eder. Nöral ağ bu durumu telafi etmeyi öğrenir. ayrıntı düzeyini artırır. Ölçülen her tensör için ölçek ve Sıfır noktası değerleri eğitim sürecinde belirlenir.
NNAPI'de
ANeuralNetworksOperandType
veri yapısını da
ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
.
Bu verilerde tensörün ölçeğini ve zeroPoint değerini de belirtirsiniz
inceleyeceğiz.
NNAPI, 8 bit asimetrik nicelenmiş tensörlere ek olarak şunları da destekler:
ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL
Bu boyutu, ağırlıkları temsil etmek içinCONV/DEPTHWISE_CONV/TRANSPOSED_CONV
işlem.ANEURALNETWORKS_TENSOR_QUANT16_ASYMM
dahili durum bilgisi için kullanabilirsiniz.QUANTIZED_16BIT_LSTM
.ANEURALNETWORKS_TENSOR_QUANT8_SYMM
Bu da projenin ilerlemesi içinANEURALNETWORKS_DEQUANTIZE
.
İsteğe bağlı işlenenler
Örneğin,
ANEURALNETWORKS_LSH_PROJECTION
isteğe bağlı işlenenleri alma. Modelde isteğe bağlı işlenenin
atlandığında,
ANeuralNetworksModel_setOperandValue()
fonksiyonunu kullanabilirsiniz. Tampon için NULL
ve uzunluk için 0 değeri iletir.
İşlenenin mevcut olup olmadığı konusundaki karar her biri için değişiyorsa
isterseniz
ANeuralNetworksExecution_setInput()
veya
ANeuralNetworksExecution_setOutput()
fonksiyonlarını kullanarak arabellek için NULL
, uzunluk için 0 değerini iletir.
Bilinmeyen derecedeki tensörler
Android 9 (API düzeyi 28), bilinmeyen boyutlardaki model işlem görenlerini kullanıma sundu. bilinen sıra (boyut sayısı). Android 10 (API düzeyi 29) kullanıma sunuldu aşağıdaki şekilde gösterildiği gibi, bilinmeyen sıralamadaki tensörler ANeuralNetworkOperandType.
NNAPI karşılaştırması
NNAPI karşılaştırması platform/test/mlts/benchmark
bölgesindeki AOSP'de mevcuttur
(karşılaştırma uygulaması) ve platform/test/mlts/models
(modeller ve veri kümeleri).
Karşılaştırma, gecikme ve doğruluğu değerlendirir ve sürücüleri aynı değerle karşılaştırır modellerin her biri için CPU üzerinde çalışan Tensorflow Lite kullanılarak veri kümelerinde yer alır.
Karşılaştırmayı kullanmak için aşağıdakileri yapın:
Bilgisayarınıza hedef Android cihazı bağlayın, bir terminal penceresi açın ve cihaza adb üzerinden erişilebildiğinden emin olun.
Birden fazla Android cihaz bağlıysa hedef cihazı dışa aktarın
ANDROID_SERIAL
ortam değişkeni.Android'in üst düzey kaynak dizinine gidin.
Şu komutları çalıştırın:
lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available ./test/mlts/benchmark/build_and_run_benchmark.sh
Karşılaştırma çalıştırmasının sonunda, sonuçları bir HTML sayfası olarak sunulur
xdg-open
işlevine aktarıldı.
NNAPI günlükleri
NNAPI, sistem günlüklerinde yararlı teşhis bilgileri oluşturur. Günlükleri analiz etmek için logcat komutunu kullanın. yardımcı olur.
Belirli aşamalar veya bileşenler için ayrıntılı NNAPI günlük kaydını etkinleştirmek için
debug.nn.vlog
mülkü (adb shell
kullanarak) aşağıdaki değerler listesine eklenir,
boşluk, iki nokta veya virgülle ayırın:
model
: Model oluşturmacompilation
: Model yürütme planı ve derlemesinin oluşturulmasıexecution
: Model yürütmecpuexe
: NNAPI CPU uygulamasını kullanarak işlemlerin yürütülmesimanager
: NNAPI uzantıları, kullanılabilir arayüzler ve özelliklerle ilgili bilgilerall
veya1
: Yukarıdaki tüm öğeler
Örneğin, tam ayrıntılı günlük kaydını etkinleştirmek için şu komutu kullanın:
adb shell setprop debug.nn.vlog all
Ayrıntılı günlük kaydını devre dışı bırakmak için şu komutu kullanın:
adb shell setprop debug.nn.vlog '""'
Etkinleştirildikten sonra ayrıntılı günlük kaydı, INFO düzeyinde günlük girişleri oluşturur. aşama veya bileşen adına ayarlanmış bir etiket kullanarak.
NNAPI API bileşenleri, debug.nn.vlog
denetimli mesajların yanı sıra
düzeylerindeki diğer günlük girişlerini (her biri belirli bir günlük etiketi kullanarak) içerir.
Bileşen listesini almak için şu ifade:
grep -R 'define LOG_TAG' | awk -F '"' '{print $2}' | sort -u | egrep -v "Sample|FileTag|test"
Bu ifade şu anda aşağıdaki etiketleri döndürmektedir:
- Patlama Oluşturucu
- Geri çağırma işlevleri
- Derleme Oluşturucu
- CPU Yürütücü
- Yürütme Oluşturucu
- YürütmeBurstDenetleyicisi
- YürütmeBurstSunucusu
- Yürütme Planı
- FibonacciSürücü
- GraphDump
- Dizine Eklenmiş Şekil Sarmalayıcı
- IonWatcher
- Müdür
- Bellek
- Bellek Utilleri
- MetaModel
- ModelArgumentBilgisi
- Model Oluşturucu
- Sinir Ağları
- İşlem Çözücü
- İşlemler
- İşlem Yardımcıları
- Paket Bilgileri
- TokenHasher
- Tür Yöneticisi
- Yardımcı programlar
- Doğrulama
- Sürümlü Arayüzler
logcat
tarafından gösterilen günlük mesajlarının seviyesini kontrol etmek için şunları kullanın:
ANDROID_LOG_TAGS
ortam değişkeni
NNAPI günlük mesajlarının tümünü göstermek ve diğerlerini devre dışı bırakmak için ANDROID_LOG_TAGS
öğesini şu şekilde ayarlayın:
şu:
BurstBuilder:V Callbacks:V CompilationBuilder:V CpuExecutor:V ExecutionBuilder:V ExecutionBurstController:V ExecutionBurstServer:V ExecutionPlan:V FibonacciDriver:V GraphDump:V IndexedShapeWrapper:V IonWatcher:V Manager:V MemoryUtils:V Memory:V MetaModel:V ModelArgumentInfo:V ModelBuilder:V NeuralNetworks:V OperationResolver:V OperationsUtils:V Operations:V PackageInfo:V TokenHasher:V TypeManager:V Utils:V ValidateHal:V VersionedInterfaces:V *:S.
Aşağıdaki komutu kullanarak ANDROID_LOG_TAGS
öğesini ayarlayabilirsiniz:
export ANDROID_LOG_TAGS=$(grep -R 'define LOG_TAG' | awk -F '"' '{ print $2 ":V" }' | sort -u | egrep -v "Sample|FileTag|test" | xargs echo -n; echo ' *:S')
Bunun yalnızca logcat
için geçerli bir filtre olduğunu unutmayın. Yine de
ayrıntılı günlük bilgileri oluşturmak için debug.nn.vlog
özelliğini all
olarak ayarlayın.