DenseFusion Demo复现(30系显卡+CUDA11.1+pytorch1.8.0))

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

Ubuntu20.04下DenseFusion Demo复现(30系显卡+CUDA11.1+pytorch1.8.0))

前言

这几天想要学习并复现一个6D目标位姿检测的算法,调研发现一篇斯坦福大学李飞飞教授论文《DenseFusion: 6D Object Pose Estimation by Iterative Dense Fusion》,第一作者为上海交通大学Chen Wang。DenseFusion提出一种从RGB-D图像中估计一组已知目标6D姿态的通用框架,采用一种新颖的密集融合方法,对RGB与深度两个数据源分别进行处理。复现过程中,在笔记本(RTX 1050)上按照Demo的README文档一次通过,但是在台式机(RTX 3060)上却各种问题频出,经历四五天的百般折腾,终于跑通,这里简单记录,加深自己对pytorch框架的学习理解,同时也希望能够帮助到大家对DenseFusion的学习。

DenseFusion(pytorch=0.4.1):https://github.com/j96w/DenseFusion


提示:以下是本篇文章正文内容,下面案例可供参考

一、DenseFusion的几个pytorch版本

起初,DenseFusion构建于pytorch0.4.1版本之上,但是由于pytorch更新很快,且随着显卡进入20系、30系,低pytorch版本难以满足需求,因此DenseFusion的官方GitHub上也增添了pytorch1.0.0版本。另外,hoangcuongbk80构建了pytorch1.0.0版本,drapado构建了pytorch1.6.0版本,相应记录如下:
DenseFusion(pytorch=1.0.0):https://github.com/j96w/DenseFusion/tree/Pytorch-1.0
hoangcuongbk80(pytorch=1.0.0):https://github.com/hoangcuongbk80/Object-RPE/tree/iliad/DenseFusion
drapado(pytorch=1.6.0):https://github.com/drapado/DenseFusion-1/tree/Pytorch-1.6
但是,问题来了,30系显卡对应到cuda的版本需要11.0以上,而cuda的11.0版本通过pytorch官网可以查到至少需要pytorch版本1.7.0以上。所以,我的3060显卡和我毫无疑问共同经历了数日的各种神奇报错,在几乎把DenseFusion下Issue几乎都看完一遍以后,终于跑通!这里首先记录正确的环境配置流程,然后再附上各种报错,说明每一个步骤的原因。

二、DenseFusion的30系显卡下环境配置

1. 具体环境

考虑最新的pytorch版本可能会出现更多问题,因此我还是保守一些选择了pytorch-1.8.0版本,其他关键框架或库
的版本如下:

CUDA = 11.1
CUDNN = 8.0.5
pytorch = 1.8.0
torchvision = 0.9.0
python = 3.6.13

其他库就正常pip安装即可,要是出问题也是小问题,基本上百度或者谷歌很容易解决。由于测试需要,我选择在conda的虚拟环境下配置的环境,这样要是环境在配置过程出现各种各样的问题,直接删除重建即可。这里需要强调一下,CUDA=11.1与cudnn=8.0.5是安装在Ubuntu20.04本机下的,并非是在conda的虚拟环境下配置的!!!否则你在后续编译knn时会报错。安装方法这里附上链接,非常简单。当然,conda虚拟环境下的pytorch1.8.0的安装根据官网命令输入如下:

# CUDA 11.1
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge

2. GitHub拉取代码

这里,直接参照上面链接下载drapado构建的代码,完成这一步我们就已经能够在前人的帮助下,跨过很多神奇的坑,这里也要非常感谢他们的贡献。drapado主要工作是修改了/lib/knn/下三个文件的代码,这样保证了编译过程与后续模型训练的正确。当然,如果你是20系显卡,在与他环境配置一致情况下(CUDA=10.2),再按照他的步骤,应该也就没问题了。好的,30系显卡我们继续…

3. 编译lib下的KNN库

其实,大部分的报错原因都来自于这个KNN库,在完成上述步骤的基础上,到这里也非常简单了:

