モデル / データセット
openvinotoolkit/nncf avatar
openvinotoolkit/nncf

NNCF レビュー: OpenVINO 推論向け圧縮を PyTorch / ONNX から適用する

Neural Network Compression Framework for enhanced OpenVINO™ inference

スター 1,199フォーク 304PythonApache-2.0
GitHub

ひと目でわかる

これは何?
NNCF は学習後量子化・学習時量子化・プルーニングを共通 API で扱う Apache-2.0 の Python パッケージである。OpenVINO を推論先に据える構成では扱いやすいが、バックエンドごとに成熟度の差が大きい。
誰に向いている?
OpenVINO を推論ランタイムに据え、PyTorch か ONNX で学習済みモデルを持っているチームには、nncf.quantize の 3 ステップで PTQ を試せる点が実用的である。一方、TorchFX 経由の PTQ と重み圧縮は Experimental、Activation Sparsity は PyTorch 以外すべて Not supported であり、これらを本番前提にするのは現状で危うい。
商用利用できる?
できます。Apache-2.0 は寛容なライセンスで、著作権表示とライセンス表示を残せば、使用・改変・販売が可能です。
今もメンテナンスされている?
されています。最後のコミットは 2 日前です。
何の言語で書かれている?
主に Python です(GitHub の言語統計による)。

回答はプロジェクトの GitHub データ(最終同期:2026年9月15日)と当サイトの分析に基づくもので、法的助言ではありません。

オープンソース詳細解説

NNCF が埋める位置: 学習済みモデルと OpenVINO 推論の間

学習済みモデルをそのまま配備すると、推論のレイテンシとメモリが要件に収まらないことがある。NNCF はこの区間を埋める。README の冒頭は「post-training and training-time algorithms for optimizing inference of neural networks in OpenVINO with a minimal accuracy drop」と述べており、目的は圧縮そのものではなく OpenVINO 上での推論最適化である。

対象読者は、PyTorch、TorchFX、ONNX、OpenVINO のいずれかでモデルを持ち、配備先を OpenVINO に決めている、あるいは決めようとしているエンジニアである。README のバックエンド表記は openvino | pytorch | onnx の 3 つで、TensorFlow はこの列に現れない。TensorFlow モデルを圧縮したい読者にとって NNCF は選択肢にならない。

フレームワークは Python パッケージとして単体でビルド・利用でき、複数の圧縮アルゴリズムを追加しやすいようアーキテクチャを統一していると README は説明する。この「統一」は API の見た目だけでなく、アルゴリズムごとの実装を差し替えられる構造を指す。

圧縮アルゴリズムの一覧とバックエンド別の成熟度

README はアルゴリズムを学習後と学習時の 2 表に分けて提示している。この分け方自体が設計思想を示す。学習後は再学習なしで適用でき、学習時はモデルの重みを更新する。

学習後の表では、Post-Training Quantization が OpenVINO / PyTorch / ONNX で Supported、TorchFX で Experimental とされる。Weights Compression も同じ並びで、TorchFX のみ Experimental である。Activation Sparsity は PyTorch で Experimental、OpenVINO と TorchFX と ONNX は Not supported と明記されている。

学習時の表は PyTorch の 1 列しかない。Quantization Aware Training、LoRA と NLS を用いる Weight-Only Quantization Aware Training、Pruning の 3 つがすべて Supported である。つまり学習時圧縮を選んだ時点でバックエンドは PyTorch に固定される。

この 2 表を並べて読むと、NNCF の重心が OpenVINO と PyTorch にあり、ONNX は学習後のみ、TorchFX は実験段階という優先順位が見える。Experimental という語は README の表記そのままで、API が変わりうることを示唆する。

nncf.quantize に至る 3 ステップとキャリブレーションの扱い

README の OpenVINO 向けサンプルは、モデル読み込み、データセット準備、変換関数の定義、nncf.Dataset の生成、nncf.quantize の呼び出しという流れを取る。データローダは torch.utils.data.DataLoader で、transform_fn が data_item から入力テンソルだけを取り出す。nncf.Dataset はこの 2 つを組にして、キャリブレーションに使う入力の供給方法を NNCF に伝える。

README は PTQ について「you only need your model and a small (~300 samples) calibration dataset」と書く。約 300 サンプルという数字は目安であり、モデルやタスクによる変動は README からは分からない。

PyTorch 向けサンプルは models.mobilenet_v2() を読み込み、同じ 3 ステップで nncf.quantize に渡す。OpenVINO 版との違いはモデルの取得元だけで、nncf.Dataset と transform_fn の役割は共通である。この共通インターフェースが README の言う「Common interface for compression methods」の実体にあたる。

PTQ の結果が品質要件を満たさない場合、README は量子化済み PyTorch モデルのファインチューニングを案内し、examples/quantization_aware_training/torch/resnet18/README.md を参照先に挙げる。PTQ で足りなければ QAT へ、という順序が想定されている。

学習時圧縮とサードパーティ統合の実際

