Bir sorunuz mu var? TensorFlow Forum Ziyaret Forumunda toplulukla bağlantı kurun

Eğitim sonrası niceleme

Eğitim sonrası niceleme, model boyutunu düşürürken aynı zamanda CPU ve donanım hızlandırıcı gecikmesini iyileştiren ve model doğruluğunda çok az bozulma olan bir dönüştürme tekniğidir. TensorFlow Lite Converter'ı kullanarak TensorFlow Lite formatına dönüştürdüğünüzde, önceden eğitilmiş bir kayan TensorFlow modelini nicelleştirebilirsiniz .

Optimizasyon Yöntemleri

Aralarından seçim yapabileceğiniz birkaç eğitim sonrası niceleme seçeneği vardır. Aşağıda, seçeneklerin ve sağladıkları faydaların bir özet tablosu verilmiştir:

Teknik Faydaları Donanım
Dinamik aralık niceleme 4x daha küçük, 2x-3x hızlanma İşlemci
Tam tamsayı niceleme 4x daha küçük, 3x + hızlanma CPU, Edge TPU, Mikrodenetleyiciler
Float16 nicemleme 2 kat daha küçük, GPU hızlandırma CPU, GPU

Aşağıdaki karar ağacı, kullanım durumunuz için hangi eğitim sonrası niceleme yönteminin en iyi olduğunu belirlemenize yardımcı olabilir:

eğitim sonrası optimizasyon seçenekleri

Dinamik aralık niceleme

Eğitim sonrası nicemlemenin en basit şekli, yalnızca kayan noktadan tam sayıya kadar ağırlıkları statik olarak nicelendirir;

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = converter.convert()

Çıkarımda, ağırlıklar 8 bitlik hassasiyetten kayan noktaya dönüştürülür ve kayan noktalı çekirdekler kullanılarak hesaplanır. Bu dönüştürme bir kez yapılır ve gecikmeyi azaltmak için önbelleğe alınır.

Gecikmeyi daha da iyileştirmek için, "dinamik aralık" operatörleri, etkinleştirmeleri 8 bit aralığına göre dinamik olarak nicelendirir ve 8 bitlik ağırlık ve etkinleştirmelerle hesaplamalar gerçekleştirir. Bu optimizasyon, tamamen sabit nokta çıkarımına yakın gecikmeler sağlar. Bununla birlikte, çıktılar hala kayan nokta kullanılarak depolanır, böylece dinamik aralıklı işlemlerle hızlanma, tam sabit nokta hesaplamasından daha azdır.

Tam tamsayı niceleme

Tüm model matematiğinin tamsayı olarak nicelendirildiğinden emin olarak daha fazla gecikme iyileştirmesi, en yüksek bellek kullanımında azalma ve yalnızca tamsayı donanım aygıtları veya hızlandırıcılarla uyumluluk elde edebilirsiniz.

Tam tamsayı niceleme için, modeldeki tüm kayan nokta tensörlerinin aralığını, yani (min, maks) kalibre etmeniz veya tahmin etmeniz gerekir. Ağırlıklar ve önyargılar gibi sabit tensörlerin aksine, model girdisi, etkinleştirmeler (ara katmanların çıktıları) ve model çıktısı gibi değişken tensörler, birkaç çıkarım döngüsü çalıştırmadıkça kalibre edilemez. Sonuç olarak, dönüştürücü bunları kalibre etmek için temsili bir veri kümesine ihtiyaç duyar. Bu veri kümesi, eğitim veya doğrulama verilerinin küçük bir alt kümesi (yaklaşık ~ 100-500 örnek) olabilir. Aşağıdaki representative_dataset() işlevine bakın.

def representative_dataset():
  for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100):
    yield [tf.dtypes.cast(data, tf.float32)]

Test amacıyla, aşağıdaki gibi sahte bir veri kümesi kullanabilirsiniz:

def representative_dataset():
    for _ in range(100):
      data = np.random.rand(1, 244, 244, 3)
      yield [data.astype(np.float32)]
 

Float geri dönüşlü tamsayı (varsayılan kayan giriş / çıkış kullanılarak)

Bir modeli tam olarak nicelleştirmek, ancak tamsayı uygulamalarına sahip olmadıklarında float operatörlerini kullanmak için (dönüşümün sorunsuz bir şekilde gerçekleşmesini sağlamak için) aşağıdaki adımları kullanın:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
tflite_quant_model = converter.convert()

Yalnızca tam sayı

Yalnızca tam sayı modeller oluşturmak , Mikrodenetleyiciler ve Coral Edge TPU'lar için TensorFlow Lite için yaygın bir kullanım örneğidir.

Ek olarak, yalnızca tam sayı cihazlarla (8 bitlik mikro denetleyiciler gibi) ve hızlandırıcılarla (Coral Edge TPU gibi) uyumluluğu sağlamak için, aşağıdaki adımları kullanarak giriş ve çıkış dahil tüm işlemler için tam tamsayı nicelemeyi uygulayabilirsiniz:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

Float16 nicemleme

