Eğitim sonrası nicemleme

Eğitim sonrası niceleme, model doğruluğunu çok az bozarak CPU ve donanım hızlandırıcı gecikmesini iyileştirirken model boyutunu küçültebilen bir dönüştürme tekniğidir. Kullandığınız TensorFlow Lite biçimine dönüştürmek zaman zaten eğitimli şamandıra TensorFlow modelin kuantize olabilir TensorFlow Lite Converter .

Optimizasyon Yöntemleri

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

teknik Faydalar Donanım
Dinamik aralık niceleme 4x daha küçük, 2x-3x hızlanma İşlemci
Tam tamsayı nicemleme 4x daha küçük, 3x+ hızlanma CPU, Edge TPU, Mikrodenetleyiciler
Float16 niceleme 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ı nicelemenin en basit biçimi, yalnızca kayan noktadan tamsayıya kadar olan ağırlıkları statik olarak niceler, bu da 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 nokta çekirdekleri 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, 8 bitlik aralıklarına göre aktivasyonları dinamik olarak nicelleştirir ve 8 bitlik ağırlıklar ve aktivasyonlarla 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 bir sabit nokta hesaplamasından daha az olur.

Tam tamsayı nicemleme

Tüm model matematiğinin tamsayı olarak nicelendiğinden emin olarak daha fazla gecikme iyileştirmesi, en yüksek bellek kullanımında azalma ve yalnızca tamsayılı 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ı (min, maks) kalibre etmeniz veya tahmin etmeniz gerekir. Ağırlıklar ve önyargılar gibi sabit tensörlerin aksine, model girişi, aktivasyonlar (ara katmanların çıktıları) ve model çıkışı 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. Bakınız representative_dataset() aşağıdaki fonksiyonun.

TensorFlow 2.7 sürümü itibaren, bir arayüz aracılığıyla temsili veri kümesi belirtebilirsiniz imza aşağıdaki örnekte olduğu gibi:

def representative_dataset():
  for data in dataset:
    yield {
      "image": data.image,
      "bias": data.bias,
    }

Bir giriş tensörü listesi sağlayarak temsili veri kümesini oluşturabilirsiniz:

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

TensorFlow 2.7 sürümünden bu yana, giriş tensörü sıralaması kolayca çevrilebildiğinden, giriş tensörü listesi tabanlı yaklaşım yerine imza tabanlı yaklaşımı kullanmanızı öneririz.

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

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

Kayan noktalı yedekli tamsayı (varsayılan kayan nokta giriş/çıkış kullanılarak)

Bir modeli tam olarak tamsayı nicelleştirmek için, ancak tamsayı uygulamaları olmadığında kayan nokta operatörlerini kullanmak için (dönüşümün sorunsuz 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 tamsayı

Sadece modellerin tamsayı oluşturma için yaygın kullanılma şeklidir Microcontrollers TensorFlow Lite ve mercan Kenar TPU .

Ek olarak, yalnızca tamsayılı cihazlarla (8 bit mikrodenetleyiciler 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 zorunlu kılabilirsiniz:

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 niceleme

Ağırlıkları, 16 bitlik kayan nokta sayıları için IEEE standardı olan float16'ya nicemleyerek kayan nokta modelinin boyutunu küçültebilirsiniz. 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 nicelemenin avantajları aşağıdaki gibidir:

  • Model boyutunu yarıya kadar azaltır (çünkü tüm ağırlıklar orijinal boyutlarının yarısı kadardır).
  • Doğrulukta minimum kayba neden olur.
  • Doğrudan float16 verileri üzerinde çalışabilen ve böylece float32 hesaplamalarından daha hızlı yürütme sağlayan bazı delegeleri (örn. GPU temsilcisi) destekler.

Float16 kuantizasyonunun dezavantajları şunlardır:

  • Sabit nokta matematiğine nicelleştirme kadar gecikmeyi azaltmaz.
  • Varsayılan olarak, bir float16 nicelenmiş model, CPU üzerinde çalıştırıldığında ağırlık değerlerini float32'ye "dekuantize eder". (GPU temsilcisinin, float16 verilerinde çalışabileceğinden bu dekuantizasyonu gerçekleştirmeyeceğini unutmayın.)

Yalnızca tamsayı: 8 bit ağırlıklı 16 bit etkinleştirme (deneysel)

Bu deneysel bir niceleme şemasıdır. "Yalnızca tamsayı" şemasına benzer, ancak aktivasyonlar 16 bitlik aralıklarına göre nicelenir, ağırlıklar 8 bit tamsayıda nicelenir ve önyargı 64 bit tamsayıya nicelenir. Buna ayrıca 16x8 nicemleme adı verilir.

Bu nicelemenin ana avantajı, doğruluğu önemli ölçüde artırabilmesi, ancak model boyutunu yalnızca biraz artırabilmesidir.

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 nicemleme desteklenmiyorsa, model yine nicemlenebilir, ancak desteklenmeyen operatörler yüzer durumda 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 kullanım örnekleri arasında şunlar yer alır: * süper çözünürlük, * gürültü önleme ve hüzmeleme gibi ses sinyali işleme, * görüntü parazit giderme, * tek bir görüntüden HDR yeniden yapılandırma.

Bu nicelemenin dezavantajı:

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

Bu niceleme modu için bir öğretici bulunabilir burada .

Model doğruluğu

Ağırlıklar eğitim sonrasında nicelleştirildiğinden, özellikle daha küçük ağlar için doğruluk kaybı olabilir. Ön eğitimli tam kuvantalaması modeller de özel ağlar için verilmektedir TensorFlow Lite modeli depo . Doğruluktaki herhangi bir bozulmanın kabul edilebilir sınırlar içinde olduğunu doğrulamak için nicelenmiş modelin doğruluğunu kontrol etmek önemlidir. Değerlendirmek için araçlar vardır TensorFlow Lite modeli doğruluğu .

Doğruluk damla çok yüksekse Alternatif olarak, eğer kullanmayı düşünün nicemleme farkında eğitimi . Ancak bunu yapmak, sahte niceleme düğümleri eklemek için model eğitimi sırasında modifikasyonlar gerektirirken, bu sayfadaki eğitim sonrası niceleme teknikleri önceden eğitilmiş bir modeli kullanır.

Kuantize tensörler için temsil

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

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

Temsil iki ana bölümden oluşur:

  • Sıfır noktası 0'a eşit olan [-127, 127] aralığında int8 ikinin tümleyen değerleriyle temsil edilen eksen başına (aka başına kanal) veya tensör başına ağırlıklar.

  • [-128, 127] aralığında, [-128, 127] aralığında bir sıfır noktasıyla int8 ikinin tümleyen değerleriyle temsil edilen tensör başına etkinleştirmeler/girişler.

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