记录windows 下编译用于C++的Open3D CUDA 版本(特别是踩坑mkl-include-2020.1-intel_216-win-64.tar.bz2W‘ failed)
Open3D 作为点云计算在某些方面有PCL不具备的优势,为了编译支持cuda加速的版本,可以说坑都踩尽了,此处值得记录一下。下面还是直奔主题吧。
1.先科普适合自己PC的可以稳定兼容Open3D的 CUDA加速需要的软件版本
本来我想说先提前配好,但是先科普再适配其实可以少踩很多坑,可以避免不兼容又回头。
为了编译出可以兼容性较好的Open3D版本,科普千问给我的建议是:
2.根据AI的建议,那就做对应安装吧。
此处可能需要先卸载后安装,又是一顿狂操作,卸载建议从显示控制面板进入,cuda 的卸载还讲究呢,不要动显卡驱动相关。
我的PC是i5-13400H,RTX3050,安装了VisualStudio2019(开始是2015,科普以后卸载了),Cuda version 一开始是12.4,科普以后重装了,Cmake 一开始是1.18 又卸载重装了。毕竟经验有道。总之就是想捣鼓成官方反馈的兼容性好的契合。
S
3.确认自己的安装和open3D 源码
安装cuda、CmaCke、VisualStudio其实不那么难,安装完在PowerShell查阅一下版本基本搞定。此处要提的Open3D 源码下载,在网速慢的环境,真的太太太不友好了。
很多人可能直接去了open3D 的官网,然后下来zip 源码到本地。我也这样试过,百转千回以后,我又安装了Git,从git开始拉源码。但是源码还是不好拉啊,网速太不行了,能拉出来这个框架算幸运。
git clone https://github.com/isl-org/Open3D.git据说这样拉,还要刷新子模块,但是网不行啊,连不上呢。。。
那按照这样,
git clone --recursive https://github.com/isl-org/Open3D.git有点幸运(其实是换了更快的无线),这个看起来能拉到框架,但是网速还是很慢,所以此处需要去使用可以加速的镜像,还是需要去科普。总之经历重重磨难还是拉下来源码壳子了。遇到问题一定要弄清楚,现在AI求助工具有很多。
后来发现坑远不止如此,拉下来的只是个框架,里面的几十个子模块在编译的时候都要再次下载,网不好的都要手动补充。有的建议自己去提前下载放进去,有的觉得Cmake时和build时可以自动下载,实在下不了再手动。我实在没有耐心对着那长长的子模块去下载,还是先把机会交给Cmake自动吧(事实证明这样更科学,因为不需要的模块其实不用下载)。来看看最后下来的样子,总之就是源码里面牵着好多子模块呢。
此处记录一下Cmake GUI编译吧,非常重要
首先需要在源代码里建一个文件夹,可以作为生成的目标路径 如build或build_GPU,然后编译,此处要说一下,生成的整个文件夹最后会很大,要预留10GB以上的空间。
configure 以后选中平台
然后等待configure, 当报错时及时修改参数状态,需要注意的参数状态如下:
1)CUDA 模块参数要选中,算力参数需要手动加上
因为编译的是需要支持cuda的版本,cuda对应的参数要选中,而且RTX3050对应的算力是86,如果GPU不一样,此处需要先科普好,然后填上
2)关键参数设置
STATIC_WINDOWS_RUNTIME 这里最好不要选中,因为我编译的是希望可以给其他工程动态调用的,
而且 BUILD_SHARED_LIBS 一定要选上
python相关的不在我考虑的范围,关于python 模块的参数不选,如果编译python 版本估计坑也会有所不同,
还有一个模块,BUILD_WEBRTC 建议不要选,坑多,我也不需要联网优化。。。
那个MKL 和IPPICV 要选中,因为对于优化计算少不了
最后就是一直configure done 直到没有标红,就可以generate 了,generate done 可以得到一个Open3D.sln 框架的工程。通过这个框架工程我们就可以编译open3D 库。
小结:
整个cmake 的过程,首先需要安装好需要的软件环境,然后需要拉好Open3D源代码,当环境准备好了,源代码完整了,这样再开始Cmake 编译框架,编译的时候一定要查看输出和报错,及时调整,确保所有的参数设置状态合理正确。任何问题都要及时AI请求帮助。
4.基于visualStudio 编译Open3D.sln
打开工程后,在顶部设成release 工程,X64,然后生成 ALL_BUILD
(1)当报错dowloading XXXXX failed 错误
是因为网络慢或者不顺通导致子模块下载失败,需要复制报错内容中的github网址,然后手动贴到浏览器里面去下载,下载好以后,把文件拷贝到Open3D 源代码下的3rdparty_downloads文件夹中对应的子目录
记得看好下载文件的名称,应该和子目录中的文件名是一样的,只不过因为网络原因,子目录中原来的文件是0kB 或者不完整,记得一定是原样替换!
(2)一个非常诡异的错误(在open3D V0.18.0版本)
downloading ‘https://github.com/isl-org/Open3D/releases/download/v0.12.0/mkl-include-2020.1-intel_216-win-64.tar.bz2W’ failed ext_mkl_include (ExternalProjectTargets\ext_mkl_include\ext_mkl_include) E:\Open3D\build\CUSTOMBUILD 1
这个手动copy 网址下载也无效,其实是因为这个地址就是个错的,那么就需要改原来的位置吧,
找到下载的Open3D 源代码文件夹, 3rdparty\mkl\mkl.cmake打开
看看15行,最后多的那个W需要去掉,去掉以后的样子如下:
然后再去编译吧,如果下载失败就手动下载替换;每一次失败以后修改完,记得要生成ALL_BUILD,记得是生成,不是重新生成,因为后面的每次生成都是是增量编译,而重新生成就是从头开始生成。
最后,看看生成结果,ALL_BUILD 生成成功
当ALL_BUILD 生成成功以后,就生成INSTALL
鼠标选中INSTALL 右键->仅用于项目->重新生成
测试一下Open3D 加成GPU以后的输出效果~
到此时,突然觉得一切的坑和弯路都是距目标越来越近,因为最后完成了一个新的编译工作。就算网络不够通顺,就算奇奇怪怪错误一堆,甚至还三番五次因为一个报错,因为环境兼容需要从0再开始,但每一次编译都是积累和深入。
还有,在生成Open3D.sln的 ALL_BUILD项目的时候,CPU经常几乎爆满啊,要有耐心去等待和及时解决下载问题。总之Open3D 的cuda编译确实需要足够细心和耐心,今天记录到这里,每一步走过的路都作数~