NNCF: фреймворк для сжатия нейронных сетей
NNCF (Neural Network Compression Framework) — это набор алгоритмов для оптимизации вывода нейронных сетей после обучения и во время обучения с минимальным снижением точности. Фреймворк предназначен для работы с моделями из PyTorch, TorchFX, TensorFlow, ONNX и OpenVINO.
Фреймворк организован в виде пакета Python, который можно собрать и использовать автономно. Архитектура фреймворка унифицирована, чтобы было легко добавлять различные алгоритмы сжатия как для PyTorch, так и для TensorFlow.
Основные возможности
Алгоритмы сжатия после обучения:
Алгоритмы сжатия во время тренировки:
Фреймворк предоставляет образцы, демонстрирующие использование алгоритмов сжатия для различных случаев использования и моделей. Результаты сжатия, достижимые с помощью образцов на базе NNCF, можно увидеть на странице Model Zoo. Последовательный или функциональный API Keras поддерживаются.
Эта документация содержит подробную информацию об алгоритмах и функциях NNCF, необходимых для вклада в NNCF.
Последняя версия пользовательской документации для NNCF доступна здесь.
Документация по API NNCF находится здесь.
NNCF PTQ — это самый простой способ применить 8-битное квантование. Для запуска алгоритма вам нужна только ваша модель и небольшой (~300 образцов) калибровочный набор данных.
OpenVINO является предпочтительным бэкэндом для запуска PTQ, хотя PyTorch, TensorFlow и ONNX также поддерживаются.
OpenVINO
import nncf
import openvino.runtime as ov
import torch
from torchvision import datasets, transforms
# Instantiate your uncompressed model
model = ov.Core().read_model("/model_path")
# Provide validation part of the dataset to collect statistics needed for the compression algorithm
val_dataset = datasets.ImageFolder("/path", transform=transforms.Compose([transforms.ToTensor()]))
dataset_loader = torch.utils.data.DataLoader(val_dataset, batch_size=1)
# Step 1: Initialize transformation function
def transform_fn(data_item):
images, _ = data_item
return images
# Step 2: Initialize NNCF Dataset
calibration_dataset = nncf.Dataset(dataset_loader, transform_fn)
# Step 3: Run the quantization pipeline
quantized_model = nncf.quantize(model, calibration_dataset)
PyTorch
import nncf
import torch
from torchvision import datasets, models
# Instantiate your uncompressed model
model = models.mobilenet_v2()
# Provide validation part of the dataset to collect statistics needed for the compression algorithm
val_dataset = datasets.ImageFolder("/path", transform=transforms.Compose([transforms.ToTensor()]))
dataset_loader = torch.utils.data.DataLoader(val_dataset)
# Step 1: Initialize the transformation function
def transform_fn(data_item):
images, _ = data_item
return images
# Step 2: Initialize NNCF Dataset
calibration_dataset = nncf.Dataset(dataset_loader, transform_fn)
# Step 3: Run the quantization pipeline
quantized_model = nncf.quantize(model, calibration_dataset)
Если алгоритм посттренировочного квантования не соответствует требованиям качества, вы можете точно настроить квантованную модель pytorch. Вы можете найти пример квантово-осведомлённого обучающего конвейера для модели pytorch здесь. Посттренировочная квантизация
PyTorch
Отключение патчинга
model = models.mobilenet_v2()
val_dataset = datasets.ImageFolder("/path", transform=transforms.Compose([transforms.ToTensor()])) dataset_loader = torch.utils.data.DataLoader(val_dataset)
def transform_fn(data_item): images, _ = data_item return images
calibration_dataset = nncf.Dataset(dataset_loader, transform_fn)
input_shape = (1, 3, 224, 224) with nncf.torch.disable_patching(): fx_model = torch.export.export_for_training(model, args=(ex_input,)).module() # или # fx_model = torch.export.export(model, args=(ex_input,)).module()
# Шаг 4: Запускаем квантизационный пайплайн
quantized_fx_model = nncf.quantize(fx_model, calibration_dataset)
TensorFlow
import nncf import tensorflow as tf import tensorflow_datasets as tfds
model = tf.keras.applications.MobileNetV2()
val_dataset = tfds.load("/path", split="validation", shuffle_files=False, as_supervised=True)
def transform_fn(data_item): images, _ = data_item return images
calibration_dataset = nncf.Dataset(val_dataset, transform_fn)
quantized_model = nncf.quantize(model, calibration_dataset)
ONNX
import onnx import nncf import torch from torchvision import datasets
onnx_model = onnx.load_model("/model_path")
val_dataset = datasets.ImageFolder("/path", transform=transforms.Compose([transforms.ToTensor()])) dataset_loader = torch.utils.data.DataLoader(val_dataset, batch_size=1)
input_name = onnx_model.graph.input[0].name def transform_fn(data_item): images, _ = data_item return {input_name: images.numpy()}
calibration_dataset = nncf.Dataset(dataset_loader, transform_fn)
quantized_model = nncf.quantize(onnx_model, calibration_dataset)
Здесь приведён пример пайплайна точной квантизации, где веса модели и параметры сжатия могут быть настроены для достижения более высокой точности.
PyTorch
import nncf import torch from torchvision import datasets, models
model = models.mobilenet_v2()
val_dataset = datasets.ImageFolder("/path", transform=transforms.Compose([transforms.ToTensor()])) dataset_loader = torch.utils.data.DataLoader(val_dataset)
def transform_fn(data_item): images, _ = data_item return images
calibration_dataset = nncf.Dataset(dataset_loader, transform_fn)
quantized_model = nncf.quantize(model, calibration_dataset)
checkpoint = { 'state_dict': model.state_dict(), 'nncf_config': model.nncf.get_config(), ... # остальные пользовательские объекты для сохранения Обучение с использованием модели сжатия NNCF
Здесь приведён пример конвейера сжатия RB Sparsification, оптимизированного для точности. В этом примере веса модели и параметры сжатия можно настроить для достижения более высокой точности.
PyTorch
import torch
import nncf.torch # Важно: этот модуль должен быть импортирован перед любым другим внешним пакетом, который зависит от torch
from nncf import NNCFConfig
from nncf.torch import create_compressed_model, register_default_init_args
# Создаём незаархивированную модель
from torchvision.models.resnet import resnet50
model = resnet50()
# Загружаем файл конфигурации для указания параметров сжатия
nncf_config = NNCFConfig.from_json("resnet50_imagenet_rb_sparsity.json")
# Предоставляем загрузчики данных для инициализации алгоритма сжатия, если это необходимо
import torchvision.datasets as datasets
representative_dataset = datasets.ImageFolder("/path", transform=transforms.Compose([transforms.ToTensor()]))
init_loader = torch.utils.data.DataLoader(representative_dataset)
nncf_config = register_default_init_args(nncf_config, init_loader)
# Применяем указанные алгоритмы сжатия к модели
compression_ctrl, compressed_model = create_compressed_model(model, nncf_config)
# Теперь используем compressed_model как обычный torch.nn.Module
# для точной настройки параметров сжатия вместе с весами модели
# ... остальной стандартный PyTorch-конвейер обучения
# Экспортируем в ONNX или .pth после точной настройки
compression_ctrl.export_model("compressed_model.onnx")
torch.save(compressed_model.state_dict(), "compressed_model.pth")
Примечание (PyTorch): Из-за того, как NNCF работает в бэкенде PyTorch, import nncf
должен выполняться до любого другого импорта torch
в вашем пакете или в сторонних пакетах, которые использует ваш код. Иначе сжатие может быть применено не полностью.*
Tensorflow
import tensorflow as tf
from nncf import NNCFConfig
from nncf.tensorflow import create_compressed_model, register_default_inits
# Создаём незаархивированную модель
from tensorflow.keras.applications import ResNet50
model = ResNet50()
# Загружаем файл конфигурации для указания сжатия
nncf_config = NNCFConfig.from_json("resnet50_imagenet_rb_sparsity.json")
# Предоставляем набор данных для инициализации алгоритма сжатия
representative_dataset = tf.data.Dataset.list_files("/path/*.jpeg")
nncf_config = register_default_init_args(nncf_config, representative_dataset, batch_size=1)
# Применяем указанные алгоритмы сжатия к модели
compression_ctrl, compressed_model = create_compressed_model(model, nncf_config)
# Теперь используем compressed_model как обычную модель Keras
# для тонкой настройки параметров сжатия вместе с весами модели
#... остальной стандартный TensorFlow-конвейер обучения
# Экспортируем в Frozen Graph, TensorFlow SavedModel или .h5 после тонкой настройки
compression_ctrl.export_model("compressed_model.pb", save_format="frozen_graph")
``` Список ноутбуков, демонстрирующих:
| Алгоритм сжатия | Бэкенд | Область |
|:-----------------------|:------------------------------------------|:----------:|
| Квантизацию BERT | Посттренировочную квантизацию | OpenVINO | NLP |
| Модель сегментации MONAI | Посттренировочную квантизацию | OpenVINO | Сегментация |
| Квантизация модели PyTorch | Посттренировочную квантизацию | PyTorch | Классификация изображений |
| Квантизация с контролем точности | Посттренировочную квантизацию с контролем точности | OpenVINO | Распознавание речи, обнаружение объектов |
| Обучение PyTorch с учётом сжатия | Сжатие во время обучения | PyTorch | Классификация изображений |
| Обучение TensorFlow с учётом сжатия | Сжатие во время обучения | Tensorflow | Классификация изображений |
| Совместное прореживание, квантизация и дистилляция для BERT | Совместное прореживание, квантизацию и дистилляцию | OpenVINO | NLP | OpenVINO: конверсия и инференс вместе со сжатием NNCF для моделей из различных областей:
| Демо-модель | Алгоритм сжатия | Бэкенд | Область |
|:-------------|:--------------------|:------|:--------|
| YOLOv8 | Постобучающее квантование | OpenVINO | Обнаружение объектов, определение ключевых точек, сегментация экземпляров |
| EfficientSAM | Постобучающее квантование | OpenVINO | Сегментация изображений |
| Segment Anything Model | Постобучающее квантование | OpenVINO | Сегментация изображений |
| OneFormer | Постобучающее квантование | OpenVINO | Сегментация изображений |
| InstructPix2Pix | Постобучающее квантование | OpenVINO | Редактирование изображений |
| CLIP | Постобучающее квантование | OpenVINO | Классификация изображений без обучения |
| BLIP |
*Примечание: в запросе не хватает информации о модели BLIP.* **Примеры посттренировочного квантования**
Компактные скрипты, демонстрирующие квантование и соответствующее повышение скорости вывода:
| Название примера | Алгоритм сжатия | Backend | Область |
|:--------------------------------------------------------------------------------------------------------------------:|----------------------------------:|:----------:|:----------------------:|
| [OpenVINO MobileNetV2](./examples/post_training_quantization/openvino/mobilenet_v2/README.md) | Посттренировочное квантование | OpenVINO | Классификация изображений |
| [OpenVINO YOLOv8](./examples/post_training_quantization/openvino/yolov8/README.md) | Посттренировочное квантование | OpenVINO | Обнаружение объектов |
| [OpenVINO YOLOv8 QwAС](./examples/post_training_quantization/openvino/yolov8_quantize_with_accuracy_control/README.md) | Посттренировочное квантование с контролем точности | OpenVINO | Обнаружение объектов |
| [OpenVINO Anomaly Classification](./examples/post_training_quantization/openvino/anomaly_stfpm_quantize_with_accuracy_control/README.md)| Посттренировочное квантование с контролем точности | OpenVINO | Классификация аномалий |
| [PyTorch MobileNetV2](./examples/post_training_quantization/torch/mobilenet_v2/README.md) | Посттренировочное квантование | PyTorch | Классификация изображений |
| [PyTorch SSD](./examples/post_training_quantization/torch/ssd300_vgg16/README.md) | Посттренировочное квантование | PyTorch | Обнаружение объектов |
| [TorchFX Resnet18](./examples/post_training_quantization/torch_fx/resnet18/README.md) | Посттренировочное квантование | TorchFX | Классификация изображений|
| [TensorFlow MobileNetV2](./examples/post_training_quantization/tensorflow/mobilenet_v2/README.md) | Посттренировочное квантование | TensorFlow | Классификация изображений|
| [ONNX MobileNetV2](./examples/post_training_quantization/onnx/mobilenet_v2/README.md) | Посттренировочное квантование | ONNX | Классификация изображений|
**Примеры сжатия во время обучения**
Примеры полных конвейеров, включающих сжатие, обучение и вывод для задач классификации, обнаружения и сегментации:
| Название примера | Алгоритм сжатия | Backend | Область |
|:------------------------------------------------------------------------------------------------------------:|-----------------------------:|:----------:|:---------------------------:|
| [PyTorch Image Classification](./examples/torch/classification/README.md) | Сжатие во время обучения | PyTorch | Классификация изображений |
| [PyTorch Object Detection](./examples/torch/object_detection/README.md) | Сжатие во время обучения | PyTorch | Обнаружение объектов |
| [PyTorch Semantic Segmentation](./examples/torch/semantic_segmentation/README.md) | Сжатие во время обучения | PyTorch | Сегментация изображений |
| [TensorFlow Image Classification](./examples/tensorflow/classification/README.md) | Сжатие во время обучения | **NNCF: интеграция с репозиториями третьих сторон, установка, системные требования**
NNCF может быть легко интегрирован в пайплайны обучения и оценки репозиториев третьих сторон.
**Использован:**
* OpenVINO Training Extensions (https://github.com/openvinotoolkit/training_extensions). NNCF интегрирован в OpenVINO Training Extensions как бэкенд оптимизации модели. Вы можете обучать, оптимизировать и экспортировать новые модели на основе доступных шаблонов моделей, а также запускать экспортированные модели с помощью OpenVINO.
* HuggingFace Optimum Intel (https://huggingface.co/docs/optimum/intel/optimization_ov). NNCF используется в качестве бэкенда сжатия в известном репозитории transformers в HuggingFace Optimum Intel.
Для получения подробных инструкций по установке обратитесь к руководству по установке (Installation guide).
NNCF можно установить как обычный пакет PyPI через pip:
```bash
pip install nncf
NNCF также доступен через conda (https://anaconda.org/conda-forge/nncf):
conda install -c conda-forge nncf
Системные требования:
— Ubuntu 18.04 или более поздняя версия (64-бит); — Python 3.9 или более поздней версии; — Поддерживаемые фреймворки: PyTorch >=2.4, <2.6, TensorFlow >=2.8.4, <=2.15.1, ONNX ==1.17.0, OpenVINO >=2022.3.0.
Этот репозиторий протестирован на Python 3.10.14, PyTorch 2.5.0 (NVidia CUDA Toolkit 12.4) и TensorFlow 2.12.1 (NVidia CUDA Toolkit 11.8).
Список моделей и результатов сжатия для них можно найти на нашей странице NNCF Model Zoo.
Цитирование:
@article{kozlov2020neural,
title = {Neural network compression framework for fast model inference},
author = {Kozlov, Alexander and Lazarevich, Ivan and Shamporov, Vasily and Lyalyushkin, Nikolay and Gorbachev, Yury},
journal = {arXiv preprint arXiv:2002.08679},
year = {2020}
}
Руководство по внесению вклада доступно в файле CONTRIBUTING.md.
Также доступны документация, примеры скриптов, FAQ, блокноты, HuggingFace Optimum Intel и руководство по оптимизации моделей OpenVINO.
NNCF как часть инструментария OpenVINOTM собирает анонимные данные об использовании с целью улучшения инструментов OpenVINO™. Вы можете отказаться от участия в любое время, выполнив следующую команду в среде Python, где у вас установлен NNCF:
opt_in_out --opt_out
.
Более подробную информацию можно найти в разделе о телеметрии OpenVINO (https://docs.openvino.ai/2024/about-openvino/additional-resources/telemetry.html).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )