Derlemeyi önbelleğe alma

Android 10'dan itibaren Neural Networks API'si (NNAPI) projenin yaşam döngüsü boyunca derleme eserlerini önbelleğe alarak derleme için harcanan süreyi kısaltır izin verilmez. Bu önbelleğe alma işlevini kullandığınızda sürücü, önbelleğe alınan dosyaları yönetmeniz veya temizlemeniz gerekiyorsa. Bu, isteğe bağlı bir özelliktir ve NN HAL 1.2 ile uygulanabilir. Bu işlev hakkında daha fazla bilgi için bkz. ANeuralNetworksCompilation_setCaching.

Sürücü, NNAPI'den bağımsız olarak derleme önbelleğe almayı da uygulayabilir. Bu NNAPI NDK ve HAL önbelleğe alma özelliklerinin kullanılması veya değil. AOSP, alt düzey bir yardımcı program kitaplığı (önbellek motoru) sağlar. Daha fazla Önbelleğe alma motoru uygulama bölümüne bakın.

İş akışına genel bakış

Bu bölümde derleme önbelleğe alma özelliğiyle ilgili genel iş akışları açıklanmaktadır yardımcı olur.

Önbellek bilgileri sağlanıyor ve önbellek isabeti

  1. Uygulama, bir önbelleğe alma dizini ve modele özel bir sağlama toplamı iletir.
  2. NNAPI çalışma zamanı, önbellek dosyalarını sağlama toplamına, bölümlendirme sonucunu belirler ve dosyaları bulur.
  3. NNAPI, önbellek dosyalarını açar ve tutma yerlerini sürücüye iletir. şununla: prepareModelFromCache.
  4. Sürücü, modeli doğrudan önbellek dosyalarından hazırlar ve modeli uygulamaktır.

Önbellek bilgileri sağlandı ve önbellekte yok

  1. Uygulama, modele özel bir sağlama toplamı ve önbelleğe alma iletir dizin.
  2. NNAPI çalışma zamanı, önbelleğe alma dosyalarını denetim toplamına, ve bölümlendirme sonucunu bulamıyorsa önbellek dosyaları.
  3. NNAPI, sağlama toplamı ve yürütme işlevine göre boş önbellek dosyaları oluşturur. bölümünü çıkardıktan sonra, önbellek dosyalarını açar ve ve modeli sürücüye iletecek şekilde prepareModel_1_2.
  4. Sürücü modeli derler, önbelleğe alma bilgilerini önbelleğe yazar dosyalarını yükler ve hazırlanan modeli döndürür.

Önbellek bilgileri sağlanmadı

  1. Uygulama, herhangi bir önbelleğe alma bilgisi sağlamadan derlemeyi çağırıyor.
  2. Uygulama, önbelleğe almayla ilgili hiçbir şey iletmez.
  3. NNAPI çalışma zamanı, modeli sürücüye iletir. prepareModel_1_2.
  4. Sürücü, modeli derler ve hazırlanan modeli döndürür.

Önbellek bilgileri

Sürücüye sağlanan önbelleğe alma bilgileri bir jetondan ve önbellek dosyası işleyicileridir.

Jeton

İlgili içeriği oluşturmak için kullanılan jeton uzunluklu bir önbelleğe alma jetonudur Constant::BYTE_SIZE_OF_CACHE_TOKEN bir alt sınır içerir. dosyalarını prepareModel_1_2 ile önbelleğe almak ve hazırlanan modeli prepareModelFromCache. Sürücünün istemcisi çakışma oranına sahip olacaktır. Sürücü, jeton çakışmasını algılayamaz. Çarpışma başarısız bir yürütmeye veya başarılı bir yürütmeye neden olur. hatalı çıkış değerleri.

Önbellek dosyası işleyicileri (iki tür önbellek dosyası)

İki tür önbellek dosyası, veri önbelleği ve model önbellek'tir.

  • Veri önbelleği: Önceden işlenmiş ve sabit veriler dahil olmak üzere sabit verileri önbelleğe almak için densör arabelleklerine dönüştürülmüştür. Veri önbelleğinde değişiklik yapıldığında yürütme sırasında kötü çıkış değerleri oluşturmaktan daha kötü sonuçlar doğurur gerekir.
  • Model önbellek: Derlenmişler gibi güvenlik açısından hassas verileri önbelleğe almak için kullanın yürütülebilir makine kodu. CEVAP model önbelleğinde değişiklik yapılması, sürücünün çalıştırmasını etkileyebilir kötü amaçlı bir istemci bunu kullanarak belirten bir uyarı alır. Bu nedenle sürücü, modelin önbelleğe alıp almadığını önbellekten hazırlanmadan önce bozulmasını sağlar. Daha fazla bilgi için Güvenlik bölümünü inceleyin.

