Professional Documents
Culture Documents
Tensor Flow
Tensor Flow
TensorFlow-Lite, TensorFlow modellerinin mobil cihazlarda, gömülü sistemlerde ve IoT cihazlarda daha
verimli çalıştırılması için özelleştirilmiş bir araç setidir[1]. İki ana birimden oluşur:
TensorFlow-Lite modeli üretmek için tf-lite yorumlayıcısı kullanılır. Yorumlayıcı minimum yük, başlatma
ve uygulama gecikmelerini kesinleştirmek için statik bir grafik ve özel bir bellek ayırıcı kullanır.
Bununla birlikte tf-lite yorumlayıcısı şimdilik sınırlı sayıda tf operatörünü desteklemektedir. Bu bazı
modellerin tf-lite ile çalışması için ek işlemler gerektirebileceği anlamına gelmektedir.
tf.lite
Python API => Model dönüşümünü kolaylaştırmakla birlikte sonrada oluşabilecek uyumsuzluk
sorunlarını önceden azaltabilir.
Komut satırı
**FlatBuffers: Açık kaynaklı cross-platform kullanıma izin veren bir kütüphanedir. Desteklediği platformlar; C++, C#,
C, Go, JavaScript, Lobster, Lua, TypeScript, PHP, Phyton ve Rust.
Diyagram 1: Dönüştürme İşlemi Diyagramı
2. Temel Özellikler
Cihaz üzerinde makine öğrenmesi çalıştırmak için cihaz ayarları, cihaz üzerindeki uygulamalar için
optimize edilmiş ve küçük binary boyutta bir dizi kernel işlemini destekler.
Çeşitli platformları destekler.
Birçok programlama dili için API sunar.
Optimize cihaz kernelleri ile önceden birleştirilen aktivasyonlar ve ağırlık değerleri kullanılarak
desteklenen cihazlarda donanımı hızlandırır.
Model optimizasyon toolları içerir.
Verimli model formatına sahiptir.
3. Desteklenen Platformlar
Android
Java ya da C++ API Kullanılarak tf-lite yorumlayıcısı uygulanabilir. Java API doğrudan Android Activity
bölümlerinde kullanılabilir. C++ API daha fazla esneklik ve hız sağlar, ancak Java ile C++ arasında veri
aktarımı için JNI Wrapper kodlanması gerekebilir.
iOS
TensorFlow-Lite Swift ve Objective-C ile yazılan native iOS kütüphanelerinin kullanımını destekler.
Linux
C++ ve Python API kullanılarak linux platformlarında çalıştırılabilir.
Not: TensorFlow-Lite geliştirme sürecinde olduğundan dolayı gelecekte mevcut operatörlerde ve API’lerde
değişiklik/güncelleme yapılabilir[2].
4. Performans Ayarları
GPU’da hesaplama yapmak için GPU’nun verilere erişebilmesi gereklidir. Bu genellikle bir hafıza
kopyalama gerektirir. Bu işlem uzun süre alabilir bu nedenle CPU/GPU bellek sınırının aşılmaması istenir.
Genelde bu durum kaçınılmazdır ancak bazı özel durumlarda ihmal edilebilir.
TensorFlow-Lite yüksek performans için kullanıcıların tf donanım bufferları üzerinden doğrudan okuma,
yazma ve kaçınılabilir bellek kopyalamalarını atlamayı sağlar.
Hız
GPU’lar büyük ölçide paralelleştirilebilir iş yükü için yüksek verime sahip olacak şekilde tasarlanmıştır. Bu
nedenle, her biri küçük iş yüklerine kolayca bölünebilen ve paralel olarak gerçekleştirilebilien, tipik olarak
daha düşük gecikme ile sonuçlanan bazı giriş tensörleri üzerinde çalışan çok sayıda operatörden oluşan derin
sinir ağları için oldukça uygundurlar.
Önceden mevcut olmayan uygulamalar için en iyi durumda, GPU üzerinden elde edilen çıkarım yeterince
hızlı çalışabilir.
Doğruluk
Düşük doğruluk oranı kuantizasyonu anlamsız hale getirirse sinir ağını bir GPU’da çalıştırmak bu durumu
ortadan kaldırabilir. Ayrıca GPU’lari CPU’lardan farklı olarak 16-bit veya 32-bit float sayılar ile işlem yapar
ve en iyi performas için kuantizasyon gerektirmez.
Enerji Verimi
GPU’lar hesaplamaları optimize ve oldukça verimli bir şekilde yaparlar. Böylece aynı görevin CPU’larda
çalışmasından daha az güç tüketir ve daha az ısı üretirler.
Not1: CPU üzerinde önemsiz olan bazı işlemler GPU’da yüksek maliyetli olabilir. Eğer bu işlemler gereksiz
ya da göz ardı edilebilir ise bu işlemler en iyi performans değerini elde edebilmek amacıyla kaldırılabilir.
Not2: En iyi performansı elde etmek için modeli tekrar eğitmek gerekebilir, modelinizi tekrar tekrar
eğitmekten çekinmeyin.
Not3: GPU tensor datasını 4 kanala ayırır. Bu durumda [B, H, W, 5] yapısı ile [B, H, W, 8] aynı işlem
performansını gösterirken, [B, H, W, 4] daha hızlıdır.
İşlemde ağır bir makine öğrenmesi mobilini mobil cihazlarad çalıştırmak, cihazın sınırlı işlem ve güç
kapasitesinden dolayı kaynak ihtiyacı doğurur. Bu nedenle CPU’ya bağlı kalmak yerine, bazı cihazlarda
daha iyi performans ve yüksek verimlilik sağlayan GPU veya DSP gibi donanım hızlandırıcı desteklerini
kullanmak avantaj sağlar.
4.2.1. Delegate Çalışma Yöntemi
Yukarıdaki gibi basit bir model grafiği için, eğer delegate özel bir operatör içeriyorsa, tf-lite grafiği delegate
tarafından işlenebilecek farklı alt grafiklere ayırır. Delegate ile işlenecek her bir alt graifik, her çağırıldığında
işlemi değerlendirecek bir node ile yer değiştirir.
Modele bağlı olarak son grafik tek bir düğüm ile bitebilir. Bu durumda,tüm grafikler delegate ile işlenmiş ya
da tüm düğümler alt grafikler tarafından işlenmiş demektir.
Genel olarak delegate tarafından birden fazla grafik oluşumu istenmez. Bunun nedeni delegate ile ana grafik
arası her geçişte ek iş yükü oluşmasıdır. Ayrıca bellek paylaşımı her zaman güvenli değildir.
Çıkarım işlemi özellikle edge cihazlar için önemlidir. Ayrıca model optimizasyonu fixed-point donanımların
ve gelecek nesil donanım hızlandırıcılarının işlem gücü kilidini açar.
4.3.1. Kuantizasyon
Derin sinir ağları kuantizasyonu, ağırlıkların ve isteğe bağlı olarak hem depolama hem de hesaplama için
aktivasyonların azaltılmış şekilde temsilini sağlayan teknikleri kullanır. Kuantizasyon işleminin sağladığı
bazı avantajlar ve özellikler[5]:
Çıkarım işlemi sırasında, ağırlıklar 8-bit değerlerinden float değerlerine dönüştürülür ve hesaplamalar
floating-point kernelleri kullanarak yapılır.
Gecikmeyi daha da iyileştirmek için, hibrit operatörler aktivasyonlarını dinamik olarak, 8-bit halinde
kuantalar ve performans hesaplamaları 8-bit ağırlıklar ve aktivasyonlarla yapılır. Bu optimizasyon fixed-
point çıkarım gecikmeleri için geçerlidir ancak çıkışlar hala floating-point olarak depolanır, böylece hibrit
operatörlerle hızlanma oranı bir full-fixed hesaplamadan daha az olur.
**Girdi verilerine dayanarak tahmin üretmek için tf-lite yorumlayıcısı kullanılır, yorumlayıcı basit ve hızlı olacak şekilde
tasarlanmıştır. Minimum yükte, başlatma ve yürütme gecikmelerini kesinleştirmek için statik bir grafik düzeni ve özel (daha az
dinamik) bir bellek ayırıcı kullanır.
4.3.1.2 Full-Integer Kuantizasyonu
Ağırlık ve aktivasyonlar için full-integer kuantizasyonu uygulanarak gecikme optimizasyonu daha iyi
duruma getirilebilir. Azami bellek kullanımının azaltılması ve sadece donanımın tam sayı değerlerine
erişmesi tüm model matematiğinin kuantizasyonunu kesinleştirir. Bunun için aktivasyon ve girdilerin
dinamik aralığı temsili bir veri seti ile ölçmek gereklidir[7].
Elde edilen model tamamen kuantalanmış olsa dahi hala float girdi ve çıktı alabilir.
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTNS_INT8]
olarak belirtilmelidir. Bu dönüştürücünün kuantalanmamış bir işlemle karşılaştığında hata vermesini sağlar.
Temsil edilen ve edilmeyen int değerlerinde, 8-bit tf-lite kuantizasyonu için araçlara ve kernellere öncelik
verilir. Bu işlem simetrik kuantizasyon kolaylığı için zero-point 0 değeri ile belirtilir. Ayrıca birçok backend
“int8 x int8” akümülasyonu için ek optimizasyonlara sahiptir[8].
Per-axis ve Per-tensor:
Per-tensor kuantizasyonu, mevcut her tensör için bir scale ve/veya zero-point belirtilmesi anlamına gelir. Per-
axis kuantizasyonu, quantized_dimention içerisinde her birime bir scale ve/veya zero-point olması anlamına
gelir.
Simetrik ve Asimetrik:
Aktivasyonlar asimetriktir, herhangi bir yerde [-128,127] aralığında belirlenen bir zero-point içerebilir.
Birçok aktivasyon doğada asimetriktir ve zero-point ekstra binary hassasiyetine etkili bir şekilde ulaşmak
için nispeten ucuz bir yoldur.
Aktivasyonlar sadece sabit ağırlıklarla çarpıldığı için, zero-point sabit değeri büyük ölçüde optimize
edilebilir. Bu ağırlıkların zero-point değeri ile aktivasyon değerinin çarpılmasından dolayı kaçınılmaz bir
runtime maliyeti ortaya çıkar ve bu maliyettten kaçınmak için zero-point değerine 0 verilebilir.
Matematiksel açıklaması:
=> Her bir çıkarım için aktivasyon değeri değiştiği sürece hesaplanacaktır. Ağırlıkların simetrik
olması durumunda bu maliyet ortadan kaldırılabilir.
Verimli bir çıkarım için, tf folding-batch norm katmanları ile kuantizasyondan önce batch normalizasyonu
bir önceki evrişimsel ve fully-connected katmanları ile birleştirir[9].
Kuantizasyon hatası, forward ve backward kuantalamanın etkisini simüle etmek için yapay kuantalama
düğümleri kullanarak modellenmesi ile hesaplanır. Forward ve backward modeller kuantalanırken STE
olarak kuantalanırlar. Hem forward-pass hem de backward-pass ağırlıkların ve aktivasyonların miktarı
simüle edilir. Geri yayılım sırasında parametrelerde küçük değişiklikler yapılması yeterli hassasiyetin
sağlanması için gerekli olduğundan, parametreler yüksek hassasiyetle güncellenmelidir.
Ek olarak, aktivasyonlar için minimum ve maximum değerler eğitim sırasında belirlenir. Bu, döngüdeki
kuantalama ile eğitilmiş bir modelin daha az iş yükü ile fixed-point çıkarım modeline dönüştürülmesine
olanak tanır ve ayrı bir kalibrasyon aşamasına olan ihtiyacı ortadan kaldırır.
Yapay kuantizasyon işlemlerini modeldeki tüm gerekli yerlere eklemek zor olduğundan eğitim grafiğinin
yeniden yazan fonksiyon geliştirilmiştir.
Yeniden yazılmış değerlendirme grafiği önemsenmeyecek oranda farklılık gösterir, çünkü kuantalama
işlemleri batch-normalizasyon adımını etkiler.
4.4. Model Doğruluğu
Ağrlıklar post-training sonrası kuantalandığından, özellikle küçük ağlarda doğruluk kaybı oluşabilir.
Kuantalanmış modelin doğruluk kontrolünün yapılması, herhangi bir doğruluk düşümünün kabul edilebilir
aralıkta olduğundan emin olmak için önemlidir.
Eğer doğruluk oranı kabul edilebilir aralığın dışında ise quantization-aware training üzerine düşünülebilir.
TensorFlow-Lite ile birlikte kullaılabilecek bir tf modelinin nasıl oluşturulacağını anlamanın en kolay yolu,
bu sürecin getirdiği sınırlamalar ile nasıl dönüştürüldüğünü ve optimizasyon aşamaları üzerine düşünmektir.
6. Desteklenen Yapılar
Birçok tf-lite operatörü float-32 ve kuantalanmış uint8 & int8 çıkarımlarını hedeflemektedir ancak birçok
operatör tf-float-16 ve string gibi diğer türleri desteklememektedir.
Operatörlerin farklı versiyonlarını kullanmanın yanı sıra, float-point ile kuantalanmış modeller arasındaki bir
diğer fark, dönüştürülme biçimlerinden kaynaklanmaktadır. Kuantalanmamış dönüşüm tensörler için dinamik
aralık bilgisi gerektirir. Bu, ayar aralığı veri seti aracılığıyla aralık bilgisini almayı ya da ani aralık tahmini
için model eğitimi sırasında yapay kuantizasyon yapılmasını gerektirir.
Not: TensorFlow-Lite şimdilik sadece tf NHWC formatını ve broadcasting için belirli sayıda operatörü
desteklemektedir.
7. Sonuç
TensorFlow-Lite küçük cihazlarda makine öğrenimi çalıştırmayı kolaylaştırmak için geliştirilmiştir. Şimdilik
sınırlı sayıda operatörü desteklemesine karşı, istek halinde binary boyut artımı karşılığında diğer operatörler
de özel olarak programa dahil edilebilmektedir.