栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

使用cmake在虚拟环境下编译demon lmbspecialops遇到的问题及解决

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用cmake在虚拟环境下编译demon lmbspecialops遇到的问题及解决

  需要使用demon网络来跑深度图和相机位姿,其github上有详细的build教程,如下图所示:

  但是由于使用的cuda版本以及虚拟环境管理方式不太一样(我是用conda管理的虚拟环境,然后cuda版本是10.0),所以在make的时候连着遇到几个问题(其实就算版本和作者的一模一样,还是会出现这些错误,因为我也试过了。配深度学习环境真是太麻烦了。),在此按照遇到问题的顺序依次记录一下。
  

1. fatal error: tensorflow/core/framework/op_kernel.h: 没有那个文件或目录

详情:

fatal error: tensorflow/core/framework/op_kernel.h: 没有那个文件或目录
 #include "tensorflow/core/framework/op_kernel.h"
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

解决方法:链接
  

2. fatal error: math_functions.hpp: 没有那个文件或目录

详情:

/home/jianping/anaconda3/envs/demon-env/lib/python3.5/site-packages/tensorflow/include/unsupported/Eigen/CXX11/../../../Eigen/Core:59:14: fatal error: math_functions.hpp: 没有那个文件或目录
     #include 
              ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMake Error at lmbspecialops_generated_warp2d_cuda.cu.o.Release.cmake:220 (message):
  Error generating
  /home/jianping/workspace/demon/lmbspecialops/build/lib/CMakeFiles/lmbspecialops.dir//./lmbspecialops_generated_warp2d_cuda.cu.o

原因:
  不同cuda版本,其某些文件存放的路径也不太一样。比如这里的math_functions.hpp文件,在cuda8.0下,其路径为:/usr/local/cuda-8.0/include/math_functions.hpp,而在cuda10.0里,其路径为:/usr/local/cuda-10.0/include/crt/math_functions.hpp。参考链接。
解决方法:
  使用软链接,在终端执行命令sudo ln -s /usr/local/cuda/include/crt/math_functions.hpp /usr/local/cuda/include/math_functions.hpp即可。
  

3. fatal error: nsync_cv.h: 没有那个文件或目录

详情:

/home/jianping/anaconda3/envs/demon-env/lib/python3.5/site-packages/tensorflow/include/tensorflow/core/platform/default/mutex.h:25:10: fatal error: nsync_cv.h: 没有那个文件或目录
 #include "nsync_cv.h"
          ^~~~~~~~~~~~
compilation terminated.
CMake Error at lmbspecialops_generated_warp2d_cuda.cu.o.Release.cmake:220 (message):
  Error generating
  /home/jianping/workspace/demon/lmbspecialops/build/lib/CMakeFiles/lmbspecialops.dir//./lmbspecialops_generated_warp2d_cuda.cu.o

解决方法:
  locate一下nsync_cv.h文件,可以发现它的路径是/home/jianping/anaconda3/envs/demon-env/lib/python3.5/site-packages/tensorflow/include/external/nsync/public/nsync_cv.h。而在第一个问题处,我们已经将tensorflow/include这个路径添加到cmakelists文件里了,也就是cmake是可以找到这个路径的,那么接下来的问题就是include时候路径没有告诉完整。方法就是,将tensorflow/core/platform/default/mutex.h里的

#include "nsync_cv.h"
#include "nsync_mu.h"

  改为:

#include "external/nsync/public/nsync_cv.h"
#include "external/nsync/public/nsync_mu.h"

  

4. #error – unsupported GNU version! gcc versions later than 5 are not supported!

详情:

In file included from /usr/local/cuda/include/cuda_runtime.h:78:0,
                 from :0:
/usr/local/cuda/include/host_config.h:119:2: error: #error -- unsupported GNU version! gcc versions later than 5 are not supported!
 #error -- unsupported GNU version! gcc versions later than 5 are not supported!
  ^~~~~
In file included from /usr/local/cuda/include/cuda_runtime.h:78:0,
                 from :0:
/usr/local/cuda/include/host_config.h:119:2: error: #error -- unsupported GNU version! gcc versions later than 5 are not supported!
 #error -- unsupported GNU version! gcc versions later than 5 are not supported!
  ^~~~~

解决方法:链接
  

5. 最后

  再make,就可以成功到100%了!make时候有个小tips,可以在最后添加参数-j来使用多线程make。比如make -j8就是使用8线程。
  

6. plus一个隐秘的错误

  在执行cmake ..命令的时候,会很快速地输出一堆东西,没有明显的红色错误信息,如果你没有返回去仔细查看一下这一堆信息的话,很容易把它给忽略掉。而且问题还在于,如果你不管这个错误信息,直接继续编译下去的话,是可以成功编译好lmbspecialops的。但是在后面你使用tensorflow和这个包的时候,你还是会遇到这个错误的(亲身经历)。所以不将其解决也不是办法。报错信息如下:

