giriiş
Temsilciler, GPU ve Dijital Sinyal İşlemcisi (DSP) gibi cihaz içi hızlandırıcılardan yararlanarak TensorFlow Lite modellerinin donanım hızlandırmasını sağlar.
Varsayılan olarak TensorFlow Lite, ARM Neon komut seti için optimize edilmiş CPU çekirdeklerini kullanır. Ancak CPU, genellikle Makine Öğrenimi modellerinde bulunan ağır aritmetik (örneğin, evrişim ve yoğun katmanlarda yer alan matris matematiği) için mutlaka optimize edilmeyen çok amaçlı bir işlemcidir.
Öte yandan modern cep telefonlarının çoğu, bu ağır operasyonların üstesinden daha iyi gelebilecek çipler içeriyor. Bunları sinir ağı operasyonları için kullanmak, gecikme ve güç verimliliği açısından büyük faydalar sağlar. Örneğin, GPU'lar gecikmede 5 kata kadar hızlanma sağlayabilirken, Qualcomm® Hexagon DSP'nin güç tüketimini %75'e kadar azalttığı deneylerde gösterilmiştir.
Bu hızlandırıcıların her biri, mobil GPU için OpenCL veya OpenGL ES ve DSP için Qualcomm® Hexagon SDK gibi özel hesaplamaları mümkün kılan ilişkili API'lere sahiptir. Tipik olarak, bir sinir ağını bu arayüzler üzerinden çalıştırmak için çok sayıda özel kod yazmanız gerekir. Her hızlandırıcının kendine göre artıları ve eksileri olduğunu ve sinir ağındaki her işlemi gerçekleştiremeyeceğini düşündüğünüzde işler daha da karmaşıklaşıyor. TensorFlow Lite'ın Delege API'si, TFLite çalışma zamanı ile bu alt düzey API'ler arasında bir köprü görevi görerek bu sorunu çözer.
Delege Seçimi
TensorFlow Lite, her biri belirli platform(lar) ve belirli model türleri için optimize edilmiş birden fazla delegeyi destekler. Genellikle, iki ana kritere bağlı olarak kullanım durumunuza uygun birden fazla delege olacaktır: hedeflediğiniz Platform (Android veya iOS?) ve hızlandırmaya çalıştığınız Model türü (kayan nokta veya nicemlenmiş?) .
Platforma Göre Delegeler
Çapraz platform (Android ve iOS)
- GPU temsilcisi - GPU temsilcisi hem Android hem de iOS'ta kullanılabilir. GPU'nun mevcut olduğu 32 bit ve 16 bit kayan tabanlı modelleri çalıştıracak şekilde optimize edilmiştir. Ayrıca 8 bitlik nicelenmiş modelleri destekler ve kayan versiyonlarıyla aynı seviyede GPU performansı sağlar. GPU temsilcisiyle ilgili ayrıntılar için bkz . GPU'da TensorFlow Lite . GPU temsilcisini Android ve iOS'ta kullanmaya ilişkin adım adım eğitimler için TensorFlow Lite GPU Temsilcisi Eğitimi'ne bakın.
Android
- Daha yeni Android cihazlar için NNAPI temsilcisi - NNAPI temsilcisi, GPU, DSP ve/veya NPU'nun mevcut olduğu Android cihazlarda modelleri hızlandırmak için kullanılabilir. Android 8.1 (API 27+) veya üzeri sürümlerde mevcuttur. NNAPI temsilcisine genel bir bakış, adım adım talimatlar ve en iyi uygulamalar için bkz . TensorFlow Lite NNAPI temsilcisi .
- Eski Android cihazlar için Hexagon temsilcisi - Hexagon temsilcisi, Qualcomm Hexagon DSP'ye sahip Android cihazlardaki modelleri hızlandırmak için kullanılabilir. NNAPI'yi desteklemeyen eski Android sürümlerini çalıştıran cihazlarda kullanılabilir. Daha fazla ayrıntı için TensorFlow Lite Hexagon temsilcisine bakın.
iOS
- Daha yeni iPhone'lar ve iPad'ler için Core ML temsilcisi - Neural Engine'in mevcut olduğu daha yeni iPhone'lar ve iPad'ler için, 32 bit veya 16 bit kayan noktalı modellere yönelik çıkarımı hızlandırmak amacıyla Core ML temsilcisini kullanabilirsiniz. Neural Engine, A12 SoC veya daha yüksek bir sürüme sahip Apple mobil cihazlarında kullanılabilir. Core ML temsilcisine genel bakış ve adım adım talimatlar için bkz. TensorFlow Lite Core ML temsilcisi .
Model türüne göre delegeler
Her hızlandırıcı, belirli bir bit genişliğine sahip veriler göz önünde bulundurularak tasarlanmıştır. Yalnızca 8 bitlik nicelenmiş işlemleri destekleyen bir temsilciye kayan noktalı bir model sağlarsanız ( Hexagon temsilcisi gibi), tüm işlemlerini reddeder ve model tamamen CPU üzerinde çalışır. Bu tür sürprizlerden kaçınmak için aşağıdaki tabloda model türüne göre delege desteğine genel bir bakış sunulmaktadır:
Modeli Türü | GPU | NNAPI | Altıgen | CoreML |
---|---|---|---|---|
Kayan nokta (32 bit) | Evet | Evet | HAYIR | Evet |
Eğitim sonrası float16 nicelemesi | Evet | HAYIR | HAYIR | Evet |
Eğitim sonrası dinamik aralık kuantizasyonu | Evet | Evet | HAYIR | HAYIR |
Eğitim sonrası tamsayı nicemleme | Evet | Evet | Evet | HAYIR |
Kuantizasyona duyarlı eğitim | Evet | Evet | Evet | HAYIR |
Performansı doğrulama
Bu bölümdeki bilgiler, başvurunuzu geliştirebilecek delegelerin kısa listesini oluşturmak için kaba bir kılavuz görevi görür. Ancak her delegenin desteklediği önceden tanımlanmış bir dizi işlem bulunduğunu ve modele ve cihaza bağlı olarak farklı şekilde performans gösterebileceğini unutmamak önemlidir; örneğin, NNAPI temsilcisi bir Pixel telefonda Google'ın Edge-TPU'sunu kullanırken başka bir cihazda DSP kullanmayı seçebilir. Bu nedenle, bir temsilcinin ihtiyaçlarınız açısından ne kadar yararlı olduğunu ölçmek için genellikle bazı kıyaslamalar yapmanız önerilir. Bu aynı zamanda TensorFlow Lite çalışma zamanına bir temsilci eklenmesiyle ilişkili ikili boyut artışını haklı çıkarmaya da yardımcı olur.
TensorFlow Lite, geliştiricilerin uygulamalarında delegeleri kullanma konusunda kendilerine güvenmelerini sağlayacak kapsamlı performans ve doğruluk değerlendirme araçlarına sahiptir. Bu araçlar bir sonraki bölümde tartışılmaktadır.
Değerlendirme Araçları
Gecikme ve bellek ayak izi
TensorFlow Lite'ın kıyaslama aracı , ortalama çıkarım gecikmesi, başlatma yükü, bellek alanı vb. dahil olmak üzere model performansını tahmin etmek için uygun parametrelerle kullanılabilir. Bu araç, modeliniz için en iyi delege yapılandırmasını bulmak için birden fazla bayrağı destekler. Örneğin, OpenGL ile GPU yürütmesini ölçmek için --gpu_backend=gl
--use_gpu
ile belirtilebilir. Desteklenen temsilci parametrelerinin tam listesi ayrıntılı belgelerde tanımlanmıştır.
adb
aracılığıyla GPU'lu nicelenmiş bir model için çalıştırılan bir örnek:
adb shell /data/local/tmp/benchmark_model \
--graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
--use_gpu=true
Bu aracın Android için 64 bit ARM mimarisine yönelik önceden oluşturulmuş sürümünü buradan indirebilirsiniz ( daha fazla ayrıntı ).
Doğruluk ve doğruluk
Delegeler genellikle hesaplamaları CPU muadillerinden farklı bir hassasiyetle gerçekleştirirler. Sonuç olarak, donanım hızlandırma için bir temsilci kullanmayla ilgili (genellikle küçük) bir doğruluk değiş tokuşu vardır. Bunun her zaman doğru olmadığını unutmayın; örneğin, GPU nicelenmiş modelleri çalıştırmak için kayan nokta hassasiyetini kullandığından, hassasiyette hafif bir iyileşme olabilir (örneğin, ILSVRC görüntü sınıflandırmasında <%1 İlk 5 iyileştirme).
TensorFlow Lite, bir delegenin belirli bir model için ne kadar doğru davrandığını ölçmek için iki tür araca sahiptir: Görev Tabanlı ve Görevden Bağımsız . Bu bölümde açıklanan tüm araçlar, önceki bölümdeki kıyaslama aracı tarafından kullanılan gelişmiş delegasyon parametrelerini destekler. Aşağıdaki alt bölümlerin model değerlendirmesinden (Modelin kendisi görev için iyi mi?) ziyade delege değerlendirmesine (Delege CPU ile aynı performansı mı gösteriyor?) odaklandığını unutmayın.
Görev Bazlı Değerlendirme
TensorFlow Lite, iki görüntü tabanlı görevin doğruluğunu değerlendirmek için araçlara sahiptir:
En üst düzeyde doğrulukla ILSVRC 2012 (Görüntü Sınıflandırması)
Ortalama Ortalama Hassasiyet (mAP) ile COCO Nesne Algılama (sınırlayıcı kutularla)
Bu araçların önceden oluşturulmuş ikili dosyaları (Android, 64 bit ARM mimarisi) ve belgeleri burada bulunabilir:
Aşağıdaki örnek, Pixel 4'te Google'ın Edge-TPU'sunu kullanan NNAPI ile görüntü sınıflandırma değerlendirmesini göstermektedir:
adb shell /data/local/tmp/run_eval \
--model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
--ground_truth_images_path=/data/local/tmp/ilsvrc_images \
--ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
--model_output_labels=/data/local/tmp/model_output_labels.txt \
--output_file_path=/data/local/tmp/accuracy_output.txt \
--num_images=0 # Run on all images. \
--use_nnapi=true \
--nnapi_accelerator_name=google-edgetpu
Beklenen çıktı, 1'den 10'a kadar Top-K ölçümlerinin bir listesidir:
Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333
Görevden Bağımsız Değerlendirme
Yerleşik bir cihaz içi değerlendirme aracının bulunmadığı görevler için veya özel modellerle denemeler yapıyorsanız, TensorFlow Lite'ta Çıkarım Farkı aracı bulunur. (Android, 64-bit ARM ikili mimarisi ikili burada )
Inference Diff, TensorFlow Lite yürütmesini (gecikme ve çıkış değeri sapması açısından) iki ayarda karşılaştırır:
- Tek iş parçacıklı CPU Çıkarımı
- Kullanıcı Tanımlı Çıkarım - bu parametrelerle tanımlanır
Bunu yapmak için, araç rastgele Gauss verileri üretir ve bunu iki TFLite Yorumlayıcısından geçirir; biri tek iş parçacıklı CPU çekirdeklerini çalıştırır, diğeri ise kullanıcının argümanları tarafından parametrelendirilir.
Her bir Yorumlayıcının çıkış tensörleri arasındaki mutlak farkın yanı sıra her ikisinin gecikmesini de öğe bazında ölçer.
Tek çıkış tensörlü bir model için çıktı şöyle görünebilir:
Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06
Bunun anlamı, indeks 0
çıkış tensörü için CPU çıkışındaki öğelerin delege çıkışından ortalama 1.96e-05
farklı olmasıdır.
Bu sayıları yorumlamanın modele ve her çıkış tensörünün ne anlama geldiğine ilişkin daha derin bilgi gerektirdiğini unutmayın. Bir tür puanı veya yerleştirmeyi belirleyen basit bir regresyonsa, fark düşük olmalıdır (aksi takdirde bu, delegeyle ilgili bir hatadır). Ancak SSD modellerinden 'algılama sınıfı' gibi çıktıların yorumlanması biraz daha zordur. Örneğin, bu aracı kullanmak bir fark gösterebilir ancak bu, temsilciyle ilgili gerçekten bir sorun olduğu anlamına gelmeyebilir: iki (sahte) sınıfı düşünün: "TV (ID: 10)", "Monitor (ID:20)" - If bir delege altın gerçeğin biraz dışındadır ve TV yerine monitörü gösterir, bu tensör için çıkış farkı 20-10 = 10 kadar yüksek bir değer olabilir.