提示:
- 如果是段错误segmentation fault可以直接看最下面
- 测试dirt是否编译成功,用
python tests/square_test.py
- 注意tensorflow-gpu和cuda的对应关系,gcc版本的对应关系其实较为随意,不过python3.7建议gcc7以上。
dirt源码https://github.com/pmh47/dirt
近期反复配置了几次dirt,每次都有不一样的错误,所以以后配置都会来记录一下所遇到的错误
error1
添加一句在csrc/CMakeLists里面(加在第二行)
set(CMAKE_CUDA_COMPILER "/usr/local/cuda/bin/nvcc")
问题解决
error2
fatal error: tensorflow/core/framework/op.h: 没有那个文件或目录
fatal error: tensorflow/core/framework/tensor.h: 没有那个文件或目录
版本的匹配问题,参照以下备注中的版本对应关系。
pip install . 的问题
使用pip install .时基本都会出现问题,可以尝试使用源码编译
cd dirt
mkdir build ; cd build
cmake ../csrc
make
cd ..
pip install -e .
进行编译
出现的问题
(pip install . 成功,测试用import dirt)
1.(测试阶段出现问题)
此情况下会出现以下问题
tensorflow.python.framework.errors_impl.NotFoundError: libtensorflow_framework.so.1: cannot open shared object file: No such file or directory
(在python3.7+tensorflow-gpu1.13.1+gcc4.8.5+CUDA10.0时出现)
解决方法
尝试更换tensorflow-gpu版本
2.(测试阶段出现问题)
此情况下会出现错误
tensorflow.python.framework.errors_impl.NotFoundError: /home/sun/anaconda3/envs/oct/lib/python3.7/site-packages/dirt/librasterise.so: undefined symbol: _ZN10tensorflow7strings8internal9CatPiecesB5cxx11ESt16initializer_listIN4absl11string_viewEE
(在python3.7+tensorflow-gpu1.15.0+gcc5.5.0+CUDA10.0时出现)
解决方法:
使用gcc5.x及以上版本
3.(测试阶段出现问题)
Error loading EGL entry points.
段错误 (核心已转储)
在(python2.7+tensorflow-gpu1.14.0+gcc4.9.3+CUDA10.1/10.0)时出现
问题的解决方法在官方文档中有提到
If you are using TensorFlow 1.14, there are some binary compatibility issues when using older versions of python (e.g. 2.7 and 3.5), due to compiler version mismatches. These result in a segfault at tensorflow::shape_inference::InferenceContext::GetAttr or similar. To resolve, either upgrade python to 3.7, or downgrade TensorFlow to 1.13, or build DIRT with gcc 4.8
4. warning
FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / ‘(1,)type’.
解决方法:
pip install numpy==1.16.0
其他
在gcc为4.x时可能会出现错误,可以尝试以下方法
把csrc文件夹下的CMakeLists.txt里set(CMAKE_CXX_FLAGS_RELEASE “${CMAKE_CXX_FLAGS_RELEASE} -ffast-math”)这句话后面加上一句add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)再重新编译就好了
来自https://github.com/pmh47/dirt/issues/3
第二次编译
第一次编译是编译成功了,不过后面在跑octopus的代码时出现了问题,作者说是dirt方面的问题,与他的代码无关,故这次用python2.7再配一次
在之前跑octopus的时候,我发现keras和tensorflow也有版本对应关系:
https://www.cnblogs.com/carle-09/p/11661261.html
后面要注意keras的版本选择
因为octopus是用py2.7写的,所以这次也准备尝试一下py2.7的环境,
(如果遇到问题2离成功就不远了,其他问题也都可以选择换版本来规避)
python | tensorflow-gpu | cuda | gcc | 直接编译 | 源码编译 |
---|---|---|---|---|---|
2.7 | 1.14.0 | 10.0 | 4.8.5 | 问题1 | 问题2* |
3.7 | 1.14.0 | 10.0 | 5.5.0 | 问题3 | |
3.7 | 1.14.0 | 10.0 | 4.8.5 | 问题4 | 问题1 |
3.7 | 1.14.0 | 10.0 | 7.5.0 | 问题5 | 问题2* |
遇到的问题
问题 | |
---|---|
1 | 编译成功,但在>>>import dirt时出现,tensorflow.python.framework.errors_impl.NotFoundError: dirt/librasterise.so: cannot open shared object file: No such file or directory |
2 | 编译成功,出现段错误(segmentation fault) |
3 | 编译成功,但在>>>import dirt时出现,tensorflow.python.framework.errors_impl.NotFoundError: libtensorflow_framework.so.1: cannot open shared object file: No such file or directory |
4 | cannot find either cuda_launch_config.h or gpu_launch_config.h |
5 | ERROR: Command errored out with exit status 1: CMake Error: The current CMakeCache.txt directory /tmp/pip-req-build-1a6sce8_/ |
最终的解决!!
其实我的问题一直都是出现在段错误上面,我也知道是libEGL的问题,但到底就是不知道应该怎么去解决,最终在dirt的issue中终于找到了可以解决的方法。
https://github.com/pmh47/dirt/issues/2
我是更改了CMakeLists的52行,将OpenGL::EGL
改为了/usr/lib/x86_64-linux-gnu/libEGL.so.1.0.0
,因为我之前在ldd dirt/librasterise.so
的时候发现我的libEGL.so指向的是/opt/github里面的一个libEGL.so,后面也将问题集中在这个范围之内。
所以先locate libEGL.so
一下,寻找正确的libEGL到底在哪,我的是在/usr/lib/x86_64-linux-gnu/里面,然后上面作者说是换成so.1.1.0,我也就换成了同样的so.1.0.0,即/usr/lib/x86_64-linux-gnu/libEGL.so.1.0.0
。之后再ldd dirt/librasterise.so
一下,发现链接确实正确了,此后再编译,用python tests/square_test.py测试,成功。
此外作者还提到了以下几种解决办法,均用于OpenGL相关的错误:
- Cmake时增加-DOpenGL_GL_PREFERENCE=GLVND
- 修改Cmakelists,将第5行修改成
find_package(OpenGL REQUIRED COMPONENTS OpenGL EGL)
,注释第9行,将42行改为target_link_libraries(rasterise PRIVATE OpenGL::OpenGL OpenGL::EGL ${Tensorflow_LIBRARY})
- Cmake时增加-D_OPENGL_LIB_PATH=/usr/lib/nvidia-384
Octopus
在跑octopus时,因为用的是python3.7,所以使用这个版本https://github.com/haohao-hu/octopus
octopus跑下来还算顺利,大多数问题基本都可以追溯到dirt的编译那里。
备注
tensorflow与gcc和cuda对应版本https://blog.csdn.net/qq_27825451/article/details/89082978
keras和tensorflow也有版本对应关系:https://www.cnblogs.com/carle-09/p/11661261.html