在win10上cuda12+tensorrt8.6+vs2019环境下编译paddle2.6生成python包与c++推理库

paddle infer官方目前没有发布基于cuda12的c++库,为此参考https://www.paddlepaddle.org.cn/inference/user_guides/source_compile.html实现cuda12的编译安装,不料博主才边缘好自己的paddle2.6,paddle官方已经发布了cuda12.0的paddle2.6框架。但按照官网教程进行编译是有很多bug需要解决的,故此分享一下经验,避免踩坑。例如在使用paddle infer库时发现某些类的接口设置不合理,可以通过修改源码后自行编译,修改接口权限。
在这里插入图片描述

1、编译前准备

1.1 下载源码

下载源码

git clone https://github.com/PaddlePaddle/Paddle.git
cd Paddle
git checkout release/2.6

在这里插入图片描述

1.2 安装依赖项

pip install numpy protobuf wheel ninja

1.3 执行cmake命令

执行以下编译命令 ,Visual Studio 16 2019这个根据自己电脑环境进行修改,TENSORRT_ROOT按照自己配置设置,也可以删除该配置项
cmake .. -G "Visual Studio 16 2019" -A x64 -DWITH_GPU=ON -DWITH_TESTING=OFF -DON_INFER=ON -DCMAKE_BUILD_TYPE=Release -DPY_VERSION=3.8

如果本机安装了多个 CUDA,将使用最新安装的 CUDA 版本。若需要指定 CUDA 版本,则需要设置环境变量。先执行以下代码
set CUDA_TOOLKIT_ROOT_DIR=C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.2 set PATH=%CUDA_TOOLKIT_ROOT_DIR:/=\%\bin;%CUDA_TOOLKIT_ROOT_DIR:/=\%\libnvvp;%PATH%

如果本机安装了多个 Python,将自动使用最新安装的 Python 版本。若需要指定 Python 版本,则需要指定 Python 路径。则需要在cmake命令中添加以下命令
-DPYTHON_EXECUTABLE=C:\Python38\python.exe -DPYTHON_INCLUDE_DIR=C:\Python38\include -DPYTHON_LIBRARY=C:\Python38\libs\python38.lib -DWITH_UNITY_BUILD=ON
除了以上的cuda支持外,编译paddle还有一下支持项,tensorrt、onnxruntime等,具体见下图
在这里插入图片描述

2、编译中问题

2.1 python版本报错

若无以下报错,则忽略该章节

Paddle only support Python version>=3.8 now
在这里插入图片描述
如果确认自己python版本没有任何问题,参考博主的操作,将原来判断版本的代码改成以下形式
在这里插入图片描述
此时,应该会cmake成功,输出信息如下所示
在这里插入图片描述

2.2 vs2019编译

找到以下文件,双击打开
在这里插入图片描述
在vs中将配置项改成以下内容,并在ALL_BUILD处点击右键选生成,此时界面信息如下图所示
在这里插入图片描述

2.3 过程报错一

在这里插入图片描述
解决方案,将生成的common.dll拷贝出来,重新执行一遍编译
在这里插入图片描述

2.4 过程报错二

以下报错是同样是拷贝文件失误,但不清楚具体是怎么导致的
在这里插入图片描述
博主将Paddle/cmake/copyfile.py里的代码改为以下方式:

import glob
import os
import shutil
import sysdef main():src = sys.argv[1]dst = sys.argv[2]try:if os.path.isdir(src):  # copy directorypathList = os.path.split(src)dst = os.path.join(dst, pathList[-1])if not os.path.exists(dst):shutil.copytree(src, dst)print(f"first copy directory: {src} --->>> {dst}")else:shutil.rmtree(dst)shutil.copytree(src, dst)print(f"overwritten copy directory: {src} --->>> {dst}")else:  # copy file, wildcardif not os.path.exists(dst):os.makedirs(dst)srcFiles = glob.glob(src)for srcFile in srcFiles:print(f"copy file: {srcFile} --->>> {dst}")shutil.copy(srcFile, dst)except:print("拷贝失误:=====》",src,dst)raise EOFErrorif __name__ == "__main__":main()

察觉出是 拷贝失误:=====》 C:\Users\Administrator\Paddle\build\paddle\common\common.* C:\Users\Administrator\Paddle\build\paddle_inference_install_dir\paddle\lib
于是手动完成数据拷贝
在这里插入图片描述
并将Paddle/cmake/copyfile.py里的代码改为以下方式,跳过对common.*数据的拷贝。然后重新执行编译

import glob
import os
import shutil
import sysdef main():src = sys.argv[1]dst = sys.argv[2]try:if os.path.isdir(src):  # copy directorypathList = os.path.split(src)dst = os.path.join(dst, pathList[-1])if not os.path.exists(dst):shutil.copytree(src, dst)print(f"first copy directory: {src} --->>> {dst}")else:#shutil.rmtree(dst)#shutil.copytree(src, dst)print(f"overwritten copy directory: {src} --->>> {dst}")else:  # copy file, wildcardif not os.path.exists(dst):os.makedirs(dst)if "common.*" in src:returnsrcFiles = glob.glob(src)for srcFile in srcFiles:shutil.copy(srcFile, dst)print(f"copy file: {srcFile} --->>> {dst}")except:print("拷贝失误:=====》",src,dst)raise EOFErrorif __name__ == "__main__":main()

最终输出如下所示,可见编译成功
在这里插入图片描述

3、编译结果

3.1 python安装包

