Derleme önbelleğe alma

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 ö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.

Sağlanan önbellek bilgileri ve önbellek isabeti

  1. Uygulama, bir önbelleğe alma dizini ve modele özel bir sağlama toplamı iletir.
  2. NNAPI çalışma zamanı, önbelleğe alınmış dosyaları sağlama toplamına, yürütme tercihine ve bölümlendirme sonucuna göre arar ve 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 önbelleğe alınmış dosyalardan hazırlar ve hazırlanan modeli döndürü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ı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.
  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 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

İ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. Ö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ına sahip olacaktır. 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.

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

İki tür önbellek dosyası vardır: veri önbelleği ve model önbelleği.

  • 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. 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ü, modelin önbelleğe alıp almadığını önbellekten hazırlanmadan önce bozulmasını sağlar. 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 dosyası tanıtıcılarını her zaman hem okuma hem de yazma işleviyle açar izni gerekir.

Güvenlik

Derleme önbelleğe alma işleminde model önbelleği, . 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 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. 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 da, sürücünün jetondan bir işarete model önbelleğinin kriptografik karması. Sürücü, derlemeyi önbelleğe kaydederken jetonu ve model önbelleğini saklayabilir. Sürücü, model önbelleğinin yeni karmasını, kaydedilen jeton ve karma çiftiyle 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ünün üzerine güncellemeden önce, önbelleğin hazırlanmasını önlemek için bu eşleme yöneticisinin başlatılması gerekir. dosyaları oluşturabilirsiniz.

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ı ileri düzey kullanım durumlarında sürücünün önbellek içeriğine erişmesi gerekir (okuma veya yazma). Ö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 veya prepareModelFromCache ç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, 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 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.