LiteRT için GPU delegeleri

Makine öğrenimi (ML) modellerinizi çalıştırmak için grafik işlem birimlerini (GPU'lar) kullanma modelinizin performansını ve kullanıcı deneyimini önemli ölçüde iyileştirebilir bazılarını anlatabilirsiniz. LiteRT, GPU'ların ve kullanıcıların donanım sürücüsü aracılığıyla ya da özel işlemcileri kullanarak yetki verilmiş kullanıcı. LiteRT ML'nizle GPU kullanımını etkinleştirme uygulamalar aşağıdaki yararları sağlayabilir:

  • Hız: GPU'lar, çok büyük paralellik içeren yüksek işleme hızı için tasarlanmıştır. daha fazla bilgi edineceksiniz. Bu tasarım, onları derin sinir ağlarına çok uygun hale getirir. her biri giriş tensörleri üzerinde çalışan çok sayıda operatörden oluşur. paralel olarak işlenebilir. Bu da genellikle daha düşük gecikme sağlar. İçinde en iyi senaryoya göre, modelinizi bir GPU'da çalıştırmak, mümkün olmayan gerçek zamanlı uygulamalar.
  • Güç verimliliği - GPU'lar, makine öğrenimi hesaplamalarını çok verimli bir ve daha az güç tüketerek daha az enerji tüketerek aynı görevden daha yüksek ısıya sahip olmasına dikkat edin.

Bu belgede, LiteRT'teki GPU desteğiyle ilgili genel bir bakış sunulur. ileri düzey kullanımlara sahip olduğunu gördük. Daha ayrıntılı bilgi için aşağıdaki kılavuzlara bakın:

GPU ML işlemleri desteği

TensorFlow ML işlemlerinin veya işlemlerinin neler olabileceğiyle ilgili bazı sınırlamalar vardır: tarafından hızlandırıldı. Temsilci, 16 bit ve 32 bit kayan nokta hassasiyetinde aşağıdaki işlemleri yapabilirsiniz:

  • ADD
  • AVERAGE_POOL_2D
  • CONCATENATION
  • CONV_2D
  • DEPTHWISE_CONV_2D v1-2
  • EXP
  • FULLY_CONNECTED
  • LOGICAL_AND
  • LOGISTIC
  • LSTM v2 (Basic LSTM only)
  • MAX_POOL_2D
  • MAXIMUM
  • MINIMUM
  • MUL
  • PAD
  • PRELU
  • RELU
  • RELU6
  • RESHAPE
  • RESIZE_BILINEAR v1-3
  • SOFTMAX
  • STRIDED_SLICE
  • SUB
  • TRANSPOSE_CONV

Varsayılan olarak tüm işlemler yalnızca sürüm 1'de desteklenir. Miktar belirlemeyi etkinleştirmek, desteği uygun sürümleri etkinleştirir. Örneğin, sürüm 2.

GPU desteğiyle ilgili sorunları giderme

GPU yetki verilmiş kişi tarafından bazı işlemler desteklenmiyorsa çerçeve Grafiğin yalnızca bir kısmını GPU'da, kalan kısmını da CPU'da çalıştırır. Teslim tarihi bunun gibi bir bölünmüş yürütme modu olduğu gibi yüksek CPU/GPU senkronizasyonu maliyetine genellikle tüm ağın aynı cihazda çalıştırılmasına kıyasla daha düşük performansa neden olur. Yalnızca CPU. Bu durumda uygulama aşağıdaki gibi bir uyarı oluşturur:

WARNING: op code #42 cannot be handled by this delegate.

Bu gerçek bir hata olmadığı için bu tür hatalar için geri çağırma yapılmaz. çalışma zamanı hatası. Modelinizin yürütmesini GPU delegesiyle test ederken bu uyarılar için uyarınız gerekir. Bu uyarıların sayısının yüksek olması, Modelinizin GPU hızlandırma için kullanılmaya uygun olmadığını gösterir ve modelin yeniden düzenlenmesi gerekebilir.

Örnek modeller

Aşağıdaki örnek modeller, LiteRT ve referans ve test amacıyla sağlanır:

GPU'lar için optimizasyon

Aşağıdaki teknikler, modelleri çalıştırırken daha iyi performans elde etmenize yardımcı olabilir (LiteRT GPU yetkilendirmesini kullanarak GPU donanımında):

  • İşlemleri yeniden şekillendirme: CPU üzerinde hızlı olan bazı işlemlerde yüksek maliyetli oluyor. Yeniden şekillendirme işlemleri, pahalıdır (BATCH_TO_SPACE, SPACE_TO_BATCH ve SPACE_TO_DEPTH vb. Yeniden şekillendirme kullanımını yakından incelemelisiniz. ve bunun yalnızca verileri incelemek için uygulanmış olabileceğini göz önünde bulundurun veya modelinizin ilk iterasyonları için kullanılabilir. Bunları kaldırmak önemli ölçüde performansı artırır.

  • Görüntü veri kanalları: GPU'da tensor verileri 4 kanala bölünür ve Dolayısıyla [B,H,W,5] şekline sahip bir tensör üzerinde yapılan hesaplama, [B,H,W,8] şekilli bir tensörde aynı ancak şuna göre çok daha kötü: [B,H,W,4]. Kullandığınız kamera donanımı fotoğraf karelerini destekliyorsa Bu 4 kanallı giriş önemli ölçüde daha hızlı verilir. Bunun nedeni, 3 kanallı RGB'den 4 kanallı RGBX'e kopyalanmış bir bellek kopyası.

  • Mobil cihazlar için optimize edilmiş modeller: En iyi performans için aşağıdakileri göz önünde bulundurmalısınız: Sınıflandırıcınızı mobil cihazlar için optimize edilmiş ağ mimarisiyle yeniden eğitmek. Cihaz üzerinde çıkarım için optimizasyon, gecikmeyi önemli ölçüde azaltabilir ve daha az güç tüketir.

Gelişmiş GPU desteği

GPU işleme ile ek, gelişmiş teknikler kullanarak daha iyi performansa ulaşabilirsiniz. Aşağıdaki bölümlerde bu teknikler daha ayrıntılı olarak açıklanmaktadır.

Nicel modelleri kullanma

Bu bölümde, GPU yetkilendirmesinin 8 bitlik nicelenmiş modelleri nasıl hızlandırdığı açıklanmaktadır. aşağıdakiler dahil:

Performansı optimize etmek için hem kayan nokta girişine hem de çıkış tensörleridir.

Nasıl çalışır?

GPU arka ucu yalnızca kayan nokta yürütmeyi desteklediğinden orijinal modelin "kayan nokta görünümünü" vererek modelleri dönüştürebilir. Zaman: bir üst seviyeye taşımak için aşağıdaki adımları izlemeniz gerekir:

  • Sabit tensörler (ağırlıklar/önyargılar gibi), GPU belleği. Bu işlem, yetki verilmiş kullanıcı için LiteRT.

  • GPU programına yapılan giriş ve çıkışlar (8 bit ölçüldüyse) her çıkarım için nicelikten çıkarılmış ve nicelikselleştirilmiş (sırasıyla) Bu işlem LiteRT'in optimize edilmiş çekirdekleri kullanılarak CPU üzerinde yapılır.

  • Miktarı ölçülmüş hesapları taklit etmek için işlemler arasına niceleştirme simülatörleri eklenir gösterir. Bu yaklaşım, operasyonların etkinleştirme beklediği modeller için gereklidir Öğrenilen sınırları takip etmesi gerekir.

Bu özelliği GPU yetkisiyle etkinleştirme hakkında bilgi edinmek için bkz. takip etmek için:

Serileştirmeyle başlatma süresini kısaltma

GPU yetki verme özelliği, önceden derlenmiş çekirdek kodundan ve diğer model verilerinin serileştirilmesi ve diske kaydedilmesi. Bu yaklaşım, ve başlatma süresini %90'a varan oranda kısaltabilir. Bu iyileştirme, zaman tasarrufu için disk alanının değişmesi ile elde edilir. Bu özelliği etkinleştirebilirsiniz Aşağıdaki kod örneklerinde gösterildiği gibi, birkaç yapılandırma seçeneği ile oluşturabilirsiniz:

C++

    TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
    options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION;
    options.serialization_dir = kTmpDir;
    options.model_token = kModelToken;

    auto* delegate = TfLiteGpuDelegateV2Create(options);
    if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

Java

    GpuDelegate delegate = new GpuDelegate(
      new GpuDelegate.Options().setSerializationParams(
        /* serializationDir= */ serializationDir,
        /* modelToken= */ modelToken));

    Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

Serileştirme özelliğini kullanırken kodunuzun aşağıdakilerle uyumlu olduğundan emin olun: uygulama kuralları:

  • Serileştirme verilerini, başkalarının erişemeyeceği bir dizinde depolayın. Android cihazlarda getCodeCacheDir() geçerli uygulamaya özel bir konuma işaret eder.
  • Model jetonu, söz konusu model için cihaza özgü olmalıdır. Şunları yapabilirsiniz: model verilerinden parmak izi oluşturarak bir model jetonu hesaplamak için gibi kütüphaneler farmhash::Fingerprint64.
ziyaret edin.