You are on page 1of 9

1. TensorFlow-Lite Nedir?

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 Yorumlayıcı: Optimize edilmiş modelleri farklı donanımlar üzerinde çalıştırır.


Sade ve hızlı olarak tasarlanmıştır.

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.

TensorFlow-Lite Dönüştürücü: TensorFlow modellerinin tf-lite tarafından kullanılması için


dönüştürülmesi gerekebilir. Böylece binary dosya boyutu ve performans optmizasyonları yapılabilir.

TensorFlow-Lite dönüştürücü, tf modellerini optimize edilmiş FlatBuffer formatına dönüştürmek için


kullanılır. Böylece oluşturulan “.tflite” uzantılı modeller tf-lite tarafından kullanılabilir.

Dönüştürücünün desteklediği formatlar; SavedModels

Frozen Graph Def

tf.lite

tf.Session ile alınan herhangi bir model (sadece


Python-API ile kullanılabilir.)

TensorFlow-Lite dönüştürücü iki şekilde kullanılabilir.

 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.

4.1. TensorFlow-Lite GPU Yetkilendirme ve Avantajları


TensorFlow-Lite çeşitli donanım hızlandırmalarını-yükseltmelerini desteklemektedir. Bununla birlikte 3
temel durumda avantaj sağlanır[3]:

 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.

4.2. TensorFlow-Lite Delegate


Bir tf-lite delegator, grafik uygulamasının bir kısmını veya tamamını başka bir uygulayıcıya devretme
yöntemidir[4].

İş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

Diyagram 2: Örnek Basit Model Diyagram 3: Delegate Eklenmiş Durumda Model


Grafiği

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.

4.3. Model Optimizasyonu

Table 1: Optimizasyon Seçenekleri

TensorFlow-Lite, TensorFlow model optimizasyon toolları arasından optimizasyonu kolaylaştıracak ve


karmaşıklığı en aza indirecek toolları içerir.

Çı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]:

 Mevcut CPU platformlarını destekler.


 Aktivasyonların kuantizasyonu, aktivasyonları okumak ve saklamak için hafıza erişim maliyetlerini
azaltır.
 Çoğu CPU ve donanım hızlandırma uygulaması, özellikle kuantizasyon için verimli SIMD komut
özelliklerini sağlar.
 TensorFlow-Lite birkaç level kuantizasyonu destekler.
=> Post-training kuantizasyonu, post-training ağırlık ve aktivasyonlarını kolaylıkla
kuantalayabilmektedir.
=> Quantization-aware training, minimum doğruluk düşümü ile kuantalanabilen ağların
eğitilmesine izin verir. Bu yalnıza evrişimsel sinir ağları üzerinde uygulanabilir.

Table 2: Seçilmiş CNN Modelleri Üzerinde Kuantizasyon Sonuçları

4.3.1.1 Post-Training Kuantizasyonu


Post-Training kuantizasyonu, model boyutunu düşürmek için genel teknikleri ve aynı zamanda model
doğruluğunda küçük bir bozulma ile CPU ve donanım hızlandırıcı gecikmesini iyileştirir. Bu teknikler
önceden eğitilmiş float tf modellerinde ve tf-lite dönüşümü sırasında uygulanabilir[6].

Kuantizasyon Ağırlıkları: Post-Training kuantizasyonunun en basit hali ağırlıkları floating-pointlerden 8-bite


kadar kuantalar.

Çı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.

Kuantalanmamış implementasyonlar otomatik olarak floating-point halinde bırakılır. Bu dönüşümün


sorunsuz bir şekilde gerçekleşmesini sağlar, ancak float destekli hızlandırıcılarda dağılımı kısıtlayabilir.
Dönüştürücünün sadece tam sayı işlemlerini gerçekleştirmesini sağlamak için;

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.

4.3.1.3 8-bit Kuantizasyon Özellikleri


8-bit kuantizasyon yaklaşımında float değerler aşağıdaki formülü kullanır:

real_value = (int8_value – zero_point)*scale

