الميزات الرئيسية • التثبيت • التوثيق • الاستخدام • البرامج التعليمية والعينات • التكامل مع طرف ثالث • حديقة الحيوان النموذجية
يوفر إطار ضغط الشبكة العصبية (NNCF) مجموعة من خوارزميات ما بعد التدريب ووقت التدريب لتحسين استدلال الشبكات العصبية في OpenVINO™ مع الحد الأدنى من انخفاض الدقة.
تم تصميم NNCF للعمل مع نماذج من PyTorch وTorchFX وTensorFlow وONNX وOpenVINO™.
توفر NNCF عينات توضح استخدام خوارزميات الضغط لحالات الاستخدام والنماذج المختلفة. شاهد نتائج الضغط التي يمكن تحقيقها باستخدام العينات التي تدعمها NNCF على صفحة NNCF Model Zoo.
تم تنظيم إطار العمل كحزمة Python* التي يمكن إنشاؤها واستخدامها في وضع مستقل. تم توحيد بنية إطار العمل لتسهيل إضافة خوارزميات ضغط مختلفة لكل من أطر التعلم العميق PyTorch وTensorFlow.
خوارزمية الضغط | أوبن فينو | باي تورش | تورشفكس | TensorFlow | اونكس |
---|---|---|---|---|---|
التكميم بعد التدريب | المدعومة | المدعومة | تجريبي | المدعومة | المدعومة |
ضغط الأوزان | المدعومة | المدعومة | تجريبي | غير معتمد | غير معتمد |
سباستيا التنشيط | غير معتمد | تجريبي | غير معتمد | غير معتمد | غير معتمد |
خوارزمية الضغط | باي تورش | TensorFlow |
---|---|---|
التدريب على الوعي الكمي | المدعومة | المدعومة |
التكميم المختلط الدقة | المدعومة | غير معتمد |
متناثرة | المدعومة | المدعومة |
تشذيب التصفية | المدعومة | المدعومة |
تقليم الحركة | تجريبي | غير معتمد |
ملاحظة : دعم محدود لنماذج TensorFlow. يتم دعم النماذج التي تم إنشاؤها باستخدام Sequential أو 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 الكمي. يمكنك العثور على مثال على خط أنابيب التدريب على Quantization-Aware لنموذج 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 )
فيما يلي مثال على خط أنابيب Accuracy Aware Quantization حيث يمكن ضبط أوزان النموذج ومعلمات الضغط بشكل دقيق لتحقيق دقة أعلى.
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) : نظرًا للطريقة التي يعمل بها 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:
اسم البرنامج التعليمي للمفكرة | خوارزمية الضغط | الخلفية | اِختِصاص |
---|---|---|---|
بيرت التكميم | التكميم بعد التدريب | أوبن فينو | البرمجة اللغوية العصبية |
MONAI تجزئة نموذج التكميم | التكميم بعد التدريب | أوبن فينو | التقسيم |
نموذج PyTorch الكمي | التكميم بعد التدريب | باي تورش | تصنيف الصور |
التكميم مع التحكم في الدقة | التكميم بعد التدريب مع التحكم في الدقة | أوبن فينو | تحويل الكلام إلى نص، كشف الكائنات |
PyTorch ضغط وقت التدريب | ضغط وقت التدريب | باي تورش | تصنيف الصور |
ضغط وقت التدريب TensorFlow | ضغط وقت التدريب | Tensorflow | تصنيف الصور |
التقليم المشترك والتكميم والتقطير لـ BERT | التقليم المشترك والتكميم والتقطير | أوبن فينو | البرمجة اللغوية العصبية |
قائمة بدفاتر الملاحظات التي توضح تحويل OpenVINO والاستدلال مع ضغط NNCF لنماذج من مجالات مختلفة:
نموذج تجريبي | خوارزمية الضغط | الخلفية | اِختِصاص |
---|---|---|---|
YOLov8 | التكميم بعد التدريب | أوبن فينو | كشف الأشياء، كشف النقاط الرئيسية، تجزئة المثيل |
كفاءةSAM | التكميم بعد التدريب | أوبن فينو | تجزئة الصورة |
شريحة أي نموذج | التكميم بعد التدريب | أوبن فينو | تجزئة الصورة |
OneFormer | التكميم بعد التدريب | أوبن فينو | تجزئة الصورة |
InstructPix2Pix | التكميم بعد التدريب | أوبن فينو | صورة إلى صورة |
مقطع | التكميم بعد التدريب | أوبن فينو | صورة إلى نص |
نقطة | التكميم بعد التدريب | أوبن فينو | صورة إلى نص |
نموذج الاتساق الكامن | التكميم بعد التدريب | أوبن فينو | تحويل النص إلى صورة |
ControlNet QR Code Monster | التكميم بعد التدريب | أوبن فينو | تحويل النص إلى صورة |
SDXL-توربو | التكميم بعد التدريب | أوبن فينو | تحويل النص إلى صورة، صورة إلى صورة |
تقطير الهمس | التكميم بعد التدريب | أوبن فينو | تحويل الكلام إلى نص |
الهمس | التكميم بعد التدريب | أوبن فينو | تحويل الكلام إلى نص |
التعرف على الكلام MMS | التكميم بعد التدريب | أوبن فينو | تحويل الكلام إلى نص |
تصحيح الأخطاء النحوية | التكميم بعد التدريب | أوبن فينو | البرمجة اللغوية العصبية، تصحيح القواعد |
تعليمات LLM التالية | ضغط الوزن | أوبن فينو | البرمجة اللغوية العصبية، التعليمات التالية |
روبوتات الدردشة LLM | ضغط الوزن | أوبن فينو | البرمجة اللغوية العصبية، الدردشة بوت |
نصوص برمجية مدمجة توضح التكميم وزيادة سرعة الاستدلال المقابلة:
اسم المثال | خوارزمية الضغط | الخلفية | اِختِصاص |
---|---|---|---|
أوبن فينو موبايل نت V2 | التكميم بعد التدريب | أوبن فينو | تصنيف الصور |
OpenVINO YOLOv8 | التكميم بعد التدريب | أوبن فينو | كشف الكائنات |
OpenVINO YOLOv8 QwAС | التكميم بعد التدريب مع التحكم في الدقة | أوبن فينو | كشف الكائنات |
تصنيف شذوذ OpenVINO | التكميم بعد التدريب مع التحكم في الدقة | أوبن فينو | تصنيف الشذوذ |
باي تورش موبايل نت V2 | التكميم بعد التدريب | باي تورش | تصنيف الصور |
باي تورش SSD | التكميم بعد التدريب | باي تورش | كشف الكائنات |
تورشفكس ريسنيت18 | التكميم بعد التدريب | تورشفكس | تصنيف الصور |
TensorFlow MobileNetV2 | التكميم بعد التدريب | TensorFlow | تصنيف الصور |
ONNX موبايل نت V2 | التكميم بعد التدريب | اونكس | تصنيف الصور |
أمثلة على المسارات الكاملة بما في ذلك الضغط والتدريب والاستدلال لمهام التصنيف والكشف والتجزئة:
اسم المثال | خوارزمية الضغط | الخلفية | اِختِصاص |
---|---|---|---|
تصنيف الصور PyTorch | ضغط وقت التدريب | باي تورش | تصنيف الصور |
كشف كائن PyTorch | ضغط وقت التدريب | باي تورش | كشف الكائنات |
PyTorch التقسيم الدلالي | ضغط وقت التدريب | باي تورش | التقسيم الدلالي |
تصنيف الصور TensorFlow | ضغط وقت التدريب | TensorFlow | تصنيف الصور |
كشف كائن TensorFlow | ضغط وقت التدريب | TensorFlow | كشف الكائنات |
تجزئة مثيل TensorFlow | ضغط وقت التدريب | TensorFlow | تجزئة المثيل |
يمكن دمج NNCF بسهولة في مسارات التدريب/التقييم لمستودعات الطرف الثالث.
ملحقات تدريب OpenVINO
تم دمج NNCF في ملحقات تدريب OpenVINO كواجهة خلفية لتحسين النموذج. يمكنك تدريب النماذج الجديدة وتحسينها وتصديرها استنادًا إلى قوالب النماذج المتوفرة، بالإضافة إلى تشغيل النماذج المصدرة باستخدام OpenVINO.
HuggingFace الأمثل إنتل
يتم استخدام NNCF كواجهة خلفية للضغط ضمن مستودع transformers
الشهير في HuggingFace Optimum Intel.
للحصول على تعليمات التثبيت التفصيلية، راجع دليل التثبيت.
يمكن تثبيت NNCF كحزمة 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 }
}
ارجع إلى ملف CONTRIBUTING.md للحصول على إرشادات حول المساهمات في مستودع NNCF.
تقوم NNCF كجزء من مجموعة أدوات OpenVINO™ بجمع بيانات الاستخدام المجهولة بغرض تحسين أدوات OpenVINO™. يمكنك إلغاء الاشتراك في أي وقت عن طريق تشغيل الأمر التالي في بيئة Python حيث قمت بتثبيت NNCF:
opt_in_out --opt_out
مزيد من المعلومات متاحة على القياس عن بعد OpenVINO.