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 安装路径。

典型工作流程

  1. 导出:将你的 PyTorch 模型导出为 torchscript(.pt)或 ONNX(.onnx)文件。
  2. 运行 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)。
  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 堆栈不现实时。
  • 需要一个 单一、版本稳定 的模型文件,可在 Netron 等工具中可视化时。
  • 从其他框架(通过 ONNX)转换模型,以 ncnn 能高效执行的格式时。

资源


以上所有细节均直接取自项目的 README。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目