-- Found PythonInterp: /home/jianping/anaconda3/envs/demon/bin/python (found version "3.5.6") 
Traceback (most recent call last):
  File "/home/jianping/anaconda3/envs/demon/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 58, in 
    from tensorflow.python.pywrap_tensorflow_internal import *
  File "/home/jianping/anaconda3/envs/demon/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 28, in 
    _pywrap_tensorflow_internal = swig_import_helper()
  File "/home/jianping/anaconda3/envs/demon/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
  File "/home/jianping/anaconda3/envs/demon/lib/python3.5/imp.py", line 243, in load_module
    return load_dynamic(name, filename, file)
  File "/home/jianping/anaconda3/envs/demon/lib/python3.5/imp.py", line 343, in load_dynamic
    return _load(spec)
importError: libcudnn.so.6: cannot open shared object file: No such file or directory

  其实直接看这里的最后这行就可以了,意思是找不到libcudnn.so.6。这个文件到底代表着什么?这里的6,感觉是和某某的版本有关。其实就是字面意思,cudnn的版本。这段报错其实是我在cuda8.0环境下编译lmbspecialops报错的(上面一开始提到的cuda10.0是昨天的事了,然后当时给我报的错是libcudnn.so.8,后来修改了tensorflow版本什么的,弄得环境有点乱,于是我又重新建了一个和作者版本配置一样的虚拟环境,打算重新配环境)。这会儿我就很纳闷了,昨天用的cuda10.0,你给我报错libcudnn.so.8,今天换成cuda8.0,报错就变成了libcudnn.so.6。???(黑人问号)难不成我还要去试试cuda6.0?然后也许你还会给我报错libcudnn.so.4?(开玩笑的)。
  其实这里的6和8,指的是cudnn的版本。由于作者并没有说明他使用的cudnn是什么版本,而cuda8.0既有cudnn6的,也有cudnn7的,然后7是比较新一些的。所以我当时安装好cuda8.0之后就直接下载了cudnn7版本的。而实际上,这里需要的是cudnn6。内鬼找到了,解决办法很简单,去cudnn官网下适用于cuda8.0的cudnn v6.0(2017年的,真的是有点古老了),如下图所示:

  下好之后解压,使用这里头的文件去替换之前7版本的就可以了。如果不知道怎么替换,参考这里吧。修改好之后再次运行cmake ..的时候,就不会再出现这个错误了!
  

7. Cannot find lmbspecialops.so

  这个问题是编译好lmbspecialops要使用它的时候报错的。报错信息是:

'Cannot find lmbspecialops.so . Set the environment variable LMBSPECIALOPS_LIB to the path to lmbspecialops.so file')
ValueError: Cannot find lmbspecialops.so . Set the environment variable LMBSPECIALOPS_LIB to the path to lmbspecialops.so file

  找不到的这个文件在lmbspecialops目录下的/build/lib目录下。一开始我以为就是程序找不到so链接文件,于是尝试了很多方法,包括但不限于修改~/.bashrc文件、修改/etc/ld.so.conf文件然后sudo /sbin/ldconfig,甚至将该so文件拷贝到usr/lib和/lib路径下。但是,都无济于事。而实际上,这段报错信息是lmbspecialops.py文件里面的,该文件的第23~29行内容如下:

if 'LMBSPECIALOPS_LIB' in os.environ:
    _lib_path = os.environ['LMBSPECIALOPS_LIB']
else:  # try to find the lib in the build directory relative to this file
    _lib_path = os.path.abspath(os.path.join(os.path.split(__file__)[0], '..', 'build', 'lib', 'lmbspecialops.so'))
if not os.path.isfile(_lib_path):
    raise ValueError(
        'Cannot find lmbspecialops.so . Set the environment variable LMBSPECIALOPS_LIB to the path to lmbspecialops.so file')

  这里,os是python自带的一个包,os.environ可以用来获取与设置系统变量,一个比较好的讲解可以点击这里。上面的语句不难理解:如果系统变量中有定义了LMBSPECIALOPS_LIB这个变量,那么获取该变量值,然后检验其是否是需要的lmbspecialops.so文件;如果没有设置该变量,则自动构建lmbspecialops.so的文件路径。如果我们没有改变编译好的lmbspecialops的文件结构,那么就算我们没有设置LMBSPECIALOPS_LIB这个环境变量,自动构建的路径应该也是能找到lmbspecialops.so文件的。可是,它没找到。问题就出在,自动构建的相对路径…/build/lib/lmbspecialops.so中的…,在环境变量里头是不认的。所以这个自动构建路径根本就没用。那么还一个问题,我在前面不是试了很多方法去添加环境变量吗,为什么也没有用呢?因为这里作者又挖了个坑,一般我们添加环境变量都是到所需文件的路径而已,而作者这里,是要把文件名都加上!
  上面已经把原因都说明了,所以解决方法就是,要么在添加名为LMBSPECIALOPS_LIB的环境变量时把文件名也加上,要么在文件内构建路径时,构建绝对路径而不是相对路径,这样就可以了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/498863.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号