主な機能 • インストール • ドキュメント • 使用法 • チュートリアルとサンプル • サードパーティの統合 • Model Zoo
Neural Network Compression Framework (NNCF) は、OpenVINO™ でのニューラル ネットワークの推論を精度の低下を最小限に抑えて最適化するための、トレーニング後およびトレーニング時のアルゴリズムのスイートを提供します。
NNCF は、PyTorch、TorchFX、TensorFlow、ONNX、OpenVINO™ のモデルと連携するように設計されています。
NNCF は、さまざまなユースケースやモデルの圧縮アルゴリズムの使用法を示すサンプルを提供します。 NNCF Model Zoo ページで、NNCF を利用したサンプルで達成可能な圧縮結果を確認してください。
このフレームワークは、スタンドアロン モードで構築して使用できる Python* パッケージとして構成されています。フレームワーク アーキテクチャは統合されており、PyTorch と TensorFlow の両方の深層学習フレームワークに異なる圧縮アルゴリズムを簡単に追加できます。
圧縮アルゴリズム | OpenVINO | パイトーチ | トーチFX | TensorFlow | ONNX |
---|---|---|---|---|---|
トレーニング後の量子化 | サポートされています | サポートされています | 実験的 | サポートされています | サポートされています |
重みの圧縮 | サポートされています | サポートされています | 実験的 | サポートされていません | サポートされていません |
活性化のスパーシティ | サポートされていません | 実験的 | サポートされていません | サポートされていません | サポートされていません |
圧縮アルゴリズム | パイトーチ | TensorFlow |
---|---|---|
量子化を意識したトレーニング | サポートされています | サポートされています |
混合精度量子化 | サポートされています | サポートされていません |
スパーシティ | サポートされています | サポートされています |
フィルタープルーニング | サポートされています | サポートされています |
動きの枝刈り | 実験的 | サポートされていません |
注: TensorFlow モデルのサポートは限定的です。 Sequential API または Keras Functional API を使用して作成されたモデルのみがサポートされます。
このドキュメントでは、NNCF への貢献に必要な NNCF アルゴリズムと関数に関する詳細情報を説明します。
NNCF の最新のユーザー ドキュメントはここから入手できます。
NNCF API ドキュメントはここにあります。
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
これは、モデルの重みと圧縮パラメータを微調整してより高い精度を達成できる、Accuracy Aware RB Sparsification パイプラインの例です。
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) : PyTorch バックエンド内での NNCF の動作方法により、 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* ノートブックのチュートリアルとデモは、OpenVINO ツールキットを使用した推論用にモデルを最適化するための NNCF 圧縮アルゴリズムを説明および表示するために利用できます。
ノートブックのチュートリアル名 | 圧縮アルゴリズム | バックエンド | ドメイン |
---|---|---|---|
BERT量子化 | トレーニング後の量子化 | OpenVINO | NLP |
MONAI セグメンテーション モデルの量子化 | トレーニング後の量子化 | OpenVINO | セグメンテーション |
PyTorch モデルの量子化 | トレーニング後の量子化 | パイトーチ | 画像の分類 |
精度制御による量子化 | 精度制御によるトレーニング後の量子化 | OpenVINO | 音声からテキストへの変換、 物体検出 |
PyTorch トレーニング時間の圧縮 | トレーニング時間の圧縮 | パイトーチ | 画像の分類 |
TensorFlow トレーニング時の圧縮 | トレーニング時間の圧縮 | テンソルフロー | 画像の分類 |
BERT の共同プルーニング、量子化、蒸留 | ジョイントプルーニング、量子化、蒸留 | OpenVINO | NLP |
さまざまなドメインのモデルに対する OpenVINO の変換と推論を NNCF 圧縮とともにデモするノートブックのリスト:
デモモデル | 圧縮アルゴリズム | バックエンド | ドメイン |
---|---|---|---|
YOLOv8 | トレーニング後の量子化 | OpenVINO | 物体検出、 キーポイント検出、 インスタンスのセグメンテーション |
効率的なSAM | トレーニング後の量子化 | OpenVINO | 画像の分割 |
何でもモデルをセグメント化する | トレーニング後の量子化 | OpenVINO | 画像の分割 |
ワンフォーマー | トレーニング後の量子化 | OpenVINO | 画像の分割 |
InstructPix2Pix | トレーニング後の量子化 | OpenVINO | 画像から画像へ |
クリップ | トレーニング後の量子化 | OpenVINO | 画像からテキストへ |
ブリップ | トレーニング後の量子化 | OpenVINO | 画像からテキストへ |
潜在的一貫性モデル | トレーニング後の量子化 | OpenVINO | テキストから画像へ |
ControlNet QR コード モンスター | トレーニング後の量子化 | OpenVINO | テキストから画像へ |
SDXLターボ | トレーニング後の量子化 | OpenVINO | テキストから画像へ、 画像から画像へ |
蒸留ウィスパー | トレーニング後の量子化 | OpenVINO | 音声からテキストへの変換 |
ささやき | トレーニング後の量子化 | OpenVINO | 音声からテキストへの変換 |
MMS音声認識 | トレーニング後の量子化 | OpenVINO | 音声からテキストへの変換 |
文法エラーの修正 | トレーニング後の量子化 | OpenVINO | NLP、文法修正 |
LLM 命令に従う | 重量圧縮 | OpenVINO | NLP、指示に従って |
LLM チャットボット | 重量圧縮 | OpenVINO | NLP、チャットボット |
量子化とそれに対応する推論速度の向上を示すコンパクトなスクリプト:
名前の例 | 圧縮アルゴリズム | バックエンド | ドメイン |
---|---|---|---|
OpenVINO MobileNetV2 | トレーニング後の量子化 | OpenVINO | 画像の分類 |
OpenVINO YOLOv8 | トレーニング後の量子化 | OpenVINO | 物体検出 |
OpenVINO YOLOv8 QwAС | 精度制御によるトレーニング後の量子化 | OpenVINO | 物体検出 |
OpenVINO 異常分類 | 精度制御によるトレーニング後の量子化 | OpenVINO | 異常の分類 |
PyTorch MobileNetV2 | トレーニング後の量子化 | パイトーチ | 画像の分類 |
PyTorch SSD | トレーニング後の量子化 | パイトーチ | 物体検出 |
トーチFX Resnet18 | トレーニング後の量子化 | トーチFX | 画像の分類 |
TensorFlow MobileNetV2 | トレーニング後の量子化 | TensorFlow | 画像の分類 |
ONNX モバイルネット V2 | トレーニング後の量子化 | ONNX | 画像の分類 |
圧縮、トレーニング、分類、検出、セグメンテーション タスクの推論を含む完全なパイプラインの例:
名前の例 | 圧縮アルゴリズム | バックエンド | ドメイン |
---|---|---|---|
PyTorch 画像分類 | トレーニング時間の圧縮 | パイトーチ | 画像の分類 |
PyTorch オブジェクト検出 | トレーニング時間の圧縮 | パイトーチ | 物体検出 |
PyTorch セマンティック セグメンテーション | トレーニング時間の圧縮 | パイトーチ | セマンティックセグメンテーション |
TensorFlow 画像分類 | トレーニング時間の圧縮 | TensorFlow | 画像の分類 |
TensorFlow オブジェクトの検出 | トレーニング時間の圧縮 | TensorFlow | 物体検出 |
TensorFlow インスタンスのセグメンテーション | トレーニング時間の圧縮 | TensorFlow | インスタンスのセグメンテーション |
NNCF は、サードパーティ リポジトリのトレーニング/評価パイプラインに簡単に統合できます。
OpenVINO トレーニング拡張機能
NNCF は、モデル最適化バックエンドとして OpenVINO Training Extensions に統合されています。利用可能なモデル テンプレートに基づいて新しいモデルをトレーニング、最適化、エクスポートしたり、エクスポートしたモデルを OpenVINO で実行したりできます。
ハギングフェイス最適インテル
NNCF は、HuggingFace Optimum Intel の有名なtransformers
リポジトリ内の圧縮バックエンドとして使用されます。
インストール手順の詳細については、インストール ガイドを参照してください。
NNCF は、pip 経由で通常の PyPI パッケージとしてインストールできます。
pip install nncf
NNCF は conda 経由でも利用できます。
conda install -c conda-forge nncf
このリポジトリは、Python* 3.10.14、PyTorch* 2.5.0 (NVidia CUDA* ツールキット 12.4)、および TensorFlow* 2.12.1 (NVidia CUDA* ツールキット 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 }
}
NNCF リポジトリへの貢献に関するガイドラインについては、CONTRIBUTING.md ファイルを参照してください。
OpenVINO™ ツールキットの一部である NNCF は、OpenVINO™ ツールを改善する目的で匿名の使用状況データを収集します。 NNCF がインストールされている Python 環境で次のコマンドを実行することで、いつでもオプトアウトできます。
opt_in_out --opt_out
詳細については、OpenVINO テレメトリをご覧ください。