TensorFlow Lite için GPU delegeleri

Makine öğrenimi (ML) modellerinizi çalıştırmak için grafik işlem birimlerini (GPU'lar) kullanmak, modelinizin performansını ve ML özellikli uygulamalarınızın kullanıcı deneyimini önemli ölçüde artırabilir. TensorFlow Lite, delege adı verilen donanım sürücüsü aracılığıyla GPU'ların ve diğer özel işlemcilerin kullanılmasına olanak tanır. TensorFlow Lite ML uygulamalarınızla GPU kullanımını etkinleştirmek aşağıdaki avantajları sağlayabilir:

  • Hız - GPU'lar, büyük ölçüde paralel iş yüklerinin yüksek verimi için tasarlanmıştır. Bu tasarım onları, her biri paralel olarak işlenebilen giriş tensörleri üzerinde çalışan ve genellikle daha düşük gecikmeyle sonuçlanan çok sayıda operatörden oluşan derin sinir ağları için çok uygun hale getirir. En iyi senaryoda, modelinizi bir GPU'da çalıştırmak, daha önce mümkün olmayan gerçek zamanlı uygulamaları etkinleştirecek kadar hızlı çalışabilir.
  • Güç verimliliği - GPU'lar, ML hesaplamalarını çok verimli ve optimize edilmiş bir şekilde gerçekleştirir; genellikle aynı görevin CPU'larda çalıştırılmasına kıyasla daha az güç tüketir ve daha az ısı üretir.

Bu belge, TensorFlow Lite'taki GPU desteğine genel bir bakış ve GPU işlemcilerinin bazı gelişmiş kullanımlarını sağlar. Belirli platformlarda GPU desteğinin uygulanması hakkında daha spesifik bilgi için aşağıdaki kılavuzlara bakın:

GPU ML işlemleri desteği

TensorFlow ML işlemlerinin veya ops'un TensorFlow Lite GPU temsilcisi tarafından hızlandırılabileceği konusunda bazı sınırlamalar vardır. Temsilci, 16 bit ve 32 bit kayan hassasiyette aşağıdaki işlemleri destekler:

  • 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. Niceleme desteğinin etkinleştirilmesi, uygun sürümlerin (örneğin, ADD v2) etkinleştirilmesini sağlar.

GPU desteği sorunlarını giderme

Bazı işlemler GPU temsilcisi tarafından desteklenmiyorsa, çerçeve grafiğin yalnızca bir bölümünü GPU'da ve geri kalan kısmını CPU'da çalıştırır. CPU/GPU senkronizasyonunun yüksek maliyeti nedeniyle, bunun gibi bölünmüş yürütme modu genellikle tüm ağın yalnızca CPU üzerinde çalıştırıldığı duruma göre daha yavaş performansla sonuçlanır. Bu durumda uygulama aşağıdaki gibi uyarılar üretir:

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

Bu gerçek bir çalışma zamanı hatası olmadığından, bu tür hatalar için geri arama yoktur. Modelinizin yürütülmesini GPU temsilcisiyle test ederken bu uyarılara karşı dikkatli olmalısınız. Bu uyarıların çok sayıda olması, modelinizin GPU hızlandırma için en uygun kullanım olmadığını gösterebilir ve modelin yeniden düzenlenmesini gerektirebilir.

Örnek modeller

Aşağıdaki örnek modeller, TensorFlow Lite ile GPU hızlandırmanın avantajlarından yararlanmak için oluşturulmuş olup referans ve test amacıyla sağlanmıştır:

GPU'lar için optimizasyon

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

  • İşlemleri yeniden şekillendirme - CPU'da hızlı olan bazı işlemlerin, mobil cihazlarda GPU için yüksek maliyeti olabilir. BATCH_TO_SPACE , SPACE_TO_BATCH , SPACE_TO_DEPTH ve benzeri yeniden şekillendirme işlemlerinin çalıştırılması özellikle pahalıdır. Yeniden şekillendirme işlemlerinin kullanımını yakından incelemeli ve bunun yalnızca verileri araştırmak için veya modelinizin erken yinelemeleri için uygulanmış olabileceğini düşünmelisiniz. Bunları kaldırmak performansı önemli ölçüde artırabilir.

  • Görüntü veri kanalları - GPU'da tensör verileri 4 kanala bölünür ve dolayısıyla [B,H,W,5] şeklindeki bir tensör üzerinde yapılan hesaplama [B,H,W,8] şeklindeki bir tensör üzerinde hemen hemen aynı performansı gösterir. [B,H,W,8] , ancak [B,H,W,4] ten önemli ölçüde daha kötü. Kullandığınız kamera donanımı RGBA'daki görüntü çerçevelerini destekliyorsa, 3 kanallı RGB'den 4 kanallı RGBX'e bellek kopyalamayı önlediği için bu 4 kanallı girişi beslemek önemli ölçüde daha hızlı olur.

  • Mobil cihazlar için optimize edilmiş modeller - En iyi performansı elde etmek için sınıflandırıcınızı mobil cihazlar için optimize edilmiş bir ağ mimarisiyle yeniden eğitmeyi düşünmelisiniz. Cihaz içi çıkarım için optimizasyon, mobil donanım özelliklerinden yararlanarak gecikmeyi ve güç tüketimini önemli ölçüde azaltabilir.

Gelişmiş GPU desteği

Modelleriniz için niceleme ve serileştirme de dahil olmak üzere daha da iyi performans sağlamak amacıyla GPU işlemeyle birlikte ek, gelişmiş teknikler kullanabilirsiniz. Aşağıdaki bölümlerde bu teknikler daha ayrıntılı olarak açıklanmaktadır.

Nicelenmiş modelleri kullanma

Bu bölümde GPU temsilcisinin aşağıdakiler de dahil olmak üzere 8 bitlik nicelenmiş modelleri nasıl hızlandırdığı açıklanmaktadır:

Performansı optimize etmek için hem kayan noktalı giriş hem de çıkış tensörlerine sahip modelleri kullanın.

Bu nasıl çalışır?

GPU arka ucu yalnızca kayan nokta yürütmeyi desteklediğinden, nicelenmiş modelleri, ona orijinal modelin 'kayan nokta görünümünü' vererek çalıştırırız. Yüksek düzeyde bu, aşağıdaki adımları gerektirir:

  • Sabit tensörlerin (ağırlıklar/eğilimler gibi) GPU belleğine bir kez dekuantizasyonu sağlanır. Bu işlem, temsilci TensorFlow Lite için etkinleştirildiğinde gerçekleşir.

  • GPU programının girdileri ve çıktıları , eğer 8 bit nicelenmişse, her çıkarım için (sırasıyla) nicemlenmiş ve nicelenmişlerdir. Bu işlem, TensorFlow Lite'ın optimize edilmiş çekirdekleri kullanılarak CPU üzerinde gerçekleştirilir.

  • Nicelenmiş davranışı taklit etmek için işlemler arasına nicemleme simülatörleri eklenir. Bu yaklaşım, operasyonların aktivasyonların niceleme sırasında öğrenilen sınırları takip etmesini beklediği modeller için gereklidir.

Bu özelliği GPU temsilcisiyle etkinleştirme hakkında bilgi için aşağıdakilere bakın:

Serileştirmeyle başlatma süresini azaltma

GPU temsilci özelliği, önceden derlenmiş çekirdek kodundan yükleme yapmanıza ve önceki çalıştırmalardan serileştirilmiş ve diske kaydedilmiş model verilerinden yükleme yapmanıza olanak tanır. Bu yaklaşım yeniden derlemeyi önler ve başlatma süresini %90'a kadar azaltabilir. Bu iyileştirme, zaman tasarrufu için disk alanının değiştirilmesiyle elde edilir. Bu özelliği, aşağıdaki kod örneklerinde gösterildiği gibi birkaç yapılandırma seçeneğiyle etkinleştirebilirsiniz:

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 şu uygulama kurallarına uygun olduğundan emin olun:

  • Serileştirme verilerini diğer uygulamaların erişemeyeceği bir dizinde saklayın. Android cihazlarda, geçerli uygulamaya özel bir konuma işaret eden getCodeCacheDir() kullanın.
  • Model belirteci, belirli bir model için cihaza özgü olmalıdır. farmhash::Fingerprint64 gibi kitaplıkları kullanarak model verilerinden bir parmak izi oluşturarak bir model belirtecini hesaplayabilirsiniz.