Eğitim sonrası niceleme

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. TensorFlow Lite Converter'ı kullanarak TensorFlow Lite formatına dönüştürdüğünüzde, önceden eğitilmiş bir float TensorFlow modelini nicelleştirebilirsiniz.

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

Dinamik aralık niceleme, kalibrasyon için temsili bir veri kümesi sağlamanıza gerek kalmadan azaltılmış bellek kullanımı ve daha hızlı hesaplama sağladığı için önerilen bir başlangıç ​​noktasıdır. Bu tür niceleme, dönüşüm zamanında yalnızca kayan noktadan tam sayıya kadar olan ağırlıkları statik olarak niceler ve bu da 8 bitlik hassasiyet sağlar:

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ım sırasında gecikmeyi daha da azaltmak 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 noktalı çıkarımlara yakın gecikmeler sağlar. Bununla birlikte, çıktılar hala kayan nokta kullanılarak depolanır, bu nedenle dinamik aralıklı işlemlerin artan hızı, tam bir sabit nokta hesaplamasından daha azdır.

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. Aşağıdaki representative_dataset() işlevine bakın.

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

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

Verilen TensorFlow modelinde birden fazla imza varsa, imza anahtarlarını belirterek çoklu veri kümesini belirtebilirsiniz:

def representative_dataset():
  # Feed data set for the "encode" signature.
  for data in encode_signature_dataset:
    yield (
      "encode", {
        "image": data.image,
        "bias": data.bias,
      }
    )

  # Feed data set for the "decode" signature.
  for data in decode_signature_dataset:
    yield (
      "decode", {
        "image": data.image,
        "hint": data.hint,
      },
    )

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ı

Yalnızca tamsayılı modeller oluşturmak, Mikrodenetleyiciler ve Coral Edge TPU'lar için TensorFlow Lite için yaygın bir kullanım durumudur.

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 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 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 burada bulunabilir.

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. TensorFlow Hub'daki belirli ağlar için önceden eğitilmiş tam olarak nicelenmiş modeller sağlanır. 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. TensorFlow Lite modelinin doğruluğunu değerlendirmek için araçlar vardır.

Alternatif olarak, doğruluk düşüşü çok yüksekse, niceleme duyarlı eğitim kullanmayı düşünün. Ancak bunu yapmak, sahte nicemleme düğümleri eklemek için model eğitimi sırasında modifikasyonlar gerektirirken, bu sayfadaki eğitim sonrası nicemleme 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.

Kuantizasyon şemamızın ayrıntılı bir görünümü için lütfen nicemleme spesifikasyonumuza bakın. 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.