Pointnet++ 编译 tf_ops 遇到的问题及解决办法

Pointnet++ 编译 tf_ops 遇到的问题及解决办法

pointnet++在pointnet 的基础上,提出了一个分层特征提取方法。其中涉及到采样(sampling layer),分组(grouping layer)和插值(interpolation layer)操作。再复现其代码时,最主要的问题就是集中在对上述三种操作的代码编译生成“xxxxxxx_so.so”文件。
在这里插入图片描述在这里插入图片描述

1、修改编译文件,以“/samping/tf_sampling_compile.sh”为例

  • Github 上提供的源代码如下,有TF1.2和TF1.4两种版本
#/bin/bash
/usr/local/cuda-8.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC

# TF1.2
g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0

# TF1.4
#g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /usr/local/lib/python2.7/dist-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /usr/local/lib/python2.7/dist-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/usr/local/lib/python2.7/dist-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0
  • 为了减少改动,将代码中的CUDA路径和版本改成自己环境的版本,同时将路径用变量表示,替换源代码如下:
#/bin/bash
CUDA_ROOT=/usr/local/cuda-9.0
TF_ROOT=/home/sgl/anaconda3/envs/sgl/lib/python3.7/site-packages/tensorflow
/usr/local/cuda-9.0/bin/nvcc -std=c++11 -c -o tf_sampling_g.cu.o tf_sampling_g.cu -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC

#TF xxx.xxx
g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I ${TF_ROOT}/include -I ${CUDA_ROOT}/include -I ${TF_ROOT}/include/external/nsync/public -lcudart -L ${CUDA_ROOT}/lib64/ -L ${TF_ROOT} -ltensorflow_framework -O2 #-D_GLIBCXX_USE_CXX11_ABI=0

查看CUDA版本方法:

cat /usr/local/cuda/version.txt

在这里插入图片描述
查看TensorFlow版本和路径方法:

source activate xxxx
python
import tensorflow as tf
tf.__version__
tf.__path__

在这里插入图片描述

2、编译代码

在‘ .sh ’文件夹下打开中端,激活环境

source activate xxxxx
sh tf_sampling_compile.sh

如果生成了“tf_sampling_so.so”文件则编译成功,如上过程编译其它的两种操作。

3、特别提醒

TensorFlow如果使用最新的版本 1.14.0 在编译过程会报错

/usr/bin/x86_64-linux-gnu-ld: 找不到 -ltensorflow_framework
collect2: error: ld returned 1 exit status

原因是版本1.14.0中将文件“tensorflow_framework.so”改成了“tensorflow_framework.so.1”
为了避免不必要的版本麻烦,我从新建立了一个环境版本是1.13.1,解决问题
应该只要TensorFlow版本不大于 1.14.0 上述过程应该能有所帮助

发布了27 篇原创文章 · 获赞 4 · 访问量 4542

猜你喜欢

转载自blog.csdn.net/SGL_LGS/article/details/100801061