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:
- MobileNet v1 (224x224) görüntü sınıflandırması - Mobil ve gömülü tabanlı görme uygulamaları için tasarlanmış bir görüntü sınıflandırma modeli. ( model )
- DeepLab segmentasyonu (257x257) - giriş görüntüsündeki her piksele köpek, kedi, araba gibi anlamsal etiketler atayan görüntü segmentasyon modeli. ( model )
- MobileNet SSD nesne algılama - Sınırlayıcı kutulara sahip birden fazla nesneyi algılayan bir görüntü sınıflandırma modeli. ( model )
- PoseNet for poz tahmini - Görüntü veya videodaki insanların pozlarını tahmin eden bir görüş modeli. ( model )
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:
- Niceleme odaklı eğitimle eğitilen modeller
- Eğitim sonrası dinamik aralık nicelemesi
- Eğitim sonrası tam tamsayı nicemleme
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:
- Android'de GPU ile nicelenmiş modelleri kullanma
- iOS'ta GPU ile nicelenmiş modelleri kullanma
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.