1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openvinotoolkit-prc-nncf

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

NNCF: фреймворк для сжатия нейронных сетей

NNCF (Neural Network Compression Framework) — это набор алгоритмов для оптимизации вывода нейронных сетей после обучения и во время обучения с минимальным снижением точности. Фреймворк предназначен для работы с моделями из PyTorch, TorchFX, TensorFlow, ONNX и OpenVINO.

Фреймворк организован в виде пакета Python, который можно собрать и использовать автономно. Архитектура фреймворка унифицирована, чтобы было легко добавлять различные алгоритмы сжатия как для PyTorch, так и для TensorFlow.

Основные возможности

  • Алгоритмы сжатия после обучения:

    • Посттренировочная квантизация (поддерживается для OpenVINO, PyTorch и ONNX, экспериментально для TorchFX).
    • Сжатие весов (поддерживается для PyTorch и OpenVINO).
    • Активация разреженности (экспериментально для PyTorch).
  • Алгоритмы сжатия во время тренировки:

    • Квантование с учётом тренировки (поддерживается для PyTorch и TensorFlow).
    • Смешанная точность квантования (не поддерживается для TensorFlow).
    • Разреженность (поддерживается для PyTorch и TensorFlow).
    • Отсечение фильтров (поддерживается для PyTorch и TensorFlow).
    • Отсечение движения (экспериментальное для PyTorch).

Фреймворк предоставляет образцы, демонстрирующие использование алгоритмов сжатия для различных случаев использования и моделей. Результаты сжатия, достижимые с помощью образцов на базе NNCF, можно увидеть на странице Model Zoo. Последовательный или функциональный API Keras поддерживаются.

  • Общий интерфейс для методов сжатия.
  • Ускоренные GPU слои для более быстрой настройки точной модели сжатия.
  • Поддержка распределённого обучения.
  • Патч Git для известного стороннего репозитория (huggingface-transformers) демонстрирует процесс интеграции NNCF в пользовательские обучающие конвейеры.
  • Бесшовное сочетание алгоритмов обрезки, разреженности и квантования. Пожалуйста, обратитесь к optimum-intel для примеров совместного (движущегося) сокращения, квантования и дистилляции (JPQD), сквозного от оптимизации NNCF до сжатого OpenVINO IR.
  • Экспорт моделей PyTorch в контрольные точки ONNX* и моделей TensorFlow в формат SavedModel или Frozen Graph, готовых к использованию с OpenVINO™ toolkit.
  • Поддержка обучения моделей с учётом точности через Adaptive Compression Level Training и Early Exit Training.

Документация

Эта документация содержит подробную информацию об алгоритмах и функциях 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)

Шаг 1: Инициализируем функцию преобразования

def transform_fn(data_item): images, _ = data_item return images

Шаг 2: Инициализируем NNCF Dataset

calibration_dataset = nncf.Dataset(dataset_loader, transform_fn)

Шаг 3: Экспорт модели в TorchFX

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)

Шаг 1: Инициализируем функцию преобразования

def transform_fn(data_item): images, _ = data_item return images

Шаг 2: Инициализируем NNCF Dataset

calibration_dataset = nncf.Dataset(val_dataset, transform_fn)

Шаг 3: Запускаем квантизационный пайплайн

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)

Шаг 1: Инициализируем функцию преобразования

input_name = onnx_model.graph.input[0].name def transform_fn(data_item): images, _ = data_item return {input_name: images.numpy()}

Шаг 2: Инициализируем NNCF Dataset

calibration_dataset = nncf.Dataset(dataset_loader, transform_fn)

Шаг 3: Запускаем квантизационный пайплайн

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)

Шаг 1: Инициализируем функцию преобразования

def transform_fn(data_item): images, _ = data_item return images

Шаг 2: Инициализируем NNCF Dataset

calibration_dataset = nncf.Dataset(dataset_loader, transform_fn)

Шаг 3: Запускаем квантизационный пайплайн

quantized_model = nncf.quantize(model, calibration_dataset)

Теперь используйте compressed_model как обычный torch.nn.Module

для тонкой настройки параметров сжатия вместе с весами модели

Сохраняем модули квантизации и параметры квантизированной модели

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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Python и 5 других языков
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/openvinotoolkit-prc-nncf.git
git@gitlife.ru:oschina-mirror/openvinotoolkit-prc-nncf.git
oschina-mirror
openvinotoolkit-prc-nncf
openvinotoolkit-prc-nncf
develop