cd lib/knn
python setup.py install
cd dist
unzip knn_pytorch-0.1-py3.6-linux-x86_64.egg 
cp knn_pytorch/knn_pytorch.py ../knn_pytorch.py
cp knn_pytorch/knn_pytorch.cpython-36m-x86_64-linux-gnu.so ../knn_pytorch.cpython-36m-x86_64-linux-gnu.so

4. 模型训练

若按照上述流程,基本上不会出现问题。现在就可以愉快地开始训练模型了!直接按照官方文档README.md,在DenseFusion文件夹下输入:

./experiments/scripts/train_linemod.sh

然后,我们就可以愉快地接杯茶开始摸鱼等待了。。。
而且不出意外的话,训练将会大概在第5个迭代的时候报错:

RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method…

这时候不要慌,请随手打开/lib/loss_refiner.py文件,定位到44行knn()函数并修改如下:
在这里插入图片描述
至此,DenseFusion在Ubuntu20.04、30系显卡、pytorch=1.8.0环境下的复现就完美结束了,随手附一张训练到第37个Epoch的图片:
在这里插入图片描述
在第五个迭代因为报错而中断训练的,DenseFusion提供了恢复训练的接口,非常方便,直接打开./experiments/scripts/train_linemod.sh文件,作出部分修改如下图所是即可(–resume_posenet参数后的模型名称可在./trained_models/linemod下根据需要选择需要选择):
在这里插入图片描述

三、典型报错说明

在复现过程中,出现各种神奇报错,这里也作出整理,便于日后参考,同时也说明上述每一步骤的原因。

1. 显卡、CUDA、cudnn、pytorch、torchvison版本不匹配

报错:pred = torch.add(torch.bmm(model_points, base), points + pred_t) RuntimeError: cublas runtime error : the GPU program failed to execute at /pytorch/aten/src/THC/THCBlas.cu:441
我在前期没有注意到显卡版本的问题,在查询问题的过程中,很多人都提到了CUDA、pytorch版本要匹配的问题,也有很多人在卸载后重新安装问题得到了解决。但是因为我是直接在conda的虚拟环境下通过pytorch官网的安装命令安装的,理因不会出现这个问题,后来发现是显卡版本的问题,也就是在pytorch=1.0.0,CUDA=10.0环境,仍然无法在30系显卡下运行,这里也在GitHub上找到答案。所以,这也是我们30系显卡只能选择pytorch=1.7.0版本以上的原因

2. 没有正确编译lib/knn

报错:/code/DenseFusion-Pytorch/lib/knn/knn_pytorch.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN6caffe26detail37_typeMetaDataInstance_preallocated_10E
这里仅仅列了一个报错,其实还有很多种报错,根源也都在这。而所谓正确的编译,主要包括两个:(1) 正确的环境(显卡、CUDA、pytorch版本等);(2) 正确的编译步骤。其实编译步骤很简单,如步骤三所示即可。但是环境问题往往会被忽略!!!尤其是如果你的环境不对,编译可能并不会报错,这就导致你可能很难定位到这个问题所在了。

3. lib/knn编译出错

报错:subprocess.CalledProcessError: Command '['ninja', '-v']' returned non-zero exit status 1.g++问题,提示缺少xxx.o文件
如果仅仅在虚拟环境安装了与显卡匹配的CUDA版本,即CUDA>11.0版本,那么在对lib/knn进行编译的时候,就会产生这样的问题,起初,我是通过这里的方法进行解决,虽然能够使得knn编译成功,但是在训练过程的报错却见都没见过,我的理解是knn.o的低版本所致。解决方法就是在本机上同样安装一个CUDA11.1的环境,至此,即可编译成功并开始训练!洒花洒花。

总结

总的来说,这一次的DenseFusion的环境配置让我既痛苦又快乐,毕竟四五天的找问题差点让上周的周报都没得东西写。。。同时,总结经历此次折腾获取的经验:

  1. 30系显卡与CUDA11.0以上版本才能兼容,这是此次惨痛的教训。
  2. 遇到问题除了百度、谷歌外,确实需要格外关注GitHub上的Issue,即使好像初搜并没有搜出符合自己的问题,但是仔细找基本上你遇到的问题也都有前人经历过了!
  3. 要有格外的耐心!!!
  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值