LiteRT Temsilcileri

Temsilciler, GPU ve dijital sinyal işlemcisi (DSP) gibi cihaz üzerinde hızlandırıcılardan yararlanarak LiteRT modellerinin donanım hızlandırmasını sağlar.

LiteRT, varsayılan olarak ARM Neon talimat seti için optimize edilmiş CPU çekirdeklerini kullanır. Ancak CPU, makine öğrenimi modellerinde (ör. evrişim ve yoğun katmanlarda kullanılan matris matematiği) genellikle bulunan yoğun aritmetik işlemler için mutlaka optimize edilmemiş çok amaçlı bir işlemcidir.

Öte yandan, çoğu modern cep telefonunda bu ağır işlemleri daha iyi işleyebilen çipler bulunur. Bunları nöral ağ işlemlerinde kullanmak, gecikme ve güç verimliliği açısından büyük avantajlar sağlar. Örneğin, GPU'lar gecikmede 5 kata kadar hızlanma sağlayabilir.

Bu hızlandırıcıların her biri, özel hesaplamaları etkinleştiren ilişkili API'lere sahiptir. Örneğin, mobil GPU için OpenCL veya OpenGL ES. Genellikle, bu arayüzler üzerinden bir nöral ağı çalıştırmak için çok sayıda özel kod yazmanız gerekir. Her hızlandırıcının avantajları ve dezavantajları olduğunu ve sinir ağındaki her işlemi yürütemediğini göz önünde bulundurduğunuzda işler daha da karmaşık hale gelir. TensorFlow Lite'ın Delegate API'si, TFLite çalışma zamanı ile bu düşük seviyeli API'ler arasında köprü görevi görerek bu sorunu çözer.

delegeyle çalışma zamanı

Bir delege seçme

LiteRT, her biri belirli platformlar ve belirli model türleri için optimize edilmiş birden fazla temsilciyi destekler. Genellikle, kullanım alanınıza uygun birden fazla temsilci olur. Bu, iki temel kritere bağlıdır: hedeflediğiniz Platform (Android veya iOS?) ve hızlandırmaya çalıştığınız Model türü (kayan nokta veya nicelenmiş?).

Platforma göre temsilciler

Platformlar arası (Android ve iOS)

  • GPU temsilcisi: GPU temsilcisi hem Android hem de iOS'te kullanılabilir. GPU'nun kullanılabildiği 32 bit ve 16 bit kayan nokta tabanlı modelleri çalıştırmak için optimize edilmiştir. Ayrıca 8 bitlik nicelenmiş modelleri destekler ve kayan nokta sürümleriyle aynı düzeyde GPU performansı sağlar. GPU temsilcisi hakkında ayrıntılı bilgi için GPU'da LiteRT bölümüne bakın.

iOS

  • Daha yeni iPhone ve iPad'ler için Core ML temsilcisi: Neural Engine'in kullanılabildiği daha yeni iPhone ve iPad'lerde, 32 bit veya 16 bit kayan nokta modelleri için çıkarımı hızlandırmak üzere Core ML temsilcisini kullanabilirsiniz. Neural Engine, A12 SoC veya daha yeni bir SoC'ye sahip Apple mobil cihazlarda kullanılabilir. Core ML temsilcisine genel bakış ve adım adım talimatlar için LiteRT Core ML temsilcisi başlıklı makaleyi inceleyin.

Model türüne göre temsilciler

Her hızlandırıcı, belirli bir bit genişliğinde veri göz önünde bulundurularak tasarlanır. Yalnızca 8 bit ölçümlenmiş işlemleri destekleyen bir temsilciye kayan noktalı model sağlarsanız tüm işlemler reddedilir ve model tamamen CPU üzerinde çalışır. Bu tür sürprizlerle karşılaşmamak için aşağıdaki tabloda, model türüne göre temsilci desteğine genel bir bakış sunulmaktadır:

Model Türü GPU CoreML
Kayan nokta (32 bit) Evet Evet
Eğitim sonrası float16 nicemleme Evet Evet
Eğitim sonrası dinamik aralık nicemleme Evet Hayır
Eğitim sonrası tamsayı kuantizasyonu Evet Hayır
Kuantizasyona duyarlı eğitim Evet Hayır

Performansı doğrulama

Bu bölümdeki bilgiler, uygulamanızı iyileştirebilecek delegeleri kısa listeye almak için genel bir kılavuz niteliğindedir. Ancak her temsilcinin, desteklediği önceden tanımlanmış bir işlem kümesi olduğunu ve modele ve cihaza bağlı olarak farklı performans gösterebileceğini unutmamak önemlidir. Bu nedenle, bir temsilcinin ihtiyaçlarınız için ne kadar yararlı olduğunu ölçmek üzere genellikle bazı karşılaştırmalar yapmanız önerilir. Bu, LiteRT çalışma zamanına bir temsilci eklemeyle ilişkili ikili boyut artışını da haklı çıkarmaya yardımcı olur.

