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のインストール先を指定する。 |
一般的なワークフロー
- エクスポート:PyTorchモデルをtorchscript(
.pt)またはONNX(.onnx)ファイルに変換。 - 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)。
- 推論実行:生成された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 - 検証:出力が元のPyTorchモデルと数値的に近いか確認(一致するはず)。
主なオプション(コマンドラインで指定)
fp16=1– 重みを半精度で保存し、ファイルサイズを削減。optlevel=0|1|2– グラフの最適化の激しさを制御(0 = 最適化なし、2 = 最強)。device=cpu|gpu– torchscriptモデルのトレースに使用するデバイス。customop=– カスタム演算子用のコンパイル済みTorch拡張のパス。moduleop=– 単一の結合演算子として保持するモジュールのリスト。
使用するべきタイミング
- 完全なPyTorchスタックのインストールが現実的でないモバイルや組み込みプラットフォームにPyTorchモデルをデプロイする場合。
- 1つのバージョン安定なモデルファイルが必要で、Netronなどのツールで可視化できる場合。
- 他のフレームワーク(ONNX経由)からモデルを変換し、ncnnで効率的に実行できる形式にしたい場合。
リソース
- GitHubリポジトリ: https://github.com/pnnx/pnnx
- バイナリリリース: https://github.com/pnnx/pnnx/releases
- 可視化: 生成された
.pnnx.paramまたは.pnnx.onnxを https://netron.app/ にドラッグアンドドロップしてグラフを探索。
上記のすべての詳細は、プロジェクトのREADMEから直接引用しています。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト