主要功能 • 安裝 • 文件 • 使用 • 教學與範例 • 第三方整合 • Model Zoo
神經網路壓迫框架 (NNCF) 提供了一套訓練後和訓練時演算法,用於優化 OpenVINO™ 中神經網路的推理,同時將精確度下降降至最低。
NNCF 旨在與 PyTorch、TorchFX、TensorFlow、ONNX 和 OpenVINO™ 的模型搭配使用。
NNCF 提供了演示壓縮演算法在不同用例和模型中的用法的範例。在 NNCF Model Zoo 頁面上查看使用 NNCF 支援的範例可實現的壓縮結果。
該框架被組織為一個 Python* 包,可以在獨立模式下建置和使用。框架架構是統一的,可以輕鬆為 PyTorch 和 TensorFlow 深度學習框架添加不同的壓縮演算法。
壓縮演算法 | 開放VINO | 火炬 | 火炬FX | TensorFlow | 奧恩克斯 |
---|---|---|---|---|---|
訓練後量化 | 支援 | 支援 | 實驗性的 | 支援 | 支援 |
權重壓縮 | 支援 | 支援 | 實驗性的 | 不支援 | 不支援 |
活化稀疏性 | 不支援 | 實驗性的 | 不支援 | 不支援 | 不支援 |
壓縮演算法 | 火炬 | TensorFlow |
---|---|---|
量化意識訓練 | 支援 | 支援 |
混合精度量化 | 支援 | 不支援 |
稀疏性 | 支援 | 支援 |
過濾器修剪 | 支援 | 支援 |
運動修剪 | 實驗性的 | 不支援 |
注意:對 TensorFlow 模型的支援有限。僅支援使用 Sequential 或 Keras Function 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 pipeline 的範例,其中可以微調模型權重和壓縮參數以實現更高的精度。
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 工具包進行推理:
筆記本教學名稱 | 壓縮演算法 | 後端 | 領域 |
---|---|---|---|
BERT 量化 | 訓練後量化 | 開放VINO | 自然語言處理 |
MONAI 分割模型量化 | 訓練後量化 | 開放VINO | 分割 |
PyTorch 模型量化 | 訓練後量化 | 火炬 | 影像分類 |
具有精度控制的量化 | 具有精度控制的訓練後量化 | 開放VINO | 語音轉文本, 物體偵測 |
PyTorch 訓練時間壓縮 | 訓練時間壓縮 | 火炬 | 影像分類 |
TensorFlow 訓練時間壓縮 | 訓練時間壓縮 | 張量流 | 影像分類 |
BERT 的聯合剪枝、量化和蒸餾 | 聯合剪枝、量化與蒸餾 | 開放VINO | 自然語言處理 |
演示 OpenVINO 轉換和推理以及針對不同領域模型的 NNCF 壓縮的筆記本清單:
演示模型 | 壓縮演算法 | 後端 | 領域 |
---|---|---|---|
YOLOv8 | 訓練後量化 | 開放VINO | 物體檢測, 關鍵點檢測, 實例分割 |
高效率SAM | 訓練後量化 | 開放VINO | 影像分割 |
分段任何模型 | 訓練後量化 | 開放VINO | 影像分割 |
前任 | 訓練後量化 | 開放VINO | 影像分割 |
指導Pix2Pix | 訓練後量化 | 開放VINO | 影像到影像 |
夾子 | 訓練後量化 | 開放VINO | 圖像到文字 |
BLIP | 訓練後量化 | 開放VINO | 圖像到文字 |
潛在一致性模型 | 訓練後量化 | 開放VINO | 文字轉圖像 |
ControlNet QR 碼怪物 | 訓練後量化 | 開放VINO | 文字轉圖像 |
SDXL-渦輪 | 訓練後量化 | 開放VINO | 文字到圖像, 影像到影像 |
蒸餾耳語 | 訓練後量化 | 開放VINO | 語音轉文本 |
耳語 | 訓練後量化 | 開放VINO | 語音轉文本 |
彩信語音識別 | 訓練後量化 | 開放VINO | 語音轉文本 |
語法錯誤糾正 | 訓練後量化 | 開放VINO | NLP、語法糾正 |
LLM指令遵循 | 重量壓縮 | 開放VINO | NLP,指令遵循 |
LLM 聊天機器人 | 重量壓縮 | 開放VINO | NLP、聊天機器人 |
示範量化和相應推理速度提升的緊湊腳本:
範例名稱 | 壓縮演算法 | 後端 | 領域 |
---|---|---|---|
OpenVINO MobileNetV2 | 訓練後量化 | 開放VINO | 影像分類 |
OpenVINO YOLOv8 | 訓練後量化 | 開放VINO | 物體偵測 |
OpenVINO YOLOv8 QwAС | 具有精度控制的訓練後量化 | 開放VINO | 物體偵測 |
OpenVINO 異常分類 | 具有精度控制的訓練後量化 | 開放VINO | 例外分類 |
PyTorch MobileNetV2 | 訓練後量化 | 火炬 | 影像分類 |
PyTorch SSD | 訓練後量化 | 火炬 | 物體偵測 |
TorchFX Resnet18 | 訓練後量化 | 火炬FX | 影像分類 |
TensorFlow MobileNetV2 | 訓練後量化 | TensorFlow | 影像分類 |
ONNX MobileNetV2 | 訓練後量化 | 奧恩克斯 | 影像分類 |
完整管道的範例,包括用於分類、檢測和分割任務的壓縮、訓練和推理:
範例名稱 | 壓縮演算法 | 後端 | 領域 |
---|---|---|---|
PyTorch 影像分類 | 訓練時間壓縮 | 火炬 | 影像分類 |
PyTorch 物件偵測 | 訓練時間壓縮 | 火炬 | 物體偵測 |
PyTorch 語意分割 | 訓練時間壓縮 | 火炬 | 語意分割 |
TensorFlow 影像分類 | 訓練時間壓縮 | TensorFlow | 影像分類 |
TensorFlow 物件偵測 | 訓練時間壓縮 | TensorFlow | 物體偵測 |
TensorFlow 實例分割 | 訓練時間壓縮 | TensorFlow | 實例分割 |
NNCF 可以輕鬆整合到第三方儲存庫的培訓/評估管道中。
OpenVINO 培訓擴展
NNCF 作為模型最佳化後端整合到 OpenVINO Training Extensions 中。您可以根據可用的模型模板訓練、最佳化和匯出新模型,以及使用 OpenVINO 運行導出的模型。
HuggingFace 最佳英特爾
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* 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 }
}
有關 NNCF 儲存庫貢獻的指南,請參閱 CONTRIBUTING.md 檔案。
NNCF 作為 OpenVINO™ 工具套件的一部分,收集匿名使用數據,以改進 OpenVINO™ 工具。您可以隨時透過在安裝了 NNCF 的 Python 環境中執行以下命令來選擇退出:
opt_in_out --opt_out
有關 OpenVINO 遙測的更多資訊。