pnnx/pnnx
PyTorch Neural Network eXchange
pnnx – PyTorch 神经网络交换
是什么
- 一个开源工具,可让你加载 PyTorch 模型,优化其计算图,并导出为可在轻量级 ncnn 推理引擎中运行的可移植格式,或作为依赖项减少的 PyTorch 脚本。
- 定义了一种标准的“PNNX”模型表示形式,与 PyTorch 操作符一一对应,支持 torchscript、ONNX、tnn 和原生 PNNX 格式之间的无损转换。
为何值得关注
- 速度与体积 – 优化器可剪枝无用操作并融合层,为边缘设备生成更小、更快的模型。
- 依赖更少 – 生成的 PNNX 模型无需完整 PyTorch 安装(甚至无需 CUDA)即可运行,非常适合移动端、嵌入式或无服务器部署。
- 互操作性 – 通过一条命令即可将模型转换为 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,并提供输入形状。示例:
此操作将生成多个产物: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 堆栈不现实时。
- 需要一个 单一、版本稳定 的模型文件,可在 Netron 等工具中可视化时。
- 从其他框架(通过 ONNX)转换模型,以 ncnn 能高效执行的格式时。
资源
- GitHub 仓库: https://github.com/pnnx/pnnx
- 二进制发布: https://github.com/pnnx/pnnx/releases
- 可视化: 将生成的
.pnnx.param或.pnnx.onnx拖入 https://netron.app/ 以探索图结构。
以上所有细节均直接取自项目的 README。
相关
- 项目
- 项目
- 项目
- 项目
- 项目