Pazar , 20 Eylül 2020
Home » Teknoloji » TensorFlow-Lite Nedir?

TensorFlow-Lite Nedir?

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

TensorFlow-Lite Nedir? 1 – image 8

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.

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

TensorFlow-Lite Nedir? 2 – image 9

                     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

TensorFlow-Lite Nedir? 3 – image 10

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.

TensorFlow-Lite Nedir? 4 – image 11

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 fixedpoint çı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. Peraxis 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; qa, za ve  qb, zb olsun.

TensorFlow-Lite Nedir? 5 – image 12

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

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir