Ubuntu上源码编译pnnx与libtorch

释放双眼,带上耳机,听听看~!
学习如何在Ubuntu上源码编译pnnx与libtorch,用于深度学习模型部署。

欢迎关注我的公众号 [极智视界],获取我的更多经验分享

大家好,我是极智视界,本文来谈谈 pnnx与ubuntu源码编译pnnx。

邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:t.zsxq.com/0aiNxERDq

pnnx是nihui大佬在ncnn中提供的解析pytorch模型的前端parser,目的就是要逃离onnx。目前pytorch过于流行,但是对于部署的不友好性依旧存在,主流的对于pytorch模型的部署方式一般会有:

  • pytorch export onnx,然后采用onnxruntime框架进行推理 (这里需要明确的是,onnx只是一个模型表达格式,而onnxruntime是推理框架,这两个概念可能有些同学会混淆);
  • pytorch export onnx,然后转推理框架特有的格式使用专用推理框架进行推理。这种方式十分地常见,如后接tensorrt、openvino、ncnn或者大多的国产AI硬件的推理框架基本都支持前端onnx;
  • pytorch export onnx,然后进编译框架进行编译优化后再推理,如后接tvm;
  • pytorch export onnx,然后进opencv dnn模块,这样的方式使用比较简单,不过用的人应该不多;
  • pytorch export libtorch,然后采用libtorch进行部署。这种方式采用了pytorch/torch一套的生态,当然这种方式不常见,我记得我在19年的项目中采用过此方式,当然效果不是很好;

那既然有了onnx,加之已经很成熟的torch.onnx.export从pytorch导出onnx的方式了,为什么还要提出pnnx呢。原因自然是因为onnx本身存在着一些比较尴尬的问题,这些问题可能包括:

  • onnx的模型结构本身不可直接读写,这点让用户修改模型节点比较麻烦;
  • pytorch的算子更新比较快,而onnx本身的响应又比较慢,这很容易导致pytorch新出了一些算子,而onnx支持的不够好或者直接不支持;
  • onnx本身的胶水算子太多,对于模型的部署不够友好;
  • onnx opset机制可能是很多同学的槽点,已经会有不同opset中的实现不大一样的情况,所以一般都会推荐使用opset=11;
  • onnx最开始的设计者是贾扬清,所以沿用了caffe的设计思想,采用protobuf作为模型的存储格式,而protobuf有个天然的限制是不能超过2G(现在有办法可以绕过),这对于大模型时代不够友好;

细数了onnx的一些不足后,pnnx也自然呼之欲出。

下面来看看怎么在ubuntu上源码编译出pnnx。

首先去官网下载libtorch源码,cpu版的就行。

链接:pytorch.org/

Ubuntu上源码编译pnnx与libtorch

获取到下载链接后可以直接用wget进行下载。

wget https://download.pytorch.org/libtorch/cpu/libtorch-shared-with-deps-2.0.0%2Bcpu.zip

# 解压
unzip libtorch-shared-with-deps-2.0.0%2Bcpu.zip

# 生成libtorch文件夹

下载pnnx源码,现在的pnnx已经迁到了ncnn里,作为ncnn/tools中的一个工具,所以直接拉pnnx源码就行。

git clone https://github.com/Tencent/ncnn.git

cd ncnn/tools/pnnx/build

# 开始编译
cmake -DCMAKE_INSTALL_PREFIX=install -DTorch_INSTALL_DIR=/path/to/libtorch ..
# 编译线程不要开太大,这个编译内存消耗较大
cmake --build . --config Release -j 2
# 安装
cmake --build . --config Release --target install

编译好的pnnx在 ./build/install/bin下。

cd ./build/install/bin

# 执行看一下
./pnnx

Ubuntu上源码编译pnnx与libtorch

pnnx的传参如上,使用pnnx进行模型转换的用法如下:

pnnx resnet.pt inputshape=[1,3,224,224]

其中的 resnet.pt 是pytorch模型,通过 torch.jit.trace而来。

从以上的执行方式可以分析出pnnx的使用流程是怎么样的:首先还是需要在pytorch中通过torch.jit.trace并保存.pt的序列化模型,然后进pnnx通过parser解析这个pytorch序列化后的模型。

好了,以上分享了 pnnx与ubuntu源码编译pnnx。希望我的分享能对你的学习有一点帮助。

 【公众号传送】

《极智开发 | pnnx与ubuntu源码编译pnnx》

畅享人工智能的科技魅力,让好玩的AI项目不难玩。邀请您加入我的知识星球, 星球内我精心整备了大量好玩的AI项目,皆以工程源码形式开放使用,涵盖人脸、检测、分割、多模态、AIGC、自动驾驶、工业等。不敢说会对你学习有所帮助,但一定非常好玩,并持续更新更加有趣的项目。 t.zsxq.com/0aiNxERDq

Ubuntu上源码编译pnnx与libtorch

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

CVPR 2023数据集工作汇总

2023-12-13 15:36:14

AI教程

PAI-Blade: 人工智能计算领域的推理优化利器

2023-12-13 15:45:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索