TensorFlow Lite için GPU delegeleri

Makine öğrenimi (ML) modellerinizi çalıştırmak için grafik işleme birimlerini (GPU'lar) kullanmak, modelinizin performansını ve ML özellikli uygulamalarınızın kullanıcı deneyimini önemli ölçüde iyileştirebilir. TensorFlow Lite, delegeler adı verilen donanım sürücüsü aracılığıyla GPU'ların ve diğer özel işlemcilerin kullanılmasını sağlar. TensorFlow Lite ML uygulamalarınızla GPU'ların kullanılmasını sağlamak aşağıdaki faydaları sağlayabilir:

  • Hız - GPU'lar, büyük ölçüde paralel iş yüklerinin yüksek verimi için oluşturulmuştur. Bu tasarım onları, her biri paralel olarak işlenebilen giriş tensörleri üzerinde çalışan ve genellikle daha düşük gecikme ile 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 üzerinde çalıştırmak, daha önce mümkün olmayan gerçek zamanlı uygulamaları etkinleştirmek için yeterince hızlı çalışabilir.
  • Güç verimliliği - GPU'lar, ML hesaplamalarını çok verimli ve optimize edilmiş bir şekilde gerçekleştirir, genellikle daha az güç tüketir ve CPU'larda çalışan aynı görevden daha az ısı üretir.

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

GPU ML işlemleri desteği

TensorFlow Lite GPU temsilcisi tarafından hangi TensorFlow ML işlemlerinin veya işlemlerin hızlandırılabileceğine ilişkin bazı sınırlamalar vardır. Temsilci, 16 bit ve 32 bit kayan nokta kesinliğinde aşağıdaki işlemleri destekler:

  • ADD
  • AVERAGE_POOL_2D
  • CONCATENATION
  • CONV_2D
  • DEPTHWISE_CONV_2D v1-2
  • EXP
  • FULLY_CONNECTED
  • 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. Kuantizasyon desteğinin etkinleştirilmesi, örneğin ADD v2 gibi uygun sürümleri etkinleştirir.

GPU desteğinde sorun giderme

İşlemlerden bazıları GPU delegesi tarafından desteklenmiyorsa, çerçeve grafiğin yalnızca bir kısmını GPU'da ve kalan kısmı CPU'da çalıştırır. CPU/GPU senkronizasyonunun yüksek maliyeti nedeniyle, bunun gibi bir bölünmüş yürütme modu genellikle tüm ağın yalnızca CPU üzerinde çalıştırılmasına göre daha yavaş performansa neden olur. Bu durumda, uygulama aşağıdaki gibi uyarı ü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şı uyanık 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ırmasından yararlanmak için oluşturulmuştur ve referans ve test için 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:

  • Yeniden şekillendirme işlemleri - Bir CPU'da hızlı olan bazı işlemler, mobil cihazlarda GPU için yüksek maliyete sahip olabilir. BATCH_TO_SPACE , SPACE_TO_BATCH , SPACE_TO_DEPTH vb. dahil olmak üzere yeniden şekillendirme işlemlerinin çalıştırılması özellikle pahalıdır. Yeniden şekillendirme işlemlerinin kullanımını yakından incelemelisiniz ve bunun yalnızca verileri keşfetmek veya modelinizin erken yinelemeleri için uygulanmış olabileceğini göz önünde bulundurmalısınız. 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 bu nedenle [B,H,W,5] şeklindeki bir tensör üzerindeki bir hesaplama, [B,H, [B,H,W,8] şeklindeki bir tensör üzerinde yaklaşık olarak 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'da görüntü çerçevelerini destekliyorsa, 3 kanallı RGB'den 4 kanallı RGBX'e bir bellek kopyalamasını önlediğinden, bu 4 kanallı girişi beslemek önemli ölçüde daha hızlıdır.

  • Mobil için optimize edilmiş modeller - En iyi performans için, sınıflandırıcınızı mobil cihazlar için optimize edilmiş bir ağ mimarisiyle yeniden eğitmeyi düşünmelisiniz. Cihaz üzerinde çı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 nicemleme ve serileştirme de dahil olmak üzere daha da iyi performans sağlamak için GPU işleme ile ek, gelişmiş teknikler kullanabilirsiniz. Aşağıdaki bölümlerde bu teknikler daha ayrıntılı olarak açıklanmaktadır.

Kuantize modelleri kullanma

Bu bölüm, GPU temsilcisinin aşağıdakiler de dahil olmak üzere 8 bit nicelleştirilmiş modelleri nasıl hızlandırdığını açıklar:

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

Bu nasıl çalışıyor?

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

  • Sabit tensörler (ağırlıklar/önyargılar gibi) GPU belleğine bir kez de-kuantize edilir. Bu işlem, temsilci TensorFlow Lite için etkinleştirildiğinde gerçekleşir.

  • GPU programına girdiler ve çıktılar , eğer 8-bit nicelenmişse, her bir çıkarım için nicemlenmemiş ve nicemlenmiştir (sırasıyla). Bu işlem, TensorFlow Lite'ın optimize edilmiş çekirdekleri kullanılarak CPU üzerinde yapılır.

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

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

Serileştirme ile başlatma süresinin azaltılması

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üklemenize 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ı değiştirilerek elde edilir. Aşağıdaki kod örneklerinde gösterildiği gibi, bu özelliği 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 uyduğ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 model için cihaza özel olmalıdır. farmhash::Fingerprint64 gibi kitaplıkları kullanarak model verilerinden bir parmak izi oluşturarak bir model belirteci hesaplayabilirsiniz.