Android 10'dan itibaren Neural Networks API (NNAPI), derleme yapılarının önbelleğe alınmasını destekleyen işlevler sağlar. Bu işlevler, bir uygulama başlatıldığında derleme için kullanılan süreyi azaltır. Bu önbelleğe alma işlevini kullanarak sürücünün önbelleğe alınan dosyaları yönetmesi veya temizlemesi gerekmez. Bu, NN HAL 1.2 ile uygulanabilen isteğe bağlı bir özelliktir. Bu işlev hakkında daha fazla bilgi için ANeuralNetworksCompilation_setCaching
bölümüne bakın.
Sürücü, NNAPI'den bağımsız olarak derleme önbelleğe alma özelliğini de uygulayabilir. Bu, NNAPI NDK ve HAL önbelleğe alma özellikleri kullanılsın veya kullanılmasın uygulanabilir. AOSP, alt düzey bir yardımcı program kitaplığı (önbelleğe alma motoru) sağlar. Daha fazla bilgi için Önbelleğe alma motoru uygulama başlıklı makaleyi inceleyin.
İş akışına genel bakış
Bu bölümde, derleme önbelleğe alma özelliğinin uygulandığı genel iş akışları açıklanmaktadır.
Sağlanan önbellek bilgileri ve önbellek isabeti
- Uygulama, bir önbelleğe alma dizini ve modele özgü bir sağlama toplamı iletmelidir.
- NNAPI çalışma zamanı, sağlama toplamına, yürütme tercihine ve bölümlendirme sonucuna göre önbelleğe alınmış dosyaları arar ve bulur.
- NNAPI, önbellek dosyalarını açar ve
prepareModelFromCache
ile imleci sürücüye iletir. - Sürücü, modeli doğrudan önbellek dosyalarından hazırlar ve hazırlanan modeli döndürür.
Sağlanan önbellek bilgileri ve önbelleğe alma hatası
- Uygulama, modele özgü bir sağlama toplamı ve önbelleğe alma dizini iletmelidir.
- NNAPI çalışma zamanı, önbelleğe alma dosyalarını sağlama toplamına, yürütme tercihine ve bölümlendirme sonucuna göre arar ve önbelleğe alma dosyalarını bulamaz.
- NNAPI, sağlama toplamına, yürütme tercihine ve bölümlemeye göre boş önbellek dosyaları oluşturur, önbellek dosyalarını açar ve
prepareModel_1_2
ile imleçleri ve modeli sürücüye iletir. - Sürücü modeli derleyip önbelleğe alma bilgilerini önbelleğe dosyalarına yazar ve hazırlanan modeli döndürür.
Önbellek bilgileri sağlanmadı
- Uygulama, herhangi bir önbelleğe alma bilgisi sağlamadan derlemeyi çağırıyor.
- Uygulama, önbelleğe alma ile ilgili hiçbir şey iletmiyor.
- NNAPI çalışma zamanı, modeli
prepareModel_1_2
ile sürücüye iletir. - Sürücü modeli derleyip hazırlanan modeli döndürür.
Önbellek bilgileri
Sürücüye sağlanan önbelleğe alma bilgileri, bir jeton ve önbelleğe alma dosyası tutamaçlarından oluşur.
Jeton
Jeton, hazırlanmış modeli tanımlayan Constant::BYTE_SIZE_OF_CACHE_TOKEN
uzunluğunda bir önbelleğe alma jetonudur. Önbelleğe alınmış dosyalar prepareModel_1_2
ile kaydedilirken ve hazırlanan model prepareModelFromCache
ile alınırken aynı jeton sağlanır. Sürücünün istemcisi, çakışma oranı düşük bir jeton seçmelidir. Sürücü, jeton çakışmasını algılayamaz. Çakışma, başarısız bir yürütme veya yanlış çıkış değerleri üreten başarılı bir yürütmeyle sonuçlanır.
Önbelleğe alınmış dosya tutamaçları (iki tür önbelleğe alınmış dosya)
İki tür önbellek dosyası vardır: veri önbelleği ve model önbelleği.
- Veri önbelleği: Önceden işlenmiş ve dönüştürülmüş tenör arabellekleri dahil olmak üzere sabit verileri önbelleğe almak için kullanın. Veri önbelleği üzerinde yapılan bir değişiklik, yürütme sırasında kötü çıkış değerleri oluşturmaktan daha kötü bir etki oluşturmamalıdır.
- Model önbelleği: Derlenmiş çalıştırılabilir makine kodu gibi güvenlik açısından hassas verileri cihazın yerel ikili biçiminde önbelleğe almak için kullanılır. Model önbelleğiyle ilgili bir değişiklik, sürücünün yürütme davranışını etkileyebilir ve kötü amaçlı bir istemci, verilen iznin ötesinde yürütme yapmak için bu durumdan yararlanabilir. Bu nedenle, sürücü, modeli önbellekten hazırlamadan önce model önbelleğini bozuk olup olmadığını kontrol etmelidir. Daha fazla bilgi için Güvenlik başlıklı makaleyi inceleyin.
Sürücü, önbellek bilgilerinin iki tür önbellek dosyası arasında nasıl dağıtılacağına karar vermelidir ve her tür için kaç önbellek dosyasına ihtiyaç duyduğunu getNumberOfCacheFilesNeeded
ile bildirmelidir.
NNAPI çalışma zamanı, önbellek dosya tutamacını her zaman hem okuma hem de yazma izniyle açar.
Güvenlik
Derleme önbelleğe alma işleminde model önbelleği, cihazın yerel ikili biçiminde derlenmiş yürütülebilir makine kodu gibi güvenlik açısından hassas veriler içerebilir. Doğru şekilde korunmazsa model önbelleğiyle ilgili bir değişiklik, sürücünün yürütme davranışını etkileyebilir. Önbellek içerikleri uygulama dizininde depolandığından önbellek dosyaları istemci tarafından değiştirilebilir. Hata içeren bir istemci, önbelleği yanlışlıkla bozabilir ve kötü amaçlı bir istemci, cihazda doğrulanmamış kod yürütmek için bunu kasıtlı olarak kullanabilir. Bu durum, cihazın özelliklerine bağlı olarak bir güvenlik sorunu olabilir. Bu nedenle, sürücü, modeli önbellekten hazırlamadan önce olası model önbelleği bozulmasını algılayabilmelidir.
Bunu yapmanın bir yolu, sürücünün jetondan model önbelleğiyle ilgili kriptografik karmaya bir eşleme oluşturmasıdır. Sürücü, derlemeyi önbelleğe kaydederken jetonu ve model önbelleğinizin karmasını saklayabilir. Sürücü, derlemeyi önbellekten alırken model önbelleğinizin yeni karmasını kaydedilen jeton ve karma çiftiyle kontrol eder. Bu eşleme, sistem yeniden başlatıldığında kalıcı olmalıdır. Sürücü, Android anahtar deposu hizmetini, framework/ml/nn/driver/cache
'teki yardımcı program kitaplığını veya eşleme yöneticisi uygulamak için uygun başka bir mekanizmayı kullanabilir. Sürücü güncellendikten sonra, önbelleğe alma dosyalarının önceki bir sürümden hazırlanmasını önlemek için bu eşleme yöneticisi yeniden başlatılmalıdır.
Kontrol zamanı ile kullanım zamanı (TOCTOU) saldırılarını önlemek için sürücünün, dosyaya kaydetmeden önce kaydedilen karma oluşturma işlemini ve dosya içeriğini dahili bir arabelleğe kopyaladıktan sonra yeni karma oluşturma işlemini yapması gerekir.
Bu örnek kodda, bu mantığın nasıl uygulanacağı gösterilmektedir.
bool saveToCache(const sp<V1_2::IPreparedModel> preparedModel,
const hidl_vec<hidl_handle>& modelFds, const hidl_vec<hidl_handle>& dataFds,
const HidlToken& token) {
// Serialize the prepared model to internal buffers.
auto buffers = serialize(preparedModel);
// This implementation detail is important: the cache hash must be computed from internal
// buffers instead of cache files to prevent time-of-check to time-of-use (TOCTOU) attacks.
auto hash = computeHash(buffers);
// Store the {token, hash} pair to a mapping manager that is persistent across reboots.
CacheManager::get()->store(token, hash);
// Write the cache contents from internal buffers to cache files.
return writeToFds(buffers, modelFds, dataFds);
}
sp<V1_2::IPreparedModel> prepareFromCache(const hidl_vec<hidl_handle>& modelFds,
const hidl_vec<hidl_handle>& dataFds,
const HidlToken& token) {
// Copy the cache contents from cache files to internal buffers.
auto buffers = readFromFds(modelFds, dataFds);
// This implementation detail is important: the cache hash must be computed from internal
// buffers instead of cache files to prevent time-of-check to time-of-use (TOCTOU) attacks.
auto hash = computeHash(buffers);
// Validate the {token, hash} pair by a mapping manager that is persistent across reboots.
if (CacheManager::get()->validate(token, hash)) {
// Retrieve the prepared model from internal buffers.
return deserialize<V1_2::IPreparedModel>(buffers);
} else {
return nullptr;
}
}
Gelişmiş kullanım alanları
Bazı gelişmiş kullanım alanlarında, sürücülerin derleme çağrısından sonra önbellek içeriğine (okuma veya yazma) erişmesi gerekir. Örnek kullanım alanları:
- Tam zamanında derleme: Derleme, ilk yürütme işlemine kadar ertelenir.
- Çok aşamalı derleme: İlk olarak hızlı bir derleme yapılır ve daha sonra kullanım sıklığına bağlı olarak isteğe bağlı olarak optimize edilmiş bir derleme yapılır.
Derleme çağrısından sonra önbellek içeriğine (okuma veya yazma) erişmek için sürücünün aşağıdakileri sağladığından emin olun:
prepareModel_1_2
veyaprepareModelFromCache
çağrısı sırasında dosya tutamacını kopyalar ve daha sonra önbellek içeriğini okur/günceller.- Bir okuma veya başka bir yazma işlemiyle eşzamanlı olarak yazma işleminin yapılmasını önlemek için normal derleme çağrısının dışında dosya kilitleme mantığını uygular.
Önbelleğe alma motoru uygulama
NN HAL 1.2 derleme önbelleğe alma arayüzüne ek olarak, frameworks/ml/nn/driver/cache
dizinindeki bir önbelleğe alma yardımcı programı kitaplığını da bulabilirsiniz. nnCache
alt dizini, sürücünün NNAPI önbelleğe alma özelliklerini kullanmadan derleme önbelleğe almasını sağlayan kalıcı depolama kodunu içerir. Bu derleme önbelleğe alma şekli, NN HAL'ın herhangi bir sürümüyle uygulanabilir. Sürücü, HAL arayüzünden bağlantısı kesilmiş bir şekilde önbelleğe alma işlemini uygulamayı seçerse artık ihtiyaç duyulmayan önbelleğe alınmış yapıların serbest bırakılmasından sürücü sorumludur.