Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Eğitim sonrası niceleme

Eğitim sonrası niceleme, model doğruluğunda çok az bozulma ile CPU ve donanım hızlandırıcı gecikmesini iyileştirirken model boyutunu azaltabilen 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, bu 8 bitlik hassasiyete sahiptir:

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 yapar. Bu optimizasyon, tamamen sabit nokta çıkarımına yakın gecikmeler sağlar. Bununla birlikte, çıktılar hala kayan nokta kullanılarak saklanı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ı 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, dönüştürücüye örnek giriş verileri sağlayarak dinamik aktivasyon ve giriş aralığını ölçmeniz gerekir. Aşağıdaki kodda kullanılan representative_dataset_gen() işlevine bakın.

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

Bir modeli tam sayı olarak nicelendirmek, 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]
def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]
converter.representative_dataset = representative_dataset_gen
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]
def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]
converter.representative_dataset = representative_dataset_gen
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 noktalı sayılar için IEEE standardı olan float16'ya nicelendirerek 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:

  • Gecikmeyi sabit nokta matematiğine nicemleme kadar 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)
def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]
converter.representative_dataset = representative_dataset_gen
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)
def representative_dataset_gen():
  for _ in range(num_calibration_steps):
    # Get sample input data as a numpy array in a method of your choosing.
    yield [input]
converter.representative_dataset = representative_dataset_gen
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ğil.

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 havuzundaki 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ı gerektirirken, 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 niceleme 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.