Sürücü, önbellek bilgilerinin bu ikisi arasında nasıl dağıtılacağına karar vermelidir. türlerini belirleyip her tür için kaç önbellek dosyasına ihtiyaç duyduğunu şununla: getNumberOfCacheFilesNeeded.

NNAPI çalışma zamanı, önbellek dosyası tanıtıcılarını her zaman hem okuma hem de yazma işleviyle açar iznidir.

Güvenlik

Derleme önbelleğe alma işleminde model önbelleği, . Değilse model önbelleğinde yapılan bir değişiklik, sürücünün önbelleğindeki veya yürütme davranışıyla ilgilidir. Önbellek içerikleri uygulamada depolandığı için önbellek dosyaları istemci tarafından değiştirilebilir. Hatalı bir müşteri önbelleği yanlışlıkla bozduğunda, kötü amaçlı bir istemci kasıtlı olarak bu kullanımı, cihazda doğrulanmamış kod yürütmek için kullanır. Seçtiğiniz düzenleme moduna bu bir güvenlik sorunu olabilir. Dolayısıyla, sürücünün bunu algılayabilmesi gerekir modeli önbellekten hazırlamadan önce potansiyel model önbellek bozulması.

Bunu yapmanın bir yolu da, sürücünün jetondan bir işarete model önbelleğinin kriptografik karması. Sürücü, jetonu ve verileri saklayabilir karmasını tanımlamaya çalışın. Sürücü, kaydedilen jeton ve karma çiftiyle birlikte model önbelleğinin yeni karmasını derlemeyi önbellekten aldım. Bu eşleme, yeniden başlatmasını kolaylaştırır. Sürücü, Android anahtar deposu hizmeti olan framework/ml/nn/driver/cache, veya diğer uygun mekanizmalardan yararlanılması gerekir. Sürücü koltuğunda güncellemeden önce, önbelleğin hazırlanmasını önlemek için bu eşleme yöneticisinin başlatılması gerekir. dosyaları oluşturabilirsiniz.

Önlem almak için kontrol zamanı ile kullanım zamanı (TOCTOU) saldırısı nedeniyle, sürücünün dosya içeriğini dahili bir dosyaya kopyaladıktan sonra yeni karmayı arabellek.

Bu örnek kod, bu mantığın nasıl uygulanacağını gösterir.

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ı ileri düzey kullanım durumlarında sürücünün önbellek içeriğine erişmesi gerekir (okuma veya yazma). Kullanım alanlarına şunlar örnek verilebilir:

  • Tam zamanında derleme: Derleme, şu tarihe kadar ertelenir: ilk yürütme aşamasıdır.
  • Çok aşamalı derleme: Başlangıçta hızlı bir derleme gerçekleştirilir Ayrıca daha sonra isteğe bağlı, optimize edilmiş bir derleme gerçekleştirilir kullanım sıklığına bağlı olarak değişebilir.

Derleme çağrısından sonra önbellek içeriğine (okuma veya yazma) erişmek için şunları yapmasını sağlar:

  • prepareModel_1_2 veya prepareModelFromCache ve önbelleği okur/günceller geri yükleyebilirsiniz.
  • Dosya kilitleme mantığını normal derleme çağrısının dışında uygular Böylece, bir okuma işlemi veya başka bir yazma işlemiyle eş zamanlı olarak bir yazma işlemi yapılmasını önlersiniz.

Önbelleğe alma motoru uygulama

NN HAL 1.2 derleme önbelleğe alma arayüzüne ek olarak, yardımcı program kitaplığını frameworks/ml/nn/driver/cache dizin. İlgili içeriği oluşturmak için kullanılan nnCache alt dizin, sürücünün uygulaması için kalıcı depolama alanı kodu içerir derlemesini NNAPI önbelleğe alma özelliklerini kullanmadan derlemesini sağlar. Bu biçim derleme önbelleğe alma, NN HAL'nin herhangi bir sürümüyle uygulanabilir. Öğe Sürücü, HAL arayüzünden bağlantısı kesilen önbelleğe almayı uygulamayı seçtiğinde, sürücü artık ihtiyaç duyulmadığında önbelleğe alınan yapıları serbest bırakmaktan sorumludur.