Ağırlıkları 16 bitlik kayan nokta sayıları için IEEE standardı olan float16 olarak ölçerek bir kayan nokta modelinin boyutunu azaltabilirsiniz. Ağırlıkların float16 nicemlemesini etkinleştirmek için aşağıdaki adımları kullanın:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tflite_quant_model = converter.convert()

Float16 nicemlemenin avantajları aşağıdaki gibidir:

  • Model boyutunu yarıya kadar azaltır (tüm ağırlıklar orijinal boyutlarının yarısı olduğu için).
  • Doğrulukta minimum kayba neden olur.
  • Doğrudan float16 verileri üzerinde çalışabilen bazı delegeleri (örn. GPU temsilcisi) destekler ve float32 hesaplamalarına göre daha hızlı yürütme sağlar.

Float16 nicemlemenin dezavantajları aşağıdaki gibidir:

  • Sabit nokta matematiğine bir niceleme kadar gecikmeyi azaltmaz.
  • Varsayılan olarak, bir float16 nicemlenmiş model, CPU üzerinde çalıştırıldığında ağırlık değerlerini float32'ye "çözecektir". (GPU delegesinin float16 verileri üzerinde çalışabileceği için bu dekuantizasyonu gerçekleştirmeyeceğini unutmayın.)

Yalnızca tam sayı: 8 bit ağırlıklarla 16 bit etkinleştirmeler (deneysel)

Bu deneysel bir niceleme şemasıdır. "Yalnızca tamsayı" şemasına benzer, ancak etkinleştirmeler 16 bit aralığına göre nicelendirilir, ağırlıklar 8 bitlik tamsayı olarak nicelendirilir ve önyargı 64 bitlik tamsayı olarak nicelendirilir. Bu, 16x8 niceleme olarak adlandırılır.

Bu nicemlemenin temel avantajı, doğruluğu önemli ölçüde artırabilmesi, ancak model boyutunu yalnızca biraz artırmasıdır.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8]
tflite_quant_model = converter.convert()

Modeldeki bazı operatörler için 16x8 niceleme desteklenmiyorsa, model yine de nicelleştirilebilir, ancak desteklenmeyen operatörler float'ta tutulur. Buna izin vermek için target_spec'e aşağıdaki seçenek eklenmelidir.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8,
tf.lite.OpsSet.TFLITE_BUILTINS]
tflite_quant_model = converter.convert()

Bu niceleme şeması tarafından sağlanan doğruluk iyileştirmelerinin sağladığı kullanım durumlarının örnekleri şunları içerir: * süper çözünürlük, * gürültü engelleme ve hüzmeleme gibi ses sinyali işleme, * görüntü paraziti giderme, * tek bir görüntüden HDR yeniden yapılandırma.

Bu nicemlemenin dezavantajı şudur:

  • Şu anda çıkarım, optimize edilmiş çekirdek uygulamasının olmaması nedeniyle 8 bitlik tam tamsayıdan belirgin şekilde daha yavaştır.
  • Şu anda mevcut donanım hızlandırmalı TFLite temsilcileriyle uyumlu değildir.

Bu kuantizasyon modu için bir eğitim burada bulunabilir.

Model doğruluğu

Ağırlıklar eğitim sonrası nicelleştirildiğinden, özellikle daha küçük ağlar için bir doğruluk kaybı olabilir. TensorFlow Lite model deposundaki belirli ağlar için önceden eğitilmiş tam olarak nicelendirilmiş modeller sağlanır. Doğruluktaki herhangi bir bozulmanın kabul edilebilir sınırlar içinde olduğunu doğrulamak için nicelleştirilmiş modelin doğruluğunu kontrol etmek önemlidir. TensorFlow Lite model doğruluğunu değerlendirmek için araçlar vardır.

Alternatif olarak, doğruluk düşüşü çok yüksekse, nicelemeye duyarlı eğitim kullanmayı düşünün. Ancak, bunu yapmak, model eğitimi sırasında sahte niceleme düğümleri eklemek için değişiklik yapılmasını gerektirir, oysa bu sayfadaki eğitim sonrası niceleme teknikleri önceden eğitilmiş bir modeli kullanır.

Nicelleştirilmiş tensörler için temsil

8 bitlik nicemleme, aşağıdaki formülü kullanarak kayan nokta değerlerine yaklaşır.

$$real\_value = (int8\_value - zero\_point) \times scale$$

Temsilin iki ana bölümü vardır:

  • Sıfır noktası 0'a eşit olan [-127, 127] aralığında int8 ikinin tamamlayıcı değerleriyle temsil edilen eksen başına (diğer adıyla kanal başına) veya tensör başına ağırlıklar.

  • [-128, 127] aralığında bir sıfır noktası ile [-128, 127] aralığında int8 ikinin tamamlayıcı değerleriyle temsil edilen tensör başına etkinleştirmeler / girdiler.

Niceleme şemamızın ayrıntılı bir görünümü için lütfen kuantizasyon spesifikasyonumuza bakın . TensorFlow Lite'ın temsilci arayüzüne bağlanmak isteyen donanım satıcılarının, burada açıklanan niceleme şemasını uygulaması teşvik edilir.