学習時圧縮は PyTorch の学習ループに圧縮処理を組み込む。README は GPU 高速化レイヤによるファインチューニングの短縮と、分散学習のサポートを挙げている。ただし具体的な速度や短縮率は示されておらず、この点は採用判断の前に自分の環境で測るしかない。

サードパーティ統合として、README は huggingface-transformers 向けの Git パッチを挙げ、カスタム学習パイプラインに NNCF を組み込む過程を示すと説明する。パッチという形式は、上流リポジトリの変更に追随して当て直す必要があることを意味する。transformers 側の該当箇所が変わればパッチはそのままでは適用できない。

書き出しについては、PyTorch の圧縮モデルを ONNX へ、チェックポイントを SavedModel または Frozen Graph 形式へ変換し、OpenVINO ツールキットで使える状態にすると README は述べる。入力が PyTorch でも出力側は OpenVINO に寄せる、という一貫した方向性である。

Experimental と Not supported をどう読むか

最大の制約はバックエンド別の対応差である。Activation Sparsity を OpenVINO や ONNX で使いたい場合、表は Not supported と明記しており、代替経路は README には書かれていない。TorchFX で PTQ や重み圧縮を検討する場合も Experimental であり、API 互換性の保証は読み取れない。

学習時圧縮を選ぶとバックエンドは PyTorch に固定される。ONNX モデルしか持たないチームは、QAT や Pruning を使うために PyTorch 側へモデルを持ち戻す必要がある。この往復のコストは README では触れられていない。

もう一点、キャリブレーションの代表性は NNCF 側では解決されない。約 300 サンプルで統計を取る以上、そのサンプルが実運用の入力分布から外れていれば量子化後の精度は落ちる。README はサンプル数と手順を示すが、サンプリング戦略には踏み込んでいない。ここは利用者側の設計判断になる。

精度劣化の許容範囲も README は数値で示していない。「minimal accuracy drop」という表現にとどまる。

代替手段との違い: 汎用圧縮ライブラリか OpenVINO 特化か

比較対象として分かりやすいのは、学習フレームワークに付属する量子化機能である。PyTorch には torch.ao.quantization があり、量子化を PyTorch のグラフ表現のまま扱う。NNCF との違いは出力の宛先である。NNCF は OpenVINO での推論を前提に、圧縮後のモデルを OpenVINO で扱える形へ持っていくことを設計の中心に置く。

この違いは、OpenVINO を推論ランタイムに使わない構成では NNCF の利点が薄れることを意味する。ONNX Runtime や TensorRT で配備するなら、それぞれの量子化ツールチェーンのほうが素直である。NNCF の対応表も OpenVINO 列が最も充実しており、この前提を裏付けている。

もう一つの違いはアルゴリズムの選択肢である。PTQ、重み圧縮、QAT、LoRA 併用の重み量子化、Pruning を同一の nncf.Dataset と nncf.quantize 系の API で扱える点は、複数手法を試して比較する作業を軽くする。ただし学習時圧縮の対象は PyTorch に限られるため、この利点が効くのは PyTorch 利用者に限られる。

導入前に確認すべきこととライセンス

ライセンスは Apache-2.0 で、リポジトリの LICENSE にその識別子が置かれている。Apache-2.0 は特許条項を含む寛容型ライセンスだが、同梱物や依存関係全体の条件を確認する作業は利用者側に残る。ここで法的な助言はできない。

確認の順序としては、まず README の 2 表で自分のバックエンドと使いたいアルゴリズムの交点を読む。Experimental や Not supported の交点があれば、その時点で計画を組み替える。次に nncf.quantize を自分のモデルと自分のキャリブレーションセットで走らせ、精度が許容範囲に入るかを見る。README のサンプルは torchvision の ImageFolder と DataLoader を前提にしているので、入力の前処理が異なるモデルでは transform_fn の書き換えから始めることになる。

更新コストは、Experimental のアルゴリズムを使う場合に読むべき箇所が増える。リリースは v3.1.0、v3.2.0、v3.3.0 と約 2 か月間隔で並んでおり、API の変化を追う前提でバージョンを固定しておくほうが安全である。サードパーティ統合で Git パッチを使う構成なら、transformers 側の更新に合わせたパッチの当て直しが定期的な作業として発生する。

編集部の結論

OpenVINO を推論ランタイムに据え、PyTorch か ONNX で学習済みモデルを持っているチームには、nncf.quantize の 3 ステップで PTQ を試せる点が実用的である。一方、TorchFX 経由の PTQ と重み圧縮は Experimental、Activation Sparsity は PyTorch 以外すべて Not supported であり、これらを本番前提にするのは現状で危うい。TensorFlow モデルしか持たない場合も対象外である。採用前に、自分のバックエンド列の対応状況と、量子化後の精度が要件を満たすかを手元のモデルで確認したい。精度が足りなければ学習時量子化へ進む判断になるが、その前にキャリブレーション用データのサンプリング方法を見直す価値がある。

公式情報源

  1. Issues
  2. License: Apache-2.0
  3. openvinotoolkit/nncf on GitHub
  4. README
  5. Releases
コミュニティノート

コミュニティノート