Квантизация моделей — это процесс снижения разрядности чисел, используемых для представления весов и активаций нейронной сети, с целью уменьшения объёма модели и ускорения инференса без существенной потери точности. В TensorFlow.js поддерживаются различные типы квантизации, наиболее распространённые из которых — float16 и int8.
Квантизация переводит параметры модели из высокоточной формы (обычно float32) в более компактный формат. Применение квантизации позволяет:
Важное отличие между float16 и int8:
| Тип квантизации | Диапазон значений | Потери точности | Основное применение |
|---|---|---|---|
| float16 | ±6.5×10⁴ | минимальные | GPU и WebGL ускорение, точные модели |
| int8 | -128…127 | выше, требует калибровки | Устройства с низкой памятью и ограниченным CPU |
TensorFlow.js поддерживает квантизацию моделей на этапе их экспорта из TensorFlow или при конвертации формата SavedModel / Keras → TensorFlow.js Layers или Graph Model.
Для получения модели с весами float16 используется параметр
weight_dtype:
tensorflowjs_converter \
--input_format=tf_saved_model \
--output_format=tfjs_graph_model \
--weight_dtype=float16 \
/path/to/saved_model \
/path/to/web_model
Квантизация до int8 в TensorFlow.js требует дополнительной калибровки с использованием набора данных. Прямого автоматического преобразования int8 при конвертации модели нет, поэтому применяется post-training quantization через TensorFlow Python:
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model("saved_model")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
def representative_dataset():
for _ in range(100):
yield [input_data_sample] # input_data_sample — пример входных данных
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
tflite_model = converter.convert()
После этого tflite-модель можно конвертировать в TensorFlow.js с
помощью tensorflowjs_converter. Квантизация int8 позволяет
значительно уменьшить размер модели и ускорить инференс на CPU, но
требует проверки точности.
Выбор формата квантизации:
Тестирование модели после квантизации:
Интеграция в TensorFlow.js:
tf.loadGraphModel) лучше подходит для
моделей с float16 и int8, особенно если требуется WebGL ускорение.tf.loadLayersModel) поддерживает float16
на этапе конвертации весов, но int8 поддерживается через TFLite → TFJS
Pipeline.tfjs-backend-wasm),
который обеспечивает ускоренные int8 вычисления.Квантизация является обязательной практикой при переносе больших нейронных сетей в веб-среду, обеспечивая сочетание производительности, компактности и управляемой потери точности.