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 上述过程应该能有所帮助