Derleme önbelleğe alma

Android 10'dan itibaren Neural Networks API (NNAPI), derleme yapıtlarının önbelleğe alınmasını destekleyen işlevler sağlar; bu da 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 uygulanabilecek isteğe bağlı bir özelliktir. Bu işlev hakkında daha fazla bilgi için bkz. ANeuralNetworksCompilation_setCaching .

Sürücü ayrıca NNAPI'den bağımsız olarak derleme önbelleğe almayı da uygulayabilir. Bu, NNAPI NDK ve HAL önbelleğe alma özelliklerinin kullanılıp kullanılmamasına bakılmaksızın uygulanabilir. AOSP, düşük seviyeli bir yardımcı program kitaplığı (önbellekleme motoru) sağlar. Daha fazla bilgi için bkz. Önbelleğe alma motorunu uygulama .

İş 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 önbellek dizinini ve modele özgü bir sağlama toplamını iletir.
  2. NNAPI çalışma zamanı, sağlama toplamına, yürütme tercihine ve bölümleme sonucuna göre önbellek dosyalarını arar ve dosyaları bulur.
  3. NNAPI önbellek dosyalarını açar ve tanıtıcıları prepareModelFromCache ile sürücüye iletir.
  4. Sürücü, modeli doğrudan önbellek dosyalarından hazırlar ve hazırlanan modeli döndürür.

Önbellek bilgileri sağlandı ve önbellek eksik

  1. Uygulama, modele özel bir sağlama toplamını ve bir önbellek dizinini iletir.
  2. NNAPI çalışma zamanı, sağlama toplamına, yürütme tercihine ve bölümleme sonucuna göre önbelleğe alma dosyalarını arar ve önbellek dosyalarını bulamaz.
  3. NNAPI, sağlama toplamına, yürütme tercihine ve bölümlemeye dayalı olarak boş önbellek dosyaları oluşturur, önbellek dosyalarını açar ve tanıtıcıları ve modeli, prepareModel_1_2 ile sürücüye iletir.
  4. Sürücü modeli derler, önbellek bilgilerini önbellek dosyalarına yazar ve hazırlanan modeli döndürür.

Önbellek bilgisi sağlanmadı

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

Önbellek bilgileri

Bir sürücüye sağlanan önbelleğe alma bilgileri bir belirteç ve önbellek dosyası tanıtıcılarından oluşur.

Jeton

Belirteç , hazırlanan modeli tanımlayan Constant::BYTE_SIZE_OF_CACHE_TOKEN uzunluğunda bir önbellek belirtecidir. Aynı belirteç, önbellek dosyalarını prepareModel_1_2 ile kaydederken ve hazırlanan model prepareModelFromCache ile alınırken sağlanır. Sürücünün müşterisi düşük çarpışma oranına sahip bir jeton seçmelidir. Sürücü jeton çarpışmasını tespit edemiyor. Bir çarpışma, başarısız bir yürütmeyle veya hatalı çıktı değerleri üreten başarılı bir yürütmeyle sonuçlanır.

