pnnx/pnnx

PyTorch Neural Network eXchange

pnnx – PyTorch Neural Network eXchange

何が何なのか

  • PyTorchモデルを読み込み、計算グラフを最適化し、軽量なncnn推論エンジンで実行できるポータブルな形式や、依存関係を減らしたPyTorchスクリプトとしてエクスポートできるオープンソースツール。
  • PyTorchの演算子を反映する標準的な「PNNX」モデル表現を定義しており、torchscript、ONNX、tnn、およびネイティブなPNNX形式間での損失なしの変換を可能にしている。

なぜ注目すべきか

  • 高速性と小型化 – 不要な演算子を削除し、層を結合することで、エッジデバイス向けにより小さく高速なモデルを生成できる。
  • 依存関係の削減 – 生成されたPNNXモデルは、完全なPyTorchインストール(またはCUDA)なしでも実行可能。モバイル、組み込み、またはサーバーレスデプロイに便利。
  • 相互運用性 – 1つのコマンドでONNX-zeroやncnn形式に変換でき、フレームワーク間での移行が容易。

インストール方法

方法 サポートプラットフォーム インストール方法
Pythonパッケージ(推奨) Windows / Linux / macOS(64ビット) pip3 install pnnx
ポータブルバイナリ 同上(Python不要) 最新のGitHubリリースからzipをダウンロードし、解凍する。バイナリは即座に動作する。CUDAやPyTorchランタイムは不要。
ソースからビルド C++ツールチェインを持つ任意のプラットフォーム Tencent/ncnnリポジトリをクローンし、CMakeでtools/pnnxフォルダをビルド。libtorch/libtorchvisionのインストール先を指定する。

一般的なワークフロー

  1. エクスポート:PyTorchモデルをtorchscript(.pt)またはONNX(.onnx)ファイルに変換。
  2. pnnxを実行:入力形状を指定してそのファイルを処理。例:
    pnnx resnet18.pt inputshape=[1,3,224,224]
    
    これにより以下のアーティファクトが生成される:
    • resnet18.pnnx.param と resnet18.pnnx.bin – PNNXグラフと重み。
    • resnet18_pnnx.py – 元のソースコードなしでモデルを再構築できる純粋なPythonスクリプト。
    • resnet18.ncnn.param と resnet18.ncnn.bin – ncnnエンジンで即座に実行可能なファイル。
    • オプション:ONNX-zeroファイル(resnet18.pnnx.onnx)。
  3. 推論実行:生成されたPythonスクリプトまたはncnnランタイムを使用。
    import torch, pnnx
    model = pnnx.load('resnet18.pnnx.param', 'resnet18.pnnx.bin')
    out = model(torch.rand(1,3,224,224))
    
    または
    python resnet18_ncnn.py
    
  4. 検証:出力が元のPyTorchモデルと数値的に近いか確認(一致するはず)。

主なオプション(コマンドラインで指定)

  • fp16=1 – 重みを半精度で保存し、ファイルサイズを削減。
  • optlevel=0|1|2 – グラフの最適化の激しさを制御(0 = 最適化なし、2 = 最強)。
  • device=cpu|gpu – torchscriptモデルのトレースに使用するデバイス。
  • customop= – カスタム演算子用のコンパイル済みTorch拡張のパス。
  • moduleop= – 単一の結合演算子として保持するモジュールのリスト。

使用するべきタイミング

  • 完全なPyTorchスタックのインストールが現実的でないモバイルや組み込みプラットフォームにPyTorchモデルをデプロイする場合。
  • 1つのバージョン安定なモデルファイルが必要で、Netronなどのツールで可視化できる場合。
  • 他のフレームワーク(ONNX経由)からモデルを変換し、ncnnで効率的に実行できる形式にしたい場合。

リソース


上記のすべての詳細は、プロジェクトのREADMEから直接引用しています。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト