TensorFlow Lite Temsilcileri

Giriş

Temsilciler , GPU ve Dijital Sinyal İşlemcisi (DSP) gibi cihaz üzerindeki hızlandırıcılardan yararlanarak TensorFlow Lite modellerinin donanım hızlandırmasını etkinleştirir.

Varsayılan olarak, TensorFlow Lite, ARM Neon komut seti için optimize edilmiş CPU çekirdeklerini kullanır. Bununla birlikte, CPU, genellikle Makine Öğrenimi modellerinde bulunan ağır aritmetik için mutlaka optimize edilmeyen çok amaçlı bir işlemcidir (örneğin, evrişim ve yoğun katmanlarda yer alan matris matematiği).

Öte yandan, modern cep telefonlarının çoğu, bu ağır işlemlerin üstesinden gelmede daha iyi olan çipler içerir. Bunları sinir ağı işlemleri 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 deneylerimizde güç tüketimini% 75'e kadar düşürdüğünü göstermiş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ı etkinleştiren ilişkili API'lere sahiptir. Tipik olarak, bu arayüzler üzerinden bir sinir ağını çalıştırmak için çok sayıda özel kod yazmanız gerekir. Her hızlandırıcının artıları ve eksileri olduğunu ve bir sinir ağında her işlemi gerçekleştiremeyeceğini düşündüğünüzde işler daha da karmaşık hale gelir. TensorFlow Lite'ın Delege API'si, TFLite çalışma zamanı ile bu düşük seviyeli API'ler arasında bir köprü görevi görerek bu sorunu çözer.

temsilcilerle çalışma zamanı

Temsilci Seçme

TensorFlow Lite, her biri belirli platformlar ve belirli model türleri için optimize edilmiş birden çok 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 nicelleştirilmiş?) .

Platforma göre delegeler

Çapraz platform (Android ve iOS)

  • GPU temsilcisi - GPU temsilcisi hem Android hem de iOS'ta kullanılabilir. Bir GPU'nun mevcut olduğu 32 bit ve 16 bit kayan tabanlı modelleri çalıştırmak için optimize edilmiştir. Ayrıca 8 bitlik nicelleştirilmiş modelleri destekler ve kayan sürümleriyle aynı seviyede GPU performansı sağlar. GPU temsilcisiyle ilgili ayrıntılar için bkz.GPU'da TensorFlow Lite . GPU temsilcisini Android ve iOS ile kullanma hakkında adım adım eğitimler için bkz.TensorFlow Lite GPU Temsilcisi Eğitimi .

Android

  • Daha yeni Android cihazlar için NNAPI temsilcisi - NNAPI temsilcisi, GPU, DSP ve / veya NPU bulunan Android cihazlarda modelleri hızlandırmak için kullanılabilir. Android 8.1 (API 27+) veya daha yüksek sürümlerde mevcuttur. NNAPI temsilcisine, adım adım talimatlara ve en iyi uygulamalara genel bir bakış için bkz. TensorFlow Lite NNAPI temsilcisi .
  • Eski Android cihazlar için Hexagon delege - Hexagon delegesi, Qualcomm Hexagon DSP ile Android cihazlarda 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ı modellerde çıkarımı hızlandırmak için Core ML temsilcisini kullanabilirsiniz. Neural Engine, A12 SoC veya üstü ile Apple mobil cihazlarda mevcuttur. Core ML temsilcisine genel bir bakış ve adım adım talimatlar için bkz.TensorFlow Lite Core ML temsilcisi .

Model türüne göre temsilciler

Her hızlandırıcı, belirli bir bit genişliği göz önünde bulundurularak tasarlanmıştır. Yalnızca 8 bitlik nicelleştirilmiş işlemleri destekleyen bir temsilciye ( Hexagon delege gibi ) bir kayan nokta modeli sağlarsanız, tüm işlemlerini reddedecek ve model tamamen CPU üzerinde çalışacaktır. Bu tür sürprizlerden kaçınmak için aşağıdaki tablo, model türüne göre temsilci desteğine genel bir bakış sağlar:

Model türü GPU NNAPI Altıgen CoreML
Kayan nokta (32 bit) Evet Evet Hayır Evet
Eğitim sonrası float16 niceleme Evet Hayır Hayır Evet
Eğitim sonrası dinamik aralık niceleme Evet Evet Hayır Hayır
Eğitim sonrası tamsayı niceleme Evet Evet Evet Hayır
Nicemlemeye duyarlı eğitim Evet Evet Evet Hayır

Performansı doğrulama

