Makine öğrenimi (ML) modellerinizi çalıştırmak için grafik işlem birimlerini (GPU'lar) kullanma modelinizin performansını ve kullanıcı deneyimini önemli ölçüde iyileştirebilir bazılarını anlatabilirsiniz. LiteRT, GPU'ların ve kullanıcıların donanım sürücüsü aracılığıyla ya da özel işlemcileri kullanarak yetki verilmiş kullanıcı. LiteRT ML'nizle GPU kullanımını etkinleştirme uygulamalar aşağıdaki yararları sağlayabilir:
- Hız: GPU'lar, çok büyük paralellik içeren yüksek işleme hızı için tasarlanmıştır. daha fazla bilgi edineceksiniz. Bu tasarım, onları derin sinir ağlarına çok uygun hale getirir. her biri giriş tensörleri üzerinde çalışan çok sayıda operatörden oluşur. paralel olarak işlenebilir. Bu da genellikle daha düşük gecikme sağlar. İçinde en iyi senaryoya göre, modelinizi bir GPU'da çalıştırmak, mümkün olmayan gerçek zamanlı uygulamalar.
- Güç verimliliği - GPU'lar, makine öğrenimi hesaplamalarını çok verimli bir ve daha az güç tüketerek daha az enerji tüketerek aynı görevden daha yüksek ısıya sahip olmasına dikkat edin.
Bu belgede, LiteRT'teki GPU desteğiyle ilgili genel bir bakış sunulur. ileri düzey kullanımlara sahip olduğunu gördük. Daha ayrıntılı bilgi için aşağıdaki kılavuzlara bakın:
GPU ML işlemleri desteği
TensorFlow ML işlemlerinin veya işlemlerinin neler olabileceğiyle ilgili bazı sınırlamalar vardır: tarafından hızlandırıldı. Temsilci, 16 bit ve 32 bit kayan nokta hassasiyetinde aşağıdaki işlemleri yapabilirsiniz:
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 belirlemeyi etkinleştirmek, desteği uygun sürümleri etkinleştirir. Örneğin, sürüm 2.
GPU desteğiyle ilgili sorunları giderme
GPU yetki verilmiş kişi tarafından bazı işlemler desteklenmiyorsa çerçeve Grafiğin yalnızca bir kısmını GPU'da, kalan kısmını da CPU'da çalıştırır. Teslim tarihi bunun gibi bir bölünmüş yürütme modu olduğu gibi yüksek CPU/GPU senkronizasyonu maliyetine genellikle tüm ağın aynı cihazda çalıştırılmasına kıyasla daha düşük performansa neden olur. Yalnızca CPU. 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 hata olmadığı için bu tür hatalar için geri çağırma yapılmaz. çalışma zamanı hatası. Modelinizin yürütmesini GPU delegesiyle test ederken bu uyarılar için uyarını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ı gösterir ve modelin yeniden düzenlenmesi gerekebilir.
Örnek modeller
Aşağıdaki örnek modeller, LiteRT ve referans ve test amacıyla sağlanır:
- MobileNet v1 (224x224) görüntüsü
sınıflandırması
- Mobil cihazlar ve yerleştirilmiş öğeler için tasarlanmış resim sınıflandırma modeli müzakere tekniklerini konuşacağız. (model)
- DeepLab segmentasyonu
(257x257)
- anlamsal etiketler atayan bir görüntü segmentasyon modelidir. her piksel piksele indirgeniyor. (model)
- MobileNet SSD nesnesi
algılama
- Farklı renkteki birden fazla nesneyi algılayan bir görüntü sınıflandırma modeli sınırlayıcı kutular var. (model)
- Poz için PoseNet
tahmin
- Görüntüdeki insanların duruşlarını tahmin eden bir vizyon modeli videosunu izleyin. (model)
GPU'lar için optimizasyon
Aşağıdaki teknikler, modelleri çalıştırırken daha iyi performans elde etmenize yardımcı olabilir (LiteRT GPU yetkilendirmesini kullanarak GPU donanımında):
İşlemleri yeniden şekillendirme: CPU üzerinde hızlı olan bazı işlemlerde yüksek maliyetli oluyor. Yeniden şekillendirme işlemleri, pahalıdır (
BATCH_TO_SPACE
,SPACE_TO_BATCH
veSPACE_TO_DEPTH
vb. Yeniden şekillendirme kullanımını yakından incelemelisiniz. ve bunun yalnızca verileri incelemek için uygulanmış olabileceğini göz önünde bulundurun veya modelinizin ilk iterasyonları için kullanılabilir. Bunları kaldırmak önemli ölçüde performansı artırır.Görüntü veri kanalları: GPU'da tensor verileri 4 kanala bölünür ve Dolayısıyla
[B,H,W,5]
şekline sahip bir tensör üzerinde yapılan hesaplama,[B,H,W,8]
şekilli bir tensörde aynı ancak şuna göre çok daha kötü:[B,H,W,4]
. Kullandığınız kamera donanımı fotoğraf karelerini destekliyorsa Bu 4 kanallı giriş önemli ölçüde daha hızlı verilir. Bunun nedeni, 3 kanallı RGB'den 4 kanallı RGBX'e kopyalanmış bir bellek kopyası.Mobil cihazlar için optimize edilmiş modeller: En iyi performans için aşağıdakileri göz önünde bulundurmalısınız: Sınıflandırıcınızı mobil cihazlar için optimize edilmiş ağ mimarisiyle yeniden eğitmek. Cihaz üzerinde çıkarım için optimizasyon, gecikmeyi önemli ölçüde azaltabilir ve daha az güç tüketir.
Gelişmiş GPU desteği
GPU işleme ile ek, gelişmiş teknikler kullanarak daha iyi performansa ulaşabilirsiniz. Aşağıdaki bölümlerde bu teknikler daha ayrıntılı olarak açıklanmaktadır.
Nicel modelleri kullanma
Bu bölümde, GPU yetkilendirmesinin 8 bitlik nicelenmiş modelleri nasıl hızlandırdığı açıklanmaktadır. aşağıdakiler dahil:
- Nicelleştirmeye duyarlı eğitim ile eğitilen modeller
- Eğitim sonrası dinamik aralık ölçümü
- Eğitim sonrası tam tam sayı niceleme
Performansı optimize etmek için hem kayan nokta girişine hem de çıkış tensörleridir.
Nasıl çalışır?
GPU arka ucu yalnızca kayan nokta yürütmeyi desteklediğinden orijinal modelin "kayan nokta görünümünü" vererek modelleri dönüştürebilir. Zaman: bir üst seviyeye taşımak için aşağıdaki adımları izlemeniz gerekir:
Sabit tensörler (ağırlıklar/önyargılar gibi), GPU belleği. Bu işlem, yetki verilmiş kullanıcı için LiteRT.
GPU programına yapılan giriş ve çıkışlar (8 bit ölçüldüyse) her çıkarım için nicelikten çıkarılmış ve nicelikselleştirilmiş (sırasıyla) Bu işlem LiteRT'in optimize edilmiş çekirdekleri kullanılarak CPU üzerinde yapılır.
Miktarı ölçülmüş hesapları taklit etmek için işlemler arasına niceleştirme simülatörleri eklenir gösterir. Bu yaklaşım, operasyonların etkinleştirme beklediği modeller için gereklidir Öğrenilen sınırları takip etmesi gerekir.
Bu özelliği GPU yetkisiyle etkinleştirme hakkında bilgi edinmek için bkz. takip etmek için:
- Android'de GPU ile nicelenmiş modelleri kullanma
- iOS'te GPU ile nicelenmiş modelleri kullanma
Serileştirmeyle başlatma süresini kısaltma
GPU yetki verme özelliği, önceden derlenmiş çekirdek kodundan ve diğer model verilerinin serileştirilmesi ve diske kaydedilmesi. Bu yaklaşım, ve başlatma süresini %90'a varan oranda kısaltabilir. Bu iyileştirme, zaman tasarrufu için disk alanının değişmesi ile elde edilir. Bu özelliği etkinleştirebilirsiniz Aşağıdaki kod örneklerinde gösterildiği gibi, birkaç yapılandırma seçeneği ile oluşturabilirsiniz:
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 aşağıdakilerle uyumlu olduğundan emin olun: uygulama kuralları:
- Serileştirme verilerini, başkalarının erişemeyeceği bir dizinde depolayın.
Android cihazlarda
getCodeCacheDir()
geçerli uygulamaya özel bir konuma işaret eder. - Model jetonu, söz konusu model için cihaza özgü olmalıdır. Şunları yapabilirsiniz:
model verilerinden parmak izi oluşturarak bir model jetonu hesaplamak için
gibi kütüphaneler
farmhash::Fingerprint64
.