可以在python终端进入dist目录,然后执行pip install ./paddlepaddle_gpu-0.0.0-cp38-cp38-win_amd64.whl 安装自己编译的paddle
在这里插入图片描述

3.2 c++推理库

paddle/Include目录下包括了使用飞桨预测库需要的头文件,paddle/lib目录下包括了生成的静态库和动态库,third_party目录下包括了预测库依赖的其它库文件。
在这里插入图片描述
具体形式如官网一致

build/paddle_inference_install_dir
├── CMakeCache.txt
├── paddle
│   ├── include
│   │   ├── paddle_anakin_config.h
│   │   ├── paddle_analysis_config.h
│   │   ├── paddle_api.h
│   │   ├── paddle_inference_api.h
│   │   ├── paddle_mkldnn_quantizer_config.h
│   │   └── paddle_pass_builder.h
│   └── lib
│       ├── libpaddle_inference.a (Linux)
│       ├── libpaddle_inference.so (Linux)
│       └── libpaddle_inference.lib (Windows)
├── third_party
│   ├── boost
│   │   └── boost
│   ├── eigen3
│   │   ├── Eigen
│   │   └── unsupported
│   └── install
│       ├── gflags
│       ├── glog
│       ├── mkldnn
│       ├── mklml
│       ├── protobuf
│       ├── xxhash
│       └── zlib
└── version.txt

在使用过程中需要将dll文件的路径添加到系统环境变量中
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/329198.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

msckf-vio 跑Euroc数据集,并用evo进行评估

所需材料: Euroc数据集主页:https://projects.asl.ethz.ch/datasets/doku.php?idkmavvisualinertialdatasetsevo评估工具代码:https://github.com/MichaelGrupp/evo向msckf-vio中添加保存位姿的代码,可参考https://blog.csdn.ne…

网络通信(10)-C#TCP客户端实例

本文使用Socket在C#语言环境下完成TCP客户端的实例。 实例完成的功能: 客户端与服务器连接,实现实时刷新状态。 客户端接收服务器的数据。 客户端发送给服务器的数据。 客户端实时判定状态,断开连接后自动重连。 客户端与服务器端发送心跳包。 在VS中创建C# Winform项…

Apache Camel笔记

Apache Camel笔记 1. Apache Camel概念 Apache Camel是一个轻量级的应用集成开发框架,专注于简化集成应用的开发。它基于Enterprise Integration Patterns(企业集成模式,简称EIP)的设计理念,提供了灵活的路由和中介机制…

最新-mybatis-plus 3.5分页插件配置

mybatis-plus 3.5分页插件配置 前提 1.项目不是springboot, 是以前的常规spring项目 2.mp 从3.2升级到3.5,升级后发现原本的分页竟然不起作用了,每次查询都是查出所有 前后配置对比 jar包对比 jsqlparser我这里单独引了包,因为版本太低…

校园-智慧门禁(卡码脸)解决方案

前言 入职新公司也已经一年有余,入职后主要从事的是门禁项目,公司设计的项目是偏saas化的智慧门禁系统,目前已经在多所大学上线,以下是对该项目的个人总结复盘。 一、系统主要功能和扩展功能 可实现学校统一门禁设备管理可实现人…

maven配置国内源

中央仓库在国外,所以下载起来会⽐较慢,所以咱们选择借助国内⼀些公开的远程仓库来下载资源 接下来介绍,如何设置国内源。 1. 配置当前项目的setting 不同电脑设置的Maven路径不同。但是需要注意的是settings和repository可以修改设置为其他路径,两个路径不要有中文。 2.配置国…

Halcon区域的最大、最小灰度值min_max _gray

Halcon区域的最大、最小灰度值 除了可以使用gray_features算子提取区域中的最大与最小灰度值外,还可以使用min_max gray 算子计算区域的最大与最小灰度值,区别是后者更具灵活性。min_maxgray 算子的原理是基于灰度直方图,取波峰和谷底之间的…

大学物理实验重点——偏振光与双折射

线偏振光、椭圆偏振光、圆偏振光均可由两个频率相同、振动方向垂直、位相差恒定的线偏振光合成。 单轴晶体中,若其 o 光折射率大于 e 光折射率,也即 o 光传播速度小于 e 光传播速度,称之为负晶体,反之为正晶体。 o光和e光…

【Java】设计模式之两阶段终止

两阶段终止 两阶段终止,即Two Phase Termination。是用来终止线程的套路。 它的思想是,如何在一个线程T1中优雅地终止线程T2?这里的【优雅】指的是给T2一个料理后事的机会。 错误思路: 使用stop方法。stop 方法会真正杀死线程…

【Kubernetes】认证授权RBAC (二)

认证授权RBAC 一、资源引用方式1.1、通过资源名称的字符串引用【1】创建role,与sa绑定【2】创建pod,与sa关联【3】验证 1.2、通过名称(ResourceName)引用 二、常见案例2.1、常见角色(role)授权的案例2.2、常见的sa授权案例2.3、常…

浅析Attention

本质: Attention机制的本质来自于人类视觉注意力机制。人们在看东西的时候一般不会从头看到尾全部都看,往往只会根据需求观察注意特定的一部分。简单来说,就是一种权重参数的分配机制,目标是协助模型捕捉重要信息。 原理&#x…

前端-基础 常用标签-超链接标签( 锚点链接 )

锚点链接 : 点击链接,可以快速定位到 页面中的某个位置 如果不好理解,讲一个例子,您就马上明白了 >>> 这个是 刘德华的百度百科 ,可以看到,页面里面有很多内容,那就得有个目录了 …