Bu bölümdeki bilgiler, başvurunuzu iyileştirebilecek temsilcilerin kısa listeye alınması için kaba bir kılavuz görevi görür. Bununla birlikte, her delegenin desteklediği önceden tanımlanmış bir işlem setine sahip olduğunu ve modele ve cihaza bağlı olarak farklı şekilde çalışabileceğini unutmamak önemlidir; örneğin, NNAPI temsilcisi , başka bir cihazda bir DSP kullanırken bir Pixel telefonda Google'ın Edge- TPU'unu kullanmayı seçebilir. Bu nedenle, bir temsilcinin ihtiyaçlarınız için ne kadar yararlı olduğunu ölçmek için genellikle bazı kıyaslamalar yapmanız önerilir. Bu ayrıca, TensorFlow Lite çalışma zamanına bir temsilci eklenmesiyle ilişkili ikili boyut artışının gerekçelendirilmesine yardımcı olur.

TensorFlow Lite, geliştiricilerin uygulamalarında delegeleri kullanma konusunda kendilerinden emin olmalarını sağlayan 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 ek yükü, bellek ayak izi vb. Dahil 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 çok işareti destekler. Örneğin, --gpu_backend=gl belirtilebilir --use_gpu OpenGL ile grafik işlemcisi yürütme ölçmek. Desteklenen delege parametrelerinin tam listesi ayrıntılı belgelerde tanımlanmıştır.

İşte adb aracılığıyla GPU ile nicelleştirilmiş 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

Android için bu aracın önceden oluşturulmuş sürümünü, 64 bit ARM mimarisini buradan indirebilirsiniz ( daha fazla ayrıntı ).

Doğruluk ve doğruluk

Temsilciler genellikle hesaplamaları CPU muadillerinden farklı bir hassasiyette gerçekleştirir. Sonuç olarak, donanım hızlandırma için bir temsilci kullanmakla ilişkili (genellikle küçük) bir doğruluk ödünleşimi vardır. Bunun her zaman doğru olmadığını unutmayın; örneğin, GPU nicelleştirilmiş modelleri çalıştırmak için kayan nokta kesinliği kullandığından, küçük bir kesinlik artışı olabilir (örneğin, ILSVRC görüntü sınıflandırmasında <% 1 İlk-5 iyileştirme).

TensorFlow Lite, bir temsilcinin belirli bir model için ne kadar doğru davrandığını ölçmek için iki tür araca sahiptir: Göreve Dayalı ve Görev Tanımlı . Bu bölümde açıklanan tüm araçlar, önceki bölümdeki kıyaslama aracı tarafından kullanılan gelişmiş yetkilendirme parametrelerini destekler. Aşağıdaki alt bölümlerin, model değerlendirmesinden (Modelin kendisi görev için iyi mi?) Değil, delege değerlendirmesine (Delege CPU ile aynı şeyi yapıyor mu?) Odaklandığına dikkat edin.

Göreve Dayalı Değerlendirme

TensorFlow Lite, iki görüntü tabanlı görevde doğruluğu değerlendirmek için araçlara sahiptir:

Bu araçların önceden oluşturulmuş ikili dosyaları (Android, 64-bit ARM mimarisi) ve dokümantasyon burada bulunabilir:

Aşağıdaki örnek, Pixel 4'te Google'ın Edge-TPU'unu 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 İlk K metriklerinin 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örev Tanımlı Değerlendirme

Yerleşik bir cihaz üzerinde değerlendirme aracının olmadığı görevler için veya özel modellerle deney yapıyorsanız, TensorFlow Lite, Çıkarım Diff aracına sahiptir. (Android, 64-bit ARM ikili mimari ikili burada )

Çıkarım Diff, TensorFlow Lite uygulamasını (gecikme ve çıktı 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 verisi oluşturur ve bu verileri iki TFLite Yorumlayıcıdan geçirir - biri tek iş parçacıklı CPU çekirdekleri çalıştırır, diğeri ise kullanıcının argümanlarıyla parametrelendirilir.

Her bir Yorumlayıcıdan gelen çıktı tensörleri arasındaki mutlak farkın yanı sıra her ikisinin de gecikmesini her öğe için ayrı ayrı ölçer.

Tek çıkış tensörlü bir model için çıktı şu şekilde 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

Bu ne anlama geliyor endeksi çıkış tensörü için yani 0 , ortalama tarafından temsilci çıkışından işlemci çıkış farklı öğelerin kullanılacağını 1.96e-05 .

Bu sayıları yorumlamanın model hakkında daha derin bilgi sahibi olmayı ve her çıktı tensörünün neyi ifade ettiğini unutmayın. Bir tür puan veya yerleştirmeyi belirleyen basit bir gerileme ise, fark düşük olmalıdır (aksi takdirde temsilciyle ilgili bir hatadır). Bununla birlikte, SSD modellerinden 'algılama sınıfı' gibi çıktıların yorumlanması biraz daha zordur. Örneğin, bu aracı kullanarak bir farklılık gösterebilir, ancak bu, temsilci için gerçekten yanlış bir şey anlamına gelmeyebilir: iki (sahte) sınıfı düşünün: "TV (ID: 10)", "Monitor (ID: 20)" - Eğer bir delege altın gerçeğin biraz dışındadır ve TV yerine monitörü gösterir, bu tensörün çıkış farkı 20-10 = 10 kadar yüksek olabilir.