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 makine öğrenimi özellikli uygulamalarınızın kullanıcı deneyimini önemli ölçüde iyileştirebilir. 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ını sağlar. 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 üretilmiştir. Bu tasarım, onları, her biri paralel olarak işlenebilen giriş tensörleri üzerinde çalışan ve tipik olarak 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 üzerinde ç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, makine öğrenimi hesaplamalarını çok verimli ve optimize edilmiş bir şekilde yürütür, tipik olarak aynı görevin CPU'larda çalışmasına kıyasla daha az güç tüketir ve 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ış sunar. Belirli platformlarda GPU desteği uygulama hakkında daha spesifik bilgiler için aşağıdaki kılavuzlara bakın:

GPU ML işlemleri desteği

Hangi 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 nokta hassasiyetinde 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, örneğin ADD v2 gibi uygun sürümleri etkinleştirir.

GPU desteğinde sorun giderme

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

GPU'lar için optimize etme

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şlemlerin, mobil cihazlarda GPU için yüksek maliyeti olabilir. BATCH_TO_SPACE , SPACE_TO_BATCH , SPACE_TO_DEPTH vb. dahil 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 keşfetmek veya modelinizin ilk 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 böylece [B,H,W,5] şeklindeki bir tensör üzerindeki hesaplama [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] den önemli ölçüde daha kötü. Kullanmakta olduğunuz kamera donanımı RGBA'da görüntü çerçevelerini destekliyorsa, 3 kanallı RGB'den 4 kanallı RGBX'e bellek kopyalamayı önlediğinden, bu 4 kanallı girişi beslemek önemli ölçüde daha hızlıdır.

  • Mobil cihazlar 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 üstü çı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 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ümde, GPU temsilcisinin aşağıdakiler de dahil olmak üzere 8 bit 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 modeller kullanın.

Bu nasıl çalışır?

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

  • Sabit tensörler (ağırlıklar/yanlılıklar gibi) bir kez GPU belleğine nicemlenir. 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 nicemlenirse, her çıkarım için nicemlenir ve (sırasıyla) nicelenir. 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 operasyonlar arasına 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 temsilcisi ile etkinleştirme hakkında bilgi için aşağıdakilere bakın:

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

GPU temsilcisi özelliği, önceden derlenmiş çekirdek kodundan yükleme yapmanızı ve önceki çalıştırmalardan serileştirilmiş ve diske kaydedilmiş model verilerini yüklemenizi sağlar. 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. 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);
      

Seri hale getirme özelliğini kullanırken, kodunuzun şu uygulama kurallarına uyduğundan emin olun:

  • Serileştirme verilerini diğer uygulamalar tarafından erişilemeyen 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 özgü olmalıdır. farmhash::Fingerprint64 gibi kitaplıkları kullanarak model verilerinden bir parmak izi oluşturarak bir model belirtecini hesaplayabilirsiniz.