LiteRT, geliştiricilerin uygulamalarında temsilcileri kullanmaktan emin olmalarını sağlayabilecek kapsamlı performans ve doğruluk değerlendirme araçlarına sahiptir. Bu araçlar sonraki bölümde ele alınmıştır.

Değerlendirme Araçları

Gecikme ve bellekte kaplanan yer

LiteRT'nin karşılaştırma aracı, ortalama çıkarım gecikmesi, başlatma ek yükü ve bellek ayak izi gibi model performansını tahmin etmek için uygun parametrelerle kullanılabilir. Bu araç, modeliniz için en iyi temsilci yapılandırmasını bulmak üzere birden fazla işareti 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 bir nicemlenmiş model için örnek çalıştırma aşağıda verilmiştir:

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

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

Doğruluk ve kesinlik

Temsilciler genellikle hesaplamaları CPU karşılıklarından farklı bir hassasiyetle gerçekleştirir. Sonuç olarak, donanım hızlandırma için bir temsilci kullanmayla ilişkili (genellikle küçük) bir doğruluk dengesi söz konusudur. Bunun her zaman doğru olmadığını unutmayın.Örneğin, GPU, nicelendirilmiş modelleri çalıştırmak için kayan nokta duyarlılığını kullandığından duyarlılıkta küçük bir iyileşme olabilir (ör. ILSVRC görüntü sınıflandırmasında ilk 5'te% 1'den az iyileşme).

LiteRT'de, bir temsilcinin belirli bir model için ne kadar doğru davrandığını ölçmek üzere iki tür araç bulunur: Göreve Dayalı ve Görevden Bağımsız. Bu bölümde açıklanan tüm araçlar, önceki bölümdeki karşılaştırma aracı tarafından kullanılan gelişmiş yetki devri parametrelerini destekler. Aşağıdaki alt bölümlerin, model değerlendirmesinden (Modelin kendisi görev için uygun mu?) ziyade temsilci değerlendirmesine (Temsilci, CPU ile aynı performansı gösteriyor mu?) odaklandığını unutmayın.

Görevin Değerlendirilmesi

LiteRT, iki resim tabanlı görevde doğruluğu değerlendirmek için araçlar içerir:

Bu araçların önceden oluşturulmuş ikili dosyalarını (Android, 64 bit ARM mimarisi) ve belgelerini burada bulabilirsiniz:

Aşağıdaki örnekte, Pixel 4'te GPU ile görüntü sınıflandırma değerlendirmesi gösterilmektedir:

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_gpu=true

Beklenen çıktı, 1 ile 10 arasındaki Top-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örevden Bağımsız Değerlendirme

Cihaz üzerinde değerlendirme aracı bulunmayan görevlerde veya özel modellerle deneme yapıyorsanız LiteRT'de Inference Diff (Çıkarım Farkı) aracı bulunur. (Android, 64 bit ARM ikili mimarisi ikili burada)

Çıkarım farkı, iki ayarda LiteRT yürütmesini (gecikme ve çıkış değeri sapması açısından) 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 oluşturur ve bunları iki TFLite yorumlayıcıdan geçirir. Bu yorumlayıcılardan biri tek iş parçacıklı CPU çekirdeklerini çalıştırır, diğeri ise kullanıcının argümanlarıyla parametrelendirilir.

Her ikisinin de gecikmesini ve her bir yorumlayıcıdan gelen çıkış tensörleri arasındaki mutlak farkı öğe bazında ölçer.

Tek çıkış tensörlü bir modelin çıkışı ş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, 0 dizinindeki çıkış tensörü için CPU çıkışındaki öğelerin, temsilci çıkışından ortalama 1.96e-05 kadar farklı olduğu anlamına gelir.

Bu sayıları yorumlamak için model ve her bir çıkış tensörünün ne anlama geldiği hakkında daha derinlemesine bilgi sahibi olmanız gerektiğini unutmayın. Bir tür puan veya yerleştirme belirleyen basit bir regresyon söz konusuysa fark düşük olmalıdır (aksi takdirde, temsilciyle ilgili bir hata vardır). Ancak SSD modellerindeki "algılama sınıfı" gibi çıkışları yorumlamak biraz daha zordur. Örneğin, bu araç kullanılarak bir fark gösterilebilir ancak bu, temsilcide gerçekten yanlış bir şey olduğu anlamına gelmeyebilir. İki (sahte) sınıfı ele alalım: "TV (ID: 10)", "Monitor (ID:20)". Bir temsilci, altın kuraldan biraz uzaklaşırsa ve TV yerine monitörü gösterirse bu tensörün çıkış farkı 20-10 = 10 gibi yüksek bir değer olabilir.