Bu formülün iki ana bölümü vardır:


 Her bir axis ya da her bir tensör ağırlığı, int8 [-127,127] aralığında değerler ile zero-point 0 değeri ile
temsil edilir.
 Her bir axis ya da her bir tensör ağırlığı, int8 [-128,127] aralığında değerler ile zero-point [-128,127]
değeri ile temsil edilir.

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.

Örneğin; t => tensör, dims=[4 3 2 1]


kuantizasyon parametreleri: scale=[1.0, 2.0, 3.0], zero_point=[1,2,3] ise

t[:,0,:,:] => scale[0]=1.0, zero_point[0]=1


t[:,1,:,:] => scale[1]=2.0, zero_point[0]=2
t[:,2,:,:] => scale[2]=3.0, zero_point[0]=3

değerlerine sahip olacaktır.

Genellikle quantized_dimention, output_channel konvolüsyon ağırlıklarıdır. Ancak teoride kernel


implementasyonunda her biri skaler çarpıma karşılık gelebilir. Bu performans optimizasyonu yapılmadan
daha fazla kuantalama yapılmasına izin verir ve doğruluk oranı için yüksek düzeyde geliştirmeler içerir.

 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ı:

A=> m x n kuantalanmış aktivasyon matrisi


B=> n x p kuantalanmış ağırlık matrisi

aj => A matrisinin j. satırı


bk => B matrisinin k. sütunu

Kuantalanmış tamsayı değerleri ve zero-point değerleri sırasıyla; q a, za ve qb, zb olsun.

=> Girdi ve çıktı değerlerinden skaler çarpım yapıldığı sürece kaçınılmazdır

=> Her çıkarım başlangıcında değişmeyen sabitlerden oluşur ve bu nedenle önceden


hesaplanabilir.

=> 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.

4.3.2. Quantization-Aware Training


Quantization-aware model training hem eğitim hem de çıkarım işlemleri için hassasiyet işlemlerini ileriye
atar. Bunu yapabilmek için iki yol vardır.
 Çıkarım sırasındaki operatör işlemleri eğitim zamanında doğru şekilde modellenmiştir.
 Çıkarımdaki kuantizasyon etkileri eğitim sırasında modellenmiştir.

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.

5. TensorFlow-Lite ve TensorFlow Operatör Uyumu


TensorFlow-Lite şimdilik sınırlı sayıda tf operatörünü desteklemektedir. Dönüştürme işlemi sırasında
desteklenen işlemler tf-lite benzerleri ile birleştirilebilir ya da özel olarak bazı operatörler seçilebilir[10].

TensorFlow-Lite operatörleri tf operatörlerinden daha az olduğundan dolayı her model dönüştürülebilir


değildir. Desteklenen operatörler için dahi performans etkilerinden dolayı çok spesifik kullanım şekilleri
beklenir. Bununla birlikte ek tf operatörleri binary boyut artışı karşılığında kullanılabilir.

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.

TensorFlow-Lite ile geliştirme süreci birkaç ana başlık altında toplanabilir.


1. Model seçimi, eğitimi ve dönüştürülmesi
2. Verinin model girişine uygun olacak biçimde dönüştürülmesi
3. Yorumlayıcının çalıştırılması
4. Çıkarımın değerlendirilmesi
8. Kaynaklar
[1] ht/tpswww.tensorflow.org/lite/guide
[2] https://www.tensorflow.org/lite/guide/inference#supported_platforms
[3] https://www.tensorflow.org/lite/performance/gpu_advanced#benefits_of_gpu_acceleration
[4] https://www.tensorflow.org/lite/performance/delegates
[5] https://www.tensorflow.org/lite/performance/model_optimization#model_quantization
[6] https://www.tensorflow.org/lite/performance/post_training_quantization
[7] https://www.tensorflow.org/lite/performance/post_training_quantization#full_integer_ quantiz
ation_of_weights_and_activations
[8] https://www.tensorflow.org/lite/performance/quantization_spec
[9] https://github.com/tensorflow/tensorflow/tree/r1.13/tensorflow/contrib/quantize
[10] https://www.tensorflow.org/lite/guide/ops_compatibility

You might also like