From c77bce819a404c5ff82f9cd58440ea3ff4be2940 Mon Sep 17 00:00:00 2001 From: Raul Diaz Date: Wed, 10 Jul 2019 11:52:31 -0700 Subject: [PATCH 1/2] variables in compile scripts; added gitignore; added conda env --- .gitignore | 4 ++ point-sift.yml | 50 ++++++++++++++++++ .../tf_ops/grouping/tf_grouping_compile.sh | 8 ++- .../interpolation/tf_interpolate_compile.sh | 7 ++- .../tf_ops/interpolation/tf_interpolate_so.so | Bin 46272 -> 53424 bytes .../pointSIFT_op/tf_pointSIFT_compile.sh | 10 +++- .../tf_ops/sampling/tf_sampling_compile.sh | 9 +++- 7 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 .gitignore create mode 100644 point-sift.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3344032 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.so +*.swp +*__pycache__* +*.o diff --git a/point-sift.yml b/point-sift.yml new file mode 100644 index 0000000..539dbfd --- /dev/null +++ b/point-sift.yml @@ -0,0 +1,50 @@ +name: point-sift +channels: + - defaults +dependencies: + - _libgcc_mutex=0.1=main + - binutils_impl_linux-64=2.31.1=h6176602_1 + - binutils_linux-64=2.31.1=h6176602_7 + - ca-certificates=2019.5.15=0 + - certifi=2019.6.16=py36_0 + - gcc_impl_linux-64=7.3.0=habb00fd_1 + - gcc_linux-64=7.3.0=h553295d_7 + - gxx_impl_linux-64=7.3.0=hdf63c60_1 + - gxx_linux-64=7.3.0=h553295d_7 + - libedit=3.1.20181209=hc058e9b_0 + - libffi=3.2.1=hd88cf55_4 + - libgcc-ng=9.1.0=hdf63c60_0 + - libstdcxx-ng=9.1.0=hdf63c60_0 + - ncurses=6.1=he6710b0_1 + - openssl=1.1.1c=h7b6447c_1 + - pip=19.1.1=py36_0 + - python=3.6.7=h0371630_0 + - readline=7.0=h7b6447c_5 + - setuptools=41.0.1=py36_0 + - sqlite=3.28.0=h7b6447c_0 + - tk=8.6.8=hbc83047_0 + - wheel=0.33.4=py36_0 + - xz=5.2.4=h14c3975_4 + - zlib=1.2.11=h7b6447c_3 + - pip: + - absl-py==0.7.1 + - astor==0.8.0 + - gast==0.2.2 + - google-pasta==0.1.7 + - grpcio==1.22.0 + - h5py==2.9.0 + - keras-applications==1.0.8 + - keras-preprocessing==1.1.0 + - markdown==3.1.1 + - mock==3.0.5 + - numpy==1.16.4 + - protobuf==3.8.0 + - six==1.12.0 + - tensorboard==1.13.1 + - tensorflow-estimator==1.13.0 + - tensorflow-gpu==1.13.1 + - termcolor==1.1.0 + - werkzeug==0.15.4 + - wrapt==1.11.2 +prefix: /home/raul/miniconda3/envs/point-sift + diff --git a/tf_utils/tf_ops/grouping/tf_grouping_compile.sh b/tf_utils/tf_ops/grouping/tf_grouping_compile.sh index 7d2988f..8426e6c 100755 --- a/tf_utils/tf_ops/grouping/tf_grouping_compile.sh +++ b/tf_utils/tf_ops/grouping/tf_grouping_compile.sh @@ -1,8 +1,12 @@ #/bin/bash -/usr/local/cuda-8.0/bin/nvcc tf_grouping_g.cu -o tf_grouping_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC +CUDA_PATH=/usr/local/cuda-10.0 +TF_PATH=~/miniconda3/envs/point-sift/lib/python3.6/site-packages/tensorflow +INCLUDE_PATH=$TF_PATH/include + +$CUDA_PATH/bin/nvcc tf_grouping_g.cu -o tf_grouping_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC # TF1.2 #g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_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_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I /home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 +g++ -std=c++11 tf_grouping.cpp tf_grouping_g.cu.o -o tf_grouping_so.so -shared -fPIC -I $INCLUDE_PATH -I $CUDA_PATH/include -I $INCLUDE_PATH/external/nsync/public -lcudart -L $CUDA_PATH/lib64/ -L$TF_PATH -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/tf_utils/tf_ops/interpolation/tf_interpolate_compile.sh b/tf_utils/tf_ops/interpolation/tf_interpolate_compile.sh index 2c32e11..c20a189 100755 --- a/tf_utils/tf_ops/interpolation/tf_interpolate_compile.sh +++ b/tf_utils/tf_ops/interpolation/tf_interpolate_compile.sh @@ -2,4 +2,9 @@ #g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_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_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I /home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 +CUDA_PATH=/usr/local/cuda-10.0 +TF_PATH=~/miniconda3/envs/point-sift/lib/python3.6/site-packages/tensorflow +INCLUDE_PATH=$TF_PATH/include + + +g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_so.so -shared -fPIC -I $INCLUDE_PATH -I $CUDA_PATH/include -I $INCLUDE_PATH/external/nsync/public -lcudart -L $CUDA_PATH/lib64/ -L$TF_PATH -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/tf_utils/tf_ops/interpolation/tf_interpolate_so.so b/tf_utils/tf_ops/interpolation/tf_interpolate_so.so index 35b636af85b2fb09f275f1184895c98348e97271..bfa52f42fc710f8747ab17f9d73e5f3fd74603e8 100755 GIT binary patch literal 53424 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 HzWo0SUa3H^ diff --git a/tf_utils/tf_ops/pointSIFT_op/tf_pointSIFT_compile.sh b/tf_utils/tf_ops/pointSIFT_op/tf_pointSIFT_compile.sh index 3999758..0b36bc8 100755 --- a/tf_utils/tf_ops/pointSIFT_op/tf_pointSIFT_compile.sh +++ b/tf_utils/tf_ops/pointSIFT_op/tf_pointSIFT_compile.sh @@ -1,5 +1,11 @@ #/bin/bash -/usr/local/cuda-8.0/bin/nvcc pointSIFT.cu -o pointSIFT_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC + +CUDA_PATH=/usr/local/cuda-10.0 +TF_PATH=~/miniconda3/envs/point-sift/lib/python3.6/site-packages/tensorflow +INCLUDE_PATH=$TF_PATH/include + + +$CUDA_PATH/bin/nvcc pointSIFT.cu -o pointSIFT_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC # TF1.4 -g++ -std=c++11 main.cpp pointSIFT_g.cu.o -o tf_pointSIFT_so.so -shared -fPIC -I /home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 +g++ -std=c++11 main.cpp pointSIFT_g.cu.o -o tf_pointSIFT_so.so -shared -fPIC -I $INCLUDE_PATH -I $CUDA_PATH/include -I $INCLUDE_PATH/external/nsync/public -lcudart -L $CUDA_PATH/lib64/ -L $TF_PATH -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 diff --git a/tf_utils/tf_ops/sampling/tf_sampling_compile.sh b/tf_utils/tf_ops/sampling/tf_sampling_compile.sh index 5e23cc9..a169f01 100755 --- a/tf_utils/tf_ops/sampling/tf_sampling_compile.sh +++ b/tf_utils/tf_ops/sampling/tf_sampling_compile.sh @@ -1,8 +1,13 @@ #/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 + +CUDA_PATH=/usr/local/cuda-10.0 +TF_PATH=~/miniconda3/envs/point-sift/lib/python3.6/site-packages/tensorflow +INCLUDE_PATH=$TF_PATH/include + +$CUDA_PATH/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 /home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow/include -I /usr/local/cuda-8.0/include -I /home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/home/jmydurant/anaconda3/envs/pointsift/lib/python3.5/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 +g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I $INCLUDE_PATH -I $CUDA_PATH/include -I $INCLUDE_PATH/external/nsync/public -lcudart -L $CUDA_PATH/lib64/ -L $TF_PATH -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 From 6aaa74a7582cdf5e6953f09cd245641de6d8af3f Mon Sep 17 00:00:00 2001 From: Raul Diaz Date: Tue, 16 Jul 2019 14:40:34 -0700 Subject: [PATCH 2/2] cleaned up env and scripts --- point-sift.yml | 45 ++----------------- .../tf_ops/grouping/tf_grouping_compile.sh | 2 +- .../interpolation/tf_interpolate_compile.sh | 2 +- .../pointSIFT_op/tf_pointSIFT_compile.sh | 2 +- .../tf_ops/sampling/tf_sampling_compile.sh | 2 +- 5 files changed, 7 insertions(+), 46 deletions(-) diff --git a/point-sift.yml b/point-sift.yml index 539dbfd..913a4d3 100644 --- a/point-sift.yml +++ b/point-sift.yml @@ -2,49 +2,10 @@ name: point-sift channels: - defaults dependencies: - - _libgcc_mutex=0.1=main - - binutils_impl_linux-64=2.31.1=h6176602_1 - - binutils_linux-64=2.31.1=h6176602_7 - - ca-certificates=2019.5.15=0 - - certifi=2019.6.16=py36_0 - - gcc_impl_linux-64=7.3.0=habb00fd_1 - - gcc_linux-64=7.3.0=h553295d_7 - - gxx_impl_linux-64=7.3.0=hdf63c60_1 - - gxx_linux-64=7.3.0=h553295d_7 - - libedit=3.1.20181209=hc058e9b_0 - - libffi=3.2.1=hd88cf55_4 - - libgcc-ng=9.1.0=hdf63c60_0 - - libstdcxx-ng=9.1.0=hdf63c60_0 - - ncurses=6.1=he6710b0_1 - - openssl=1.1.1c=h7b6447c_1 - - pip=19.1.1=py36_0 - - python=3.6.7=h0371630_0 - - readline=7.0=h7b6447c_5 - - setuptools=41.0.1=py36_0 - - sqlite=3.28.0=h7b6447c_0 - - tk=8.6.8=hbc83047_0 - - wheel=0.33.4=py36_0 - - xz=5.2.4=h14c3975_4 - - zlib=1.2.11=h7b6447c_3 + - pip + - python=3.6.7 - pip: - - absl-py==0.7.1 - - astor==0.8.0 - - gast==0.2.2 - - google-pasta==0.1.7 - - grpcio==1.22.0 - - h5py==2.9.0 - - keras-applications==1.0.8 - - keras-preprocessing==1.1.0 - - markdown==3.1.1 - - mock==3.0.5 - - numpy==1.16.4 - - protobuf==3.8.0 - - six==1.12.0 - - tensorboard==1.13.1 - - tensorflow-estimator==1.13.0 + - h5py - tensorflow-gpu==1.13.1 - - termcolor==1.1.0 - - werkzeug==0.15.4 - - wrapt==1.11.2 prefix: /home/raul/miniconda3/envs/point-sift diff --git a/tf_utils/tf_ops/grouping/tf_grouping_compile.sh b/tf_utils/tf_ops/grouping/tf_grouping_compile.sh index 8426e6c..544baa5 100755 --- a/tf_utils/tf_ops/grouping/tf_grouping_compile.sh +++ b/tf_utils/tf_ops/grouping/tf_grouping_compile.sh @@ -1,5 +1,5 @@ #/bin/bash -CUDA_PATH=/usr/local/cuda-10.0 +CUDA_PATH=/usr/local/cuda TF_PATH=~/miniconda3/envs/point-sift/lib/python3.6/site-packages/tensorflow INCLUDE_PATH=$TF_PATH/include diff --git a/tf_utils/tf_ops/interpolation/tf_interpolate_compile.sh b/tf_utils/tf_ops/interpolation/tf_interpolate_compile.sh index c20a189..48ed0c3 100755 --- a/tf_utils/tf_ops/interpolation/tf_interpolate_compile.sh +++ b/tf_utils/tf_ops/interpolation/tf_interpolate_compile.sh @@ -2,7 +2,7 @@ #g++ -std=c++11 tf_interpolate.cpp -o tf_interpolate_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 -CUDA_PATH=/usr/local/cuda-10.0 +CUDA_PATH=/usr/local/cuda TF_PATH=~/miniconda3/envs/point-sift/lib/python3.6/site-packages/tensorflow INCLUDE_PATH=$TF_PATH/include diff --git a/tf_utils/tf_ops/pointSIFT_op/tf_pointSIFT_compile.sh b/tf_utils/tf_ops/pointSIFT_op/tf_pointSIFT_compile.sh index 0b36bc8..8c62361 100755 --- a/tf_utils/tf_ops/pointSIFT_op/tf_pointSIFT_compile.sh +++ b/tf_utils/tf_ops/pointSIFT_op/tf_pointSIFT_compile.sh @@ -1,6 +1,6 @@ #/bin/bash -CUDA_PATH=/usr/local/cuda-10.0 +CUDA_PATH=/usr/local/cuda TF_PATH=~/miniconda3/envs/point-sift/lib/python3.6/site-packages/tensorflow INCLUDE_PATH=$TF_PATH/include diff --git a/tf_utils/tf_ops/sampling/tf_sampling_compile.sh b/tf_utils/tf_ops/sampling/tf_sampling_compile.sh index a169f01..e1ae1d7 100755 --- a/tf_utils/tf_ops/sampling/tf_sampling_compile.sh +++ b/tf_utils/tf_ops/sampling/tf_sampling_compile.sh @@ -1,6 +1,6 @@ #/bin/bash -CUDA_PATH=/usr/local/cuda-10.0 +CUDA_PATH=/usr/local/cuda TF_PATH=~/miniconda3/envs/point-sift/lib/python3.6/site-packages/tensorflow INCLUDE_PATH=$TF_PATH/include