Derlemeyi ö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 bkz. ANeuralNetworksCompilation_setCaching.

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, düşük 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

  1. Uygulama, bir önbelleğe alma dizini ve modele özgü bir sağlama toplamı iletmelidir.
  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 prepareModelFromCache ile imleci sürücüye iletir.
  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ı 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 prepareModel_1_2 ile sürücüye iletir.
  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

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, çarpışma oranı düşük bir jeton seçmelidir. 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ı 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 ö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ın. 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 bölümünü 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, cihazın yerel ikili biçiminde derlenmiş yürütülebilir makine kodu gibi güvenlik açısından hassas veriler içerebilir. Değilse korunduğunda, model önbelleğinde yapılan bir değişiklik sürücünün önbelleği veya yürütme davranışıyla ilgilidir. Önbellek içerikleri uygulamada depolandığı için ö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. Seçtiğiniz düzenleme moduna bu 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 harita oluşturmasıdır. 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, sistem yeniden başlatıldığında kalıcı olmalıdı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.

Ö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ı

Belirli gelişmiş kullanım alanlarında, sürücülerin derleme çağrısından sonra önbellek içeriğine erişmesi (okuma veya yazma) gerekir. Kullanım alanlarına şunlar örnek verilebilir:

  • Tam zamanında derleme: Derleme, ilk yürütme işlemine kadar ertelenir.
  • Ç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 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.
  • 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, frameworks/ml/nn/driver/cache dizininde bir önbelleğe alma yardımcı programı kitaplığı da bulabilirsiniz. İ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.