TensorFlow Lite için GPU yetki verilmiş kullanıcılar

Makine öğrenimi (ML) modellerinizi çalıştırmak için grafik işlem birimlerini (GPU'lar) kullanmak, modelinizin performansını ve makine öğrenimi özellikli uygulamalarınızın kullanıcı deneyimini büyük ölçüde artırabilir. TensorFlow Lite, yetki verilmiş adı verilen donanım sürücüsü üzerinden 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, şu avantajları sağlayabilir:

  • Hız: GPU'lar, çok büyük paralel iş yüklerinin yüksek işleme hızına uygun şekilde tasarlanmıştır. Bu tasarım, modellerin her biri paralel olarak işlenebilen giriş tensörleri üzerinde çalışan çok sayıda operatörden oluşan derin nöral ağlar için uygun olmasını sağlar. Bu da genellikle daha düşük gecikmeye neden olur. 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, makine öğrenimi hesaplamalarını çok verimli ve optimize edilmiş bir şekilde gerçekleştirir. Bu işlem genellikle CPU'larda çalışan aynı görevden daha az güç tüketir ve daha az ısı üretir.

Bu belgede, TensorFlow Lite'taki GPU desteğiyle ilgili genel bir bakış ve GPU işlemcilerinin bazı gelişmiş kullanımları sunulmaktadır. Belirli platformlarda GPU desteğini uygulama 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 yetki verilmişi tarafından hangi TensorFlow ML işlemlerinin veya işlemlerin hızlandırılabileceği konusunda bazı sınırlamalar vardır. Temsilci, aşağıdaki işlemleri 16 bit ve 32 bit kayan hassasiyette 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. Miktar belirleme desteğini etkinleştirmek, uygun sürümleri etkinleştirir (örneğin, ADD v2).

GPU desteğiyle ilgili sorunları giderme

GPU yetki verilmiş kullanıcı tarafından bazı işlemler desteklenmiyorsa çerçeve yalnızca grafiğin bir kısmını GPU'da, kalan kısmını da CPU'da çalıştırır. CPU/GPU senkronizasyonunun yüksek maliyeti nedeniyle, bu gibi bir bölünmüş yürütme modu genellikle tüm ağın yalnızca CPU üzerinde çalıştırılmasına kıyasla daha yavaş performansa neden olur. 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 çalışma zamanı hatası olmadığından bu tür hatalar için geri çağırma yapılmaz. Modelinizin yürütülmesini GPU yetkiyle test ederken bu uyarılara karşı dikkatli olmanı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ı ve modelin yeniden düzenlenmesini gerektirebilir.

Örnek modeller

Aşağıdaki örnek modeller, TensorFlow Lite ile GPU hızlandırmadan yararlanacak şekilde oluşturulmuştur ve referans ve test için sağlanmıştır:

GPU'lar için optimizasyon

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

  • İşlemleri yeniden şekillendirme: Bir CPU'da hızlı yapılan bazı işlemlerin mobil cihazlardaki GPU için maliyeti yüksek 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 incelemeniz ve bu işlemin yalnızca verileri incelemek ya da modelinizin ilk iterasyonlarında uygulanmış olabileceğini göz önünde bulundurmalısınız. Bunları kaldırmak performansı önemli ölçüde artırabilir.

  • Resim veri kanalları - GPU'da, tensor verileri 4 kanala dilimlenir. Dolayısıyla [B,H,W,5] şekline sahip bir tensör üzerinde yapılan hesaplama, [B,H,W,8] şeklindeki tensörde hemen hemen aynı performansı gösterir, ancak [B,H,W,4] biçiminden çok daha kötüdür. Kullandığınız kamera donanımı RGBA'daki resim çerçevelerini destekliyorsa bu 4 kanallı girişi beslemek, 3 kanallı RGB'den 4 kanallı RGBX'e bellek kopyalamasını önlediği için çok 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 göz önünde bulundurmanız gerekir. 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

Modellerinizde niceleme ve serileştirme gibi daha da iyi performans elde etmek 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.

Nicel modelleri kullanma

Bu bölümde, GPU yetki verilmişin 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 nokta giriş hem de çıkış tensörlerine sahip modeller kullanın.

İşleyiş şekli nasıldır?

GPU arka ucu yalnızca kayan nokta yürütmesini desteklediğinden niceliklendirilmiş modelleri, orijinal modelin "kayan nokta görünümünü" vererek çalıştırırız. Bu süreç, üst düzeyde aşağıdaki adımları içerir:

  • Sabit tensörler (ağırlıklar/önyargılar gibi) GPU belleğinde bir kez nicelikten çıkarılır. Bu işlem, yetki verilmiş kullanıcı TensorFlow Lite için etkinleştirildiğinde gerçekleşir.

  • GPU programına yapılan giriş ve çıkışların, 8 bit olarak nicelenmesi gerekir, bu da her bir çıkarım için nicelikten çıkarılır ve sonra nicelik olarak belirlenir. Bu işlem, TensorFlow Lite'ın optimize edilmiş çekirdekleri kullanılarak CPU üzerinde gerçekleştirilir.

  • Miktarlandırılmış davranışı taklit etmek için işlemler arasına niceleştirme simülatörleri eklenir. Bu yaklaşım, operasyonların etkinleştirmelerin niceleme sırasında öğrenilen sınırları takip etmesini beklediği modeller için gereklidir.

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

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

GPU yetkilendirme özelliği, önceden derlenmiş çekirdek kodundan yükleme yapmanıza ve önceki çalıştırmalarda serileştirilmiş ve diske kaydedilmiş verileri modellemenize olanak tanır. Bu yaklaşım yeniden derlemeyi önler ve başlatma süresini %90'a varan oranda azaltabilir. Bu iyileştirme, disk alanının değiştirilmesiyle zaman tasarrufu sağlayarak sağlanır. 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 depolayın. Android cihazlarda, geçerli uygulamaya özel bir konumu işaret eden getCodeCacheDir() özelliğini kullanın.
  • Model jetonu, söz konusu model için cihaza özgü olmalıdır. farmhash::Fingerprint64 gibi kitaplıklar kullanarak model verilerinden parmak izi oluşturarak model jetonu hesaplayabilirsiniz.