Edge cihazlarının genellikle belleğe veya bilgi işlem gücü sınırlıdır. Bu kısıtlamalar dahilinde çalıştırılabilmesi için modellere çeşitli optimizasyonlar uygulanabilir. Buna ek olarak, bazı optimizasyonlar hızlandırılmış çıkarım için özel donanımların kullanılmasına olanak tanır.
TensorFlow Lite ve TensorFlow Model Optimizasyonu Araç Seti, çıkarımı optimize etmenin karmaşıklığını en aza indirmek için araçlar sağlar.
Uygulama geliştirme sürecinde model optimizasyonunu göz önünde bulundurmanız önerilir. Bu belgede, uç donanıma dağıtım için TensorFlow modellerini optimize etmeye yönelik bazı en iyi uygulamalar özetlenmektedir.
Modeller neden optimize edilmelidir?
Model optimizasyonunun uygulama geliştirmeye yardımcı olabileceği birkaç temel yol vardır.
Boyut küçültme
Bazı optimizasyon biçimleri, bir modelin boyutunu küçültmek için kullanılabilir. Daha küçük modeller aşağıdaki avantajlara sahiptir:
- Daha küçük depolama boyutu: Daha küçük modeller, kullanıcılarınızın cihazlarında daha az depolama alanı kaplar. Örneğin, daha küçük model kullanan bir Android uygulaması, kullanıcının mobil cihazında daha az depolama alanı kaplar.
- Daha küçük indirme boyutu: Daha küçük modellerin, kullanıcıların cihazlarına indirmek için daha az zaman ve bant genişliği gerekir.
- Daha az bellek kullanımı: Daha küçük modeller çalıştırıldığında daha az RAM kullanır. Bu da uygulamanızın diğer kısımlarının kullanımı için bellekte yer açar ve daha iyi performans ile kararlılık anlamına gelir.
Nicelikselleştirme, tüm bu durumlarda modelin boyutunu küçültebilir. Bu da potansiyel olarak doğruluğun azalmasına neden olur. Budama ve kümeleme, bir modeli daha kolay sıkıştırılabilir hale getirerek indirmenin boyutunu azaltabilir.
Gecikmeyi azaltma
Gecikme, belirli bir modelle tek bir çıkarım çalıştırmak için gereken süredir. Bazı optimizasyon biçimleri, bir model kullanarak çıkarım yapmak için gereken hesaplama miktarını azaltarak daha düşük gecikme sağlar. Gecikme, güç tüketimini de etkileyebilir.
Şu anda nicelik, çıkarım sırasında yapılan hesaplamaları basitleştirerek gecikmeyi azaltmak için kullanılabiliyor. Bu durum, potansiyel olarak bir miktar hata payına yol açıyor.
Hızlandırıcı uyumluluğu
Edge TPU gibi bazı donanım hızlandırıcılar, doğru şekilde optimize edilmiş modellerle son derece hızlı çıkarım yapabilir.
Genellikle bu tür cihazlar modellerin belirli bir şekilde ölçülmesini gerektirir. Gereksinimleri hakkında daha fazla bilgi edinmek için her bir donanım hızlandırıcının belgelerine bakın.
Ödünler
Optimizasyonlar, model doğruluğunda değişikliklere yol açabilir. Bu değişikliklerin uygulama geliştirme sürecinde dikkate alınması gerekir.
Doğruluk değişiklikleri, optimize edilmekte olan modele bağlıdır ve önceden tahmin etmek zordur. Genel olarak, boyut veya gecikme için optimize edilen modellerin doğruluk oranı düşüktür. Uygulamanıza bağlı olarak bu, kullanıcılarınızın deneyimini etkileyebilir veya etkilemeyebilir. Nadiren de olsa, optimizasyon süreci neticesinde belirli modeller doğruluk kazanabilir.
Optimizasyon türleri
TensorFlow Lite şu anda niceleme, ayıklama ve kümeleme aracılığıyla optimizasyonu desteklemektedir.
Bunlar, TensorFlow Lite ile uyumlu model optimizasyonu teknikleri için kaynaklar sağlayan TensorFlow Model Optimizasyon Araç Seti'nin bir parçasıdır.
Nicelleştirme
Niceleme, bir modelin parametrelerini temsil etmek için kullanılan (varsayılan olarak 32 bit kayan nokta sayıları) sayıların kesinliğini azaltarak çalışır. Böylece daha küçük model boyutu ve daha hızlı hesaplama elde edilir.
TensorFlow Lite'ta aşağıdaki niceleme türleri kullanılabilir:
Teknik | Veri gereksinimleri | Boyut küçültme | Doğruluk | Desteklenen donanım |
---|---|---|---|---|
Eğitim sonrası float16'nın nicelenmesi | Veri yok | %50'ye kadar | Önemsiz doğruluk kaybı | CPU, GPU |
Eğitim sonrası dinamik aralık ölçümü | Veri yok | %75'e kadar | En küçük doğruluk kaybı | CPU, GPU (Android) |
Eğitim sonrası tam sayı sayımı | Etiketsiz temsilci örneği | %75'e kadar | Düşük doğruluk kaybı | CPU, GPU (Android), EdgeTPU |
Nicelemeye duyarlı eğitim | Etiketli eğitim verileri | %75'e kadar | En küçük doğruluk kaybı | CPU, GPU (Android), EdgeTPU |
Aşağıdaki karar ağacı, yalnızca beklenen model boyutuna ve doğruluğuna göre modeliniz için kullanmak isteyebileceğiniz niceliksel şemaları seçmenize yardımcı olur.
Aşağıda, birkaç modelde eğitim sonrası niceleme ve niceliğe duyarlı eğitim için gecikme ve doğruluk sonuçları verilmiştir. Tüm gecikme sayıları, tek bir büyük çekirdekli CPU kullanan Pixel 2 cihazlarda ölçülür. Araç seti geliştikçe, buradaki sayılar da artar:
Model | İlk 1 Doğruluk (Orijinal) | İlk 1 Doğruluk (Eğitim Sonrası Nicel) | İlk Doğruluk (Nicelemeye Duyarlı Eğitim) | Gecikme (Orijinal) (ms) | Gecikme (Eğitim Sonrası Nicel) (ms) | Gecikme (Nicelemeye Duyarlı Eğitim) (ms) | Boyut (Orijinal) (MB) | Boyut (Optimize edilmiş) (MB) |
---|---|---|---|---|---|---|---|---|
Mobilenet-v1-1-224 | 0,709 | 0,657 | 0,70 | 124 | 112 | 64 | 16,9 | 4,3 |
Mobilenet-v2-1-224 | 0,719 | 0,637 | 0,709 | 89 | 98 | 54 | 14 | 3.6 |
Inception_v3 | 0,78 | 0,772 | 0,775 | 1130 | 845 | 543 | % | 23,9 |
Resnet_v2_101 | 0,770 | 0,768 | Yok | 3973 | 2868 | Yok | 178,3 | 44,9 |
int16 etkinleştirmeleri ve int8 ağırlıklarıyla tam tam sayı sayımı
Int16 aktivasyonlarıyla nicelleştirme, int16'da etkinleştirmeler ve int8'de ağırlıklar ile tam sayı kullanılan bir tam sayı oluşturma şemasıdır. Bu mod, benzer bir model boyutunu koruyan int8'deki hem etkinleştirmeler hem de ağırlıklar ile tam tamsayı nicelleştirme şemasına kıyasla nicelenmiş modelin doğruluğunu artırabilir. Etkinleştirmeler, ölçüme duyarlı olduğunda önerilir.
NOT: Bu ölçüm şeması için şu anda TFLite'ta yalnızca optimize edilmemiş referans çekirdeği uygulamaları kullanılabildiğinden varsayılan olarak performans, int8 çekirdeklerine kıyasla yavaş olacaktır. Bu modun tüm avantajlarına şu anda özel donanım veya özel yazılım aracılığıyla erişilebilir.
Aşağıda, bu moddan yararlanan bazı modeller için doğruluk sonuçları verilmiştir.
Model | Doğruluk metriği türü | Doğruluk (float32 etkinleştirmeleri) | Doğruluk (int8 etkinleştirmeleri) | Doğruluk (int16 etkinleştirmeleri) |
---|---|---|---|---|
Wav2letter | WER | %6,7 | %7,7 | %7,2 |
DeepSpeech 0.5.1 (gösterilmemiş) | T | %6,13 | %43,67 | %6,52 |
YoloV3 | mAP(IOU=0,5) | 0,577 | 0,563 | 0,574 |
MobileNetV1 | İlk 1 Doğruluk | 0,7062 | 0,694 | 0,6936 |
MobileNetV2 | İlk 1 Doğruluk | 0,718 | 0,7126 | 0,7137 |
MobileBert | F1(Tam eşleme) | 88,81(81,23) | 2,08(0) | 88,73(81,15) |
Budama
Budama işlemi, bir modelin tahminleri üzerinde çok küçük bir etkisi olan parametreleri kaldırarak yapılır. Budanan modeller disk üzerinde aynı boyuta ve aynı çalışma zamanı gecikmesine sahiptir ama daha etkili bir şekilde sıkıştırılabilir. Bu, budamayı model indirme boyutunu küçültmek için kullanışlı bir teknik haline getirir.
TensorFlow Lite, gelecekte kısaltılmış modeller için gecikmeyi azaltmayı sağlayacaktır.
Kümeleme
Kümeleme, bir modeldeki her katmanın ağırlıklarını önceden tanımlanmış sayıda kümeler halinde gruplandırıp ardından her bir kümeye ait ağırlıkların merkezi değerlerini paylaşarak çalışır. Bu da bir modeldeki benzersiz ağırlık değerlerinin sayısını ve dolayısıyla karmaşıklığı azaltır.
Sonuç olarak kümelenmiş modeller daha etkili şekilde sıkıştırılabilir. Böylece budamaya benzer dağıtım avantajları elde edilir.
Geliştirme iş akışı
Başlangıç noktası olarak, barındırılan modeller içindeki modellerin uygulamanız için çalışıp çalışmadığını kontrol edin. Aksi takdirde, kullanıcıların eğitim sonrası niceleme aracıyla başlamalarını öneririz. Bu, geniş çapta uygulanabilir ve eğitim verileri gerektirmez.
Doğruluk ve gecikme hedeflerinin karşılanmadığı veya donanım hızlandırıcı desteğinin önemli olduğu durumlarda nicelleştirmeye duyarlı eğitim daha iyi bir seçenektir. TensorFlow Model Optimizasyonu Araç Seti altında ek optimizasyon tekniklerini inceleyin.
Model boyutunuzu daha da küçültmek isterseniz modellerinizi ölçmeden önce kısma ve/veya kümeleme işlemlerini deneyebilirsiniz.