Önbellek dosyası tanıtıcıları (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 dönüştürülmüş tensör arabellekleri dahil olmak üzere sabit verileri önbelleğe almak için kullanın. Veri önbelleğinde yapılan bir değişiklik, yürütme sırasında hatalı çıktı değerleri üretmekten daha kötü bir etkiye yol açmamalıdır.
  • Model önbelleği: Derlenmiş yürütülebilir makine kodu gibi güvenliğe duyarlı verileri cihazın yerel ikili biçiminde önbelleğe almak için kullanın. Model önbelleğinde yapılacak bir değişiklik, sürücünün yürütme davranışını etkileyebilir ve kötü niyetli bir istemci, verilen iznin ötesinde yürütmek için bunu kullanabilir. Bu nedenle sürücünün modeli önbellekten hazırlamadan önce model önbelleğinin bozuk olup olmadığını kontrol etmesi gerekir. Daha fazla bilgi için bkz. Güvenlik .

Sürücünün, önbellek bilgilerinin iki tür önbellek dosyası arasında nasıl dağıtılacağına karar vermesi ve her tür için kaç önbellek dosyasına ihtiyaç duyduğunu getNumberOfCacheFilesNeeded ile bildirmesi gerekir.

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

Güvenlik

Derleme önbelleğe almada, model önbelleği, aygıtın yerel ikili biçimindeki derlenmiş yürütülebilir makine kodu gibi güvenliğe duyarlı verileri içerebilir. Düzgün korunmadığı takdirde model önbelleğinde yapılan bir değişiklik sürücünün yürütme davranışını etkileyebilir. Önbellek içerikleri uygulama dizininde saklandığından önbellek dosyaları istemci tarafından değiştirilebilir. Hatalı bir istemci yanlışlıkla önbelleği bozabilir ve kötü niyetli bir istemci, cihazda doğrulanmamış kod yürütmek için bunu kasıtlı olarak kullanabilir. Cihazın özelliklerine bağlı olarak bu bir güvenlik sorunu olabilir. Bu nedenle sürücünün, modeli önbellekten hazırlamadan önce potansiyel model önbellek bozulmasını tespit edebilmesi gerekir.

Bunu yapmanın bir yolu, sürücünün belirteçten model önbelleğinin kriptografik karmasına kadar bir harita tutmasıdır. Sürücü, derlemeyi önbelleğe kaydederken belirteci ve model önbelleğinin karmasını saklayabilir. Sürücü, derlemeyi önbellekten alırken, model önbelleğinin yeni karmasını kayıtlı belirteç ve karma çiftiyle kontrol eder. Bu eşleme, sistem yeniden başlatmalarında kalıcı olmalıdır. Sürücü, bir eşleme yöneticisini uygulamak için Android anahtar deposu hizmetini , framework/ml/nn/driver/cache içindeki yardımcı program kitaplığını veya başka herhangi bir uygun mekanizmayı kullanabilir. Sürücü güncellemesinin ardından, önbellek dosyalarının daha önceki bir sürümden hazırlanmasını önlemek için bu eşleme yöneticisinin yeniden başlatılması gerekir.

Kullanım zamanı kontrolü (TOCTOU) saldırılarını önlemek için sürücünün, dosyaya kaydetmeden önce kaydedilen karmayı hesaplaması ve dosya içeriğini dahili bir ara belleğe kopyaladıktan sonra yeni karmayı hesaplaması gerekir.

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

Bazı gelişmiş kullanım durumlarında, sürücünün derleme çağrısından sonra önbellek içeriğine (okuma veya yazma) erişmesi gerekir. Örnek kullanım durumları şunları içerir:

  • Tam zamanında derleme: Derleme ilk yürütmeye kadar ertelenir.
  • Çok aşamalı derleme: Başlangıçta hızlı bir derleme gerçekleştirilir ve kullanım sıklığına bağlı olarak daha sonra isteğe bağlı olarak optimize edilmiş bir derleme gerçekleştirilir.

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

  • prepareModel_1_2 veya prepareModelFromCache çağrılması sırasında dosya tanıtıcılarını çoğaltır ve önbellek içeriğini daha sonra okur/günceller.
  • Bir okuma veya başka bir yazma işlemiyle aynı anda meydana gelen bir yazma işlemini önlemek için olağan derleme çağrısının dışında dosya kilitleme mantığını uygular.

Bir önbellek 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. nnCache alt dizini, sürücünün NNAPI önbelleğe alma özelliklerini kullanmadan derleme önbelleğe almayı uygulamasına yönelik kalıcı depolama kodunu içerir. Bu derleme önbelleğe alma biçimi, NN HAL'in herhangi bir sürümüyle uygulanabilir. Sürücü, önbelleğe almayı HAL arabirimiyle bağlantısı kesilerek uygulamayı seçerse, önbelleğe alınmış yapıtların artık ihtiyaç duyulmadığında serbest bırakılmasından sürücü sorumludur.