Основные характеристики • Установка • Документация • Использование • Учебные пособия и примеры • Сторонняя интеграция • Зоопарк моделей
Neural Network Compression Framework (NNCF) предоставляет набор алгоритмов после обучения и во время обучения для оптимизации вывода нейронных сетей в OpenVINO™ с минимальным падением точности.
NNCF предназначен для работы с моделями PyTorch, TorchFX, TensorFlow, ONNX и OpenVINO™.
NNCF предоставляет примеры, демонстрирующие использование алгоритмов сжатия для различных вариантов использования и моделей. Результаты сжатия, достижимые с помощью образцов на базе NNCF, можно найти на странице зоопарка моделей NNCF.
Платформа организована в виде пакета Python*, который можно собрать и использовать в автономном режиме. Архитектура платформы унифицирована, что позволяет легко добавлять различные алгоритмы сжатия для платформ глубокого обучения PyTorch и TensorFlow.
Алгоритм сжатия | ОпенВИНО | PyTorch | ФакелFX | Тензорфлоу | ОННКС |
---|---|---|---|---|---|
Квантование после обучения | Поддерживается | Поддерживается | Экспериментальный | Поддерживается | Поддерживается |
Сжатие весов | Поддерживается | Поддерживается | Экспериментальный | Не поддерживается | Не поддерживается |
Разреженность активации | Не поддерживается | Экспериментальный | Не поддерживается | Не поддерживается | Не поддерживается |
Алгоритм сжатия | PyTorch | Тензорфлоу |
---|---|---|
Обучение с учетом квантования | Поддерживается | Поддерживается |
Квантование смешанной точности | Поддерживается | Не поддерживается |
Разреженность | Поддерживается | Поддерживается |
Удаление фильтров | Поддерживается | Поддерживается |
Обрезка движений | Экспериментальный | Не поддерживается |
ПРИМЕЧАНИЕ . Ограниченная поддержка моделей TensorFlow. Поддерживаются только модели, созданные с использованием Sequential или Keras Functional API.
Эта документация содержит подробную информацию об алгоритмах и функциях NNCF, необходимых для участия в NNCF.
Новейшую пользовательскую документацию для NNCF можно найти здесь.
Документацию по API NNCF можно найти здесь.
NNCF PTQ — это самый простой способ применить 8-битное квантование. Для запуска алгоритма вам нужна только ваша модель и небольшой (около 300 образцов) набор калибровочных данных.
OpenVINO является предпочтительным бэкэндом для запуска PTQ, при этом также поддерживаются PyTorch, TensorFlow и ONNX.
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 )
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 здесь.
import nncf
import torch . fx
from torchvision import datasets , models
from nncf . torch import disable_patching
# 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: Export model to TorchFX
input_shape = ( 1 , 3 , 224 , 224 )
with nncf . torch . disable_patching ():
fx_model = torch . export . export_for_training ( model , args = ( ex_input ,)). module ()
# or
# fx_model = torch.export.export(model, args=(ex_input,)).module()
# Step 4: Run the quantization pipeline
quantized_fx_model = nncf . quantize ( fx_model , calibration_dataset )
import nncf
import tensorflow as tf
import tensorflow_datasets as tfds
# Instantiate your uncompressed model
model = tf . keras . applications . MobileNetV2 ()
# Provide validation part of the dataset to collect statistics needed for the compression algorithm
val_dataset = tfds . load ( "/path" , split = "validation" ,
shuffle_files = False , as_supervised = True )
# Step 1: Initialize transformation function
def transform_fn ( data_item ):
images , _ = data_item
return images
# Step 2: Initialize NNCF Dataset
calibration_dataset = nncf . Dataset ( val_dataset , transform_fn )
# Step 3: Run the quantization pipeline
quantized_model = nncf . quantize ( model , calibration_dataset )
import onnx
import nncf
import torch
from torchvision import datasets
# Instantiate your uncompressed model
onnx_model = onnx . load_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
input_name = onnx_model . graph . input [ 0 ]. name
def transform_fn ( data_item ):
images , _ = data_item
return { input_name : images . numpy ()}
# Step 2: Initialize NNCF Dataset
calibration_dataset = nncf . Dataset ( dataset_loader , transform_fn )
# Step 3: Run the quantization pipeline
quantized_model = nncf . quantize ( onnx_model , calibration_dataset )
Вот пример конвейера квантования с учетом точности, в котором веса модели и параметры сжатия могут быть точно настроены для достижения более высокой точности.
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 )
# Now use compressed_model as a usual torch.nn.Module
# to fine-tune compression parameters along with the model weights
# Save quantization modules and the quantized model parameters
checkpoint = {
'state_dict' : model . state_dict (),
'nncf_config' : model . nncf . get_config (),
... # the rest of the user-defined objects to save
}
torch . save ( checkpoint , path_to_checkpoint )
# ...
# Load quantization modules and the quantized model parameters
resuming_checkpoint = torch . load ( path_to_checkpoint )
nncf_config = resuming_checkpoint [ 'nncf_config' ]
state_dict = resuming_checkpoint [ 'state_dict' ]
quantized_model = nncf . torch . load_from_config ( model , nncf_config , example_input )
model . load_state_dict ( state_dict )
# ... the rest of the usual PyTorch-powered training pipeline
Вот пример конвейера разрежения RB с учетом точности, в котором веса модели и параметры сжатия могут быть точно настроены для достижения более высокой точности.
import torch
import nncf . torch # Important - must be imported before any other external package that depends on torch
from nncf import NNCFConfig
from nncf . torch import create_compressed_model , register_default_init_args
# Instantiate your uncompressed model
from torchvision . models . resnet import resnet50
model = resnet50 ()
# Load a configuration file to specify compression
nncf_config = NNCFConfig . from_json ( "resnet50_imagenet_rb_sparsity.json" )
# Provide data loaders for compression algorithm initialization, if necessary
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 )
# Apply the specified compression algorithms to the model
compression_ctrl , compressed_model = create_compressed_model ( model , nncf_config )
# Now use compressed_model as a usual torch.nn.Module
# to fine-tune compression parameters along with the model weights
# ... the rest of the usual PyTorch-powered training pipeline
# Export to ONNX or .pth when done fine-tuning
compression_ctrl . export_model ( "compressed_model.onnx" )
torch . save ( compressed_model . state_dict (), "compressed_model.pth" )
ПРИМЕЧАНИЕ (PyTorch) . В связи с тем, как NNCF работает внутри серверной части PyTorch, import nncf
необходимо выполнять перед любым другим импортом torch
в ваш пакет или в сторонние пакеты, которые использует ваш код. В противном случае сжатие может быть применено неполностью.
import tensorflow as tf
from nncf import NNCFConfig
from nncf . tensorflow import create_compressed_model , register_default_init_args
# Instantiate your uncompressed model
from tensorflow . keras . applications import ResNet50
model = ResNet50 ()
# Load a configuration file to specify compression
nncf_config = NNCFConfig . from_json ( "resnet50_imagenet_rb_sparsity.json" )
# Provide dataset for compression algorithm initialization
representative_dataset = tf . data . Dataset . list_files ( "/path/*.jpeg" )
nncf_config = register_default_init_args ( nncf_config , representative_dataset , batch_size = 1 )
# Apply the specified compression algorithms to the model
compression_ctrl , compressed_model = create_compressed_model ( model , nncf_config )
# Now use compressed_model as a usual Keras model
# to fine-tune compression parameters along with the model weights
# ... the rest of the usual TensorFlow-powered training pipeline
# Export to Frozen Graph, TensorFlow SavedModel or .h5 when done fine-tuning
compression_ctrl . export_model ( "compressed_model.pb" , save_format = "frozen_graph" )
Более подробное описание использования NNCF в обучающем коде см. в этом руководстве.
Чтобы быстрее приступить к сжатию с помощью NNCF, попробуйте примеры блокнотов и сценариев, представленные ниже.
Доступны готовые к использованию учебники и демонстрации блокнотов Jupyter*, объясняющие и демонстрирующие алгоритмы сжатия NNCF для оптимизации моделей для вывода с помощью OpenVINO Toolkit:
Название учебника по ноутбуку | Алгоритм сжатия | Бэкэнд | Домен |
---|---|---|---|
BERT-квантование | Квантование после обучения | ОпенВИНО | НЛП |
Квантование модели сегментации MONAI | Квантование после обучения | ОпенВИНО | Сегментация |
Квантование модели PyTorch | Квантование после обучения | PyTorch | Классификация изображений |
Квантование с контролем точности | Квантование после обучения с контролем точности | ОпенВИНО | Преобразование речи в текст, Обнаружение объектов |
Сжатие времени обучения PyTorch | Сжатие времени обучения | PyTorch | Классификация изображений |
Сжатие времени обучения TensorFlow | Сжатие времени обучения | Тензорный поток | Классификация изображений |
Совместная обрезка, квантование и дистилляция для BERT | Совместная обрезка, квантование и дистилляция | ОпенВИНО | НЛП |
Список ноутбуков, демонстрирующих преобразование и вывод OpenVINO вместе со сжатием NNCF для моделей из различных областей:
Демо-модель | Алгоритм сжатия | Бэкэнд | Домен |
---|---|---|---|
YOLOv8 | Квантование после обучения | ОпенВИНО | Обнаружение объектов, Обнаружение ключевых точек, Сегментация экземпляров |
ЭффективныйSAM | Квантование после обучения | ОпенВИНО | Сегментация изображений |
Сегментируйте любую модель | Квантование после обучения | ОпенВИНО | Сегментация изображений |
ОдинБывший | Квантование после обучения | ОпенВИНО | Сегментация изображений |
ИнструктПикс2Пикс | Квантование после обучения | ОпенВИНО | Изображение к изображению |
КЛИП | Квантование после обучения | ОпенВИНО | Преобразование изображения в текст |
БЛИП | Квантование после обучения | ОпенВИНО | Преобразование изображения в текст |
Модель скрытой согласованности | Квантование после обучения | ОпенВИНО | Преобразование текста в изображение |
Монстр QR-кода ControlNet | Квантование после обучения | ОпенВИНО | Преобразование текста в изображение |
SDXL-турбо | Квантование после обучения | ОпенВИНО | Преобразование текста в изображение, Изображение к изображению |
Дистилл-Шепот | Квантование после обучения | ОпенВИНО | Преобразование речи в текст |
Шепот | Квантование после обучения | ОпенВИНО | Преобразование речи в текст |
Распознавание речи MMS | Квантование после обучения | ОпенВИНО | Преобразование речи в текст |
Исправление грамматических ошибок | Квантование после обучения | ОпенВИНО | НЛП, коррекция грамматики |
Инструкция LLM после | Сжатие веса | ОпенВИНО | НЛП, следование инструкциям |
LLM Чат-боты | Сжатие веса | ОпенВИНО | НЛП, Чат-бот |
Компактные скрипты, демонстрирующие квантование и соответствующее увеличение скорости вывода:
Пример имени | Алгоритм сжатия | Бэкэнд | Домен |
---|---|---|---|
OpenVINO MobileNetV2 | Квантование после обучения | ОпенВИНО | Классификация изображений |
OpenVINO YOLOv8 | Квантование после обучения | ОпенВИНО | Обнаружение объектов |
OpenVINO YOLOv8 QwAC | Квантование после обучения с контролем точности | ОпенВИНО | Обнаружение объектов |
Классификация аномалий OpenVINO | Квантование после обучения с контролем точности | ОпенВИНО | Классификация аномалий |
PyTorch MobileNetV2 | Квантование после обучения | PyTorch | Классификация изображений |
Твердотельный накопитель PyTorch | Квантование после обучения | PyTorch | Обнаружение объектов |
TorchFX Resnet18 | Квантование после обучения | ФакелFX | Классификация изображений |
TensorFlow MobileNetV2 | Квантование после обучения | Тензорфлоу | Классификация изображений |
ONNX MobileNetV2 | Квантование после обучения | ОННКС | Классификация изображений |
Примеры полных конвейеров, включая сжатие, обучение и вывод для задач классификации, обнаружения и сегментации:
Пример имени | Алгоритм сжатия | Бэкэнд | Домен |
---|---|---|---|
Классификация изображений PyTorch | Сжатие времени обучения | PyTorch | Классификация изображений |
Обнаружение объектов PyTorch | Сжатие времени обучения | PyTorch | Обнаружение объектов |
Семантическая сегментация PyTorch | Сжатие времени обучения | PyTorch | Семантическая сегментация |
Классификация изображений TensorFlow | Сжатие времени обучения | Тензорфлоу | Классификация изображений |
Обнаружение объектов TensorFlow | Сжатие времени обучения | Тензорфлоу | Обнаружение объектов |
Сегментация экземпляра TensorFlow | Сжатие времени обучения | Тензорфлоу | Сегментация экземпляров |
NNCF можно легко интегрировать в процессы обучения/оценки сторонних репозиториев.
Расширения обучения OpenVINO
NNCF интегрирован в OpenVINO Training Extensions в качестве бэкэнда для оптимизации модели. Вы можете обучать, оптимизировать и экспортировать новые модели на основе доступных шаблонов моделей, а также запускать экспортированные модели с помощью OpenVINO.
HuggingFace Оптимальный Intel
NNCF используется в качестве механизма сжатия в известном репозитории transformers
в HuggingFace Optimum Intel.
Подробные инструкции по установке см. в руководстве по установке.
NNCF можно установить как обычный пакет PyPI через pip:
pip install nncf
NNCF также доступен через conda:
conda install -c conda-forge nncf
Этот репозиторий протестирован на Python* 3.10.14, PyTorch* 2.5.0 (NVidia CUDA* Toolkit 12.4) и TensorFlow* 2.12.1 (NVidia CUDA* Toolkit 11.8).
Список моделей и результаты сжатия для них можно найти на нашей странице зоопарка моделей NNCF.
@ 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 для получения инструкций по внесению вклада в репозиторий NNCF.
NNCF как часть набора инструментов OpenVINO™ собирает анонимные данные об использовании с целью улучшения инструментов OpenVINO™. Вы можете отказаться в любое время, выполнив следующую команду в среде Python, где у вас установлен NNCF:
opt_in_out --opt_out
Дополнительная информация доступна по телеметрии OpenVINO.