ラベル open3d の投稿を表示しています。 すべての投稿を表示
ラベル open3d の投稿を表示しています。 すべての投稿を表示

2021年12月26日日曜日

Fedora 35でOpen3D(CUDA+TensorFlow)をビルドする

目的


Fedora 35 + CUDAの環境でOpen3Dをビルドできるようにしたい。


環境


2021.12.25時点の環境は以下。
  • Fedora 35 x86_64
  • gcc version 11.2.1 20211203 (Red Hat 11.2.1-7) (GCC) 
  • CUDA 11.5 + cuDNN v8.3.1



Fedora 35で発生するビルドエラー


Open3DはLinuxディストリビューションではUbuntuが公式の環境となっている。

このため、Fedora 35だと様々なエラーが発生する。
  • サポートするPythonバージョンが一致しない。
  • GCCバージョンによる(CUDA、C++14 vs C++17)ビルド、リンク時にエラーが発生。
  • 不足しているモジュールのインストールが必要。

今回はそれらを解決・回避しながら、v0.14.0で追加されたOpen3D for TensorBoardが動作するところまでやってみる。


事前の準備


  • Python3.9のインストール


Fedora 35のPythonは3.10が標準である。
Open3DはPython 3.9までをサポートのため、ビルド時にエラーが発生する。
このため、Open3Dではなく、Fedoraに3.9をインストールし、仮想環境で対応することとする。
Python3.9のパッケージをインストール後、virtualenvwrapperで仮想環境を作成する。

sudo dnf install python3.9
mkvirtualenv --python=python3.9 open3d_p39

以降、仮想環境で作業する。


GCC 11.1のビルド


Fedora 35の場合、Open3DとTensorFlowをCUDAを有効でビルドする場合、GCCのバージョンが問題となる。
前回のブログを参照。

CUDAのコンパイラーのために、GCC11.1をソースビルドしておく。
ビルドについては上記のブログを参照。


TensorFlow 2.5のビルド


Open3D v0.14.0では、TensorFlow v2.5を期待している。

おそらく、TensorFlow v2.7でもOKな気がするが、 v2.5.2をビルドして、インストールする。

ビルド方法は前回のブログと同様なので詳細は割愛。    
ただし、v2.5.2の場合、ビルド中にRuyでビルドエラーが発生してしまう。

external/ruy/ruy/block_map.cc: In function ‘void ruy::MakeBlockMap(int, int, int, int, int, int, int, int, const ruy::CpuCacheParams&, ruy::BlockMap*)’:
external/ruy/ruy/block_map.cc:395:25: error: ‘numeric_limits’ is not a member of ‘std’
  395 |   int best_score = std::numeric_limits<int>::min();
      |                         ^~~~~~~~~~~~~~
external/ruy/ruy/block_map.cc:395:40: error: expected primary-expression before ‘int’
  395 |   int best_score = std::numeric_limits<int>::min();
      |                                        ^~~
Target //tensorflow/tools/pip_package:build_pip_package failed to build

ビルドエラーが発生した後、該当のモジュール(bazelのキャッシュにある)のソースを修正して、再度ビルドする。

<Bazelのキャッシュディレクトリ>external/ruy/ruy/block_map.cc
にヘッダのインクルードを追加する。
詳細は以下を参照。

ビルド後、pipパッケージを作成し、インストールする。


Open3Dのビルド


さて、ここまできたので後はOpen3Dのビルド。


必要なパッケージのインストール(思いつくもの)


Open3D for TensorBoardを動作させるために必要なモジュールをインストールする。
  • yapfはpipパッケージの作成の際にないとエラーとなる。
  • nodejs、jupyter関連のモジュールはTensorBoard起動時にないとエラーとなる。

sudo dnf install nodejs
sudo npm install -g yarn
pip install yapf
pip install jupyter_packaging ipywidgets jupyterlab


ソースコードのCloneと修正


現時点(2021.12.26)のOpen3Dのコードのままだとビルドできない。

一番の問題は、CUDAのコンパイラーを指定するCMAKE_CUDA_HOST_COMPILERフラグが3rdpartyモジュールで指定されないことと、3rdpartyモジュールのfaissはCMAKE_CUDA_HOST_COMPILERフラグにCMAKE_CXX_COMPILERフラグを指定していることである。

このため、3rdpartyモジュールのビルド時にビルドエラーが発生する。

3rdpartyモジュールにもCMAKE_CUDA_HOST_COMPILERフラグを指定することと、faissのCMakeLists.txtにパッチを当てる。

forkリポジトリに上記を対応したブランチを用意した。

これをつかってビルドを行う。

git clone https://github.com/NobuoTsukamoto/Open3D.git
cd Open3D
git ckeckout fedora_cuda_build
cd ..
git clone https://github.com/isl-org/Open3D-ML.git
mkdir build
cd build


CMAKE


BUILD_TENSORFLOW_OPSを有効としてビルドするのだが、そのままビルドすると、pipパッケージの作成でエラーが発生してしまう。
  • https://zenn.dev/link/comments/50c45f4523bb90

これは、TensorFlowはC++14でビルド(std=gun++14)だが、Open3DはC++17(GCC11.2のデフォルト)でビルドしているため。
tf.load_op_libraryでopen3d_tf_ops.soをロードする際にundefined symbolが発生してしまう。
詳細は以下のissueも参照。

このため、CMAKE_CXX_STANDARD=14を指定することで解決する。

上記の2つのポイントは、
  • CMAKE_CUDA_HOST_COMPILERでCUDAのコンパイラー(GCC 11.1)を指定
  • CMAKE_CXX_STANDARDでC++14を指定
である。

cmake ../Open3D \
  -DBUILD_TENSORFLOW_OPS=ON \
  -DBUILD_BENCHMARKS=ON \
  -DBUILD_CUDA_MODULE=ON \
  -DBUNDLE_OPEN3D_ML=ON \
  -DBUILD_JUPYTER_EXTENSION=ON \
  -DBUILD_WEBRTC=ON \
  -DOPEN3D_ML_ROOT=/home/xxxxx/WorkSpace/open3d/Open3D-ML/ \
  -DCMAKE_CXX_STANDARD=14 \
  -DCMAKE_CUDA_HOST_COMPILER=/home/xxxxx/gcc/11.1/bin/gcc


ビルド


あとは、ビルドしてpipパッケージを作成、インストールする。

make -j$(nproc)
sudo make install
make pip-package
pip install lib/python_package/pip_package/open3d-0.14.1+3d75e332f-cp39-cp39-manylinux_2_34_x86_64.whl


ビルド後の確認


Open3D for TensorBoardのサンプルの通りやってみる。

cd ../Open3D
python examples/python/gui/tensorboard_tensorflow.py small_scale
tensorboard --logdir demo_logs/tf

リンクを開くとTensorBoardが起動する。



OK!!!!!!!!!

2021年2月22日月曜日

Jetson (JetPack 4.5) でOpen3D + Open3D-MLをビルドする

目的


前回のブログではJetson Nano (Jetpack 4.5) でOpen3DをUSE_SYSTEM_LIBREALSENSE(インストール済みライブラリをリンク)でビルドした。

今回は、Open3D-MLも含めてビルドする。


リファレンス




準備


Pythonの仮想環境のインストール


Open3D-MLを含めてビルド後、Python パッケージをインストールすると、システムでインストール済みのpyyamlを競合してしまう。
このため、Pythonの仮想環境にインストールする。

好みでvirtualenv virtualenvwrapperを選択。
$ sudo pip3 install virtualenv virtualenvwrapper

# Add to .bashrc
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin

$ source .bashrc
$ mkvirtualenv --python=python3 open3d
$ workon open3d


TensorFlowのインストール


リファレンスを参考にインストール。
(open3d) $ sudo apt-get update
(open3d) $ sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran

(open3d) $ pip3 install numpy==1.16.1 future==0.18.2 mock==3.0.5 h5py==2.10.0 keras_preprocessing==1.1.1 keras_applications==1.0.8 gast==0.2.2 futures protobuf pybind11
(open3d) $ pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v45 tensorflow


PyTorchのインストル


こちらもフォーラムにあるとおりにインストール。
(open3d) $ wget https://nvidia.box.com/shared/static/cs3xn3td6sfgtene6jdvsxlr366m2dhq.whl -O torch-1.7.0-cp36-cp36m-linux_aarch64.whl
(open3d) $ sudo apt-get install python3-pip libopenblas-base libopenmpi-dev
(open3d) $ pip3 install Cython
(open3d) $ pip3 install numpy torch-1.7.0-cp36-cp36m-linux_aarch64.whl


Open3Dのビルド


まずは、TensorFlow、PyTorchのCXX ABIの確認。
Open3Dのドキュメントにもあるとおり、TensorFlow、PyTorch、Open3Dで異なる CXX ABIであると問題が発生する。
(open3d) $ python -c "import torch; print(torch._C._GLIBCXX_USE_CXX11_ABI)"
True
(open3d) $ python -c "import tensorflow; print(tensorflow.__cxx11_abi_flag__)"
2021-02-22 18:53:09.238147: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.2
1

CXX ABIはすべてCXX11 ABIであることが確認できた。

事前にInstall dependenciesにあるソフトウェアをインストール。

メモリを確保するため、CUIモードで作業。
(open3d) $ sudo systemctl set-default multi-user.target
(open3d) $ sudo reboot

あとは、ビルドするだけ。
CMakeのオプションで注意する点は以下。
  • BUILD_CUDA_MODULEをON
  • GLIBCXX_USE_CXX11_ABIをON
  • BUNDLE_OPEN3D_MLをONにして、OPEN3D_ML_ROOTにOpen3D-MLのパスを指定
  • BUILD_TENSORFLOW_OPS、BUILD_PYTORCH_OPSをON
  • make pip-packageする前にyapfパッケージをpipでインストールする
    (なぜかmakeで失敗する。たぶん、requirements.txtに必要?)
$ workon open3d
(open3d) $ git clone --recursive https://github.com/intel-isl/Open3D
(open3d) $ git clone https://github.com/intel-isl/Open3D-ML.git
(open3d) $ cd Open3D/
(open3d) $ mkdir build && cd build
(open3d) $ cmake \
    -DPYTHON_EXECUTABLE=$(which python3) \
    -DBUILD_SHARED_LIBS=ON \
    -DBUILD_BENCHMARKS=ON \
    -DBUILD_CUDA_MODULE=ON \
    -DBUILD_CACHED_CUDA_MANAGER=ON \
    -DBUILD_GUI=ON \
    -DGLIBCXX_USE_CXX11_ABI=ON \
    -DBUILD_RPC_INTERFACE=ON \
    -DBUILD_TENSORFLOW_OPS=ON \
    -DBUILD_PYTORCH_OPS=ON \
    -DBUNDLE_OPEN3D_ML=ON \
    -DOPEN3D_ML_ROOT=../../Open3D-ML \
    -DCMAKE_BUILD_TYPE=Release \
    ..
(open3d) $ make -j 3 
(open3d) $ sudo make install
(open3d) $ pip install yapf
(open3d) $ sudo make pip-package
(open3d) $ pip install /home/jetson/Open3D/build/lib/python_package/pip_package/open3d-0.12.0+408d9d0a-cp36-cp36m-linux_aarch64.whl


確認


GUIモードに戻して、Window managerをLXDEに変更する(使えるメモリを増やすため)。
$ sudo systemctl set-default graphical.target
$ sudo reboot

その後、Open3D-MLのサンプルを動作させてみる。

ただ、Jetson Nanoのメモリ(4GB)では不足しているので
  • モデルはKPConvのみをロード
  • データも1種類(000700)だけロード
するように変更して実行する。



表示まで1、2分待ってなんとか動いた〜😅
(サンプルはPyTorchのモデルを実行するみたい。TensorFlowはどうだろうか?)

Jetson AGX XavierやJetson Xavier NXとかだとフルで動かせるのかな?

Open3DをUSE_SYSTEM_LIBREALSENSE(インストール済みライブラリをリンク)でビルドする

 目的


Open3DはRealSense SDK(librealsense)が組み込まれている。

ソースビルドした際、デフォルトではlibrealsenseをローカルでビルドし、静的リンクしている。Open3DのビルドオプションはFORCE_RSUSB_BACKEND=ONであったりするため、できればpre-install済みのバイナリを使いたい場合もある。

ビルド時に「USE_SYSTEM_LIBREALSENSE」を指定すればpre-install済みのバイナリをリンクするはずなのだが、実際には動作していないことがわかった。

このため、CMakeを修正し、「USE_SYSTEM_LIBREALSENSE」でpre-install済みのlibrealsenseをリンクするように対応する。


動機


前回のブログ「Jetson Nano(JetPack 4.5)でlibrealsenseをソースビルドする」でRealSense SDKをソースビルドしてインストールした。

このlibrealsenseを使ってOpen3DのRealSense IFを使ってみたかった。


リファレンス




手順


Open3Dに出したPull requestはマージされたのでcommit 41fcfdc 以降でビルドすればOK。

前回のブログのJetson Nano(librealsenseをソースビルドしてインストール)でビルドした(x86のUbuntuでも確認済み)。

Jetson Nanoの場合は、ARM supportの手順に従ってビルドする。
cmakeの際に
  • 「BUILD_LIBREALSENSE」と「USE_SYSTEM_LIBREALSENSE」をONにする。
  • 「GLIBCXX_USE_CXX11_ABI」をONにする。
    フラグをOFFにするとOpen3DとlibrealsenseのC++ ABIの違いで#2985の問題が発生する。
    このため、GLIBCXX_USE_CXX11_ABI=OFFを指定するとUSE_SYSTEM_LIBREALSENSEはOFFにしている。

$ git clone --recursive https://github.com/intel-isl/Open3D
$ cd Open3D
$ mkdir build && cd build
$ cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=ON \
    -DBUILD_CUDA_MODULE=OFF \
    -DBUILD_GUI=ON \
    -DPYTHON_EXECUTABLE=$(which python3) \
    -DBUILD_LIBREALSENSE=ON \
    -DUSE_SYSTEM_LIBREALSENSE=ON \
    -DGLIBCXX_USE_CXX11_ABI=ON
    ..
$ make -j3
$ sudo make install
$ sudo make install-pip-package


動作確認


Jetson Nanoで確認。

Pythonで接続したRealSense(L515)を認識していること。
$ python
Python 3.6.9 (default, Oct  8 2020, 12:12:24) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import open3d as o3d
>>> o3d.t.io.RealSenseSensor.list_devices()
[Open3D INFO] [0] Intel RealSense L515: f0220613
[Open3D INFO] 	depth_resolution: [320,240]
[Open3D INFO] 	depth_format: [RS2_FORMAT_Z16]
[Open3D INFO] 	visual_preset: [RS2_L500_VISUAL_PRESET_CUSTOM | RS2_L500_VISUAL_PRESET_DEFAULT | RS2_L500_VISUAL_PRESET_LOW_AMBIENT | RS2_L500_VISUAL_PRESET_MAX_RANGE | RS2_L500_VISUAL_PRESET_NO_AMBIENT | RS2_L500_VISUAL_PRESET_SHORT_RANGE]
[Open3D INFO] 	color_fps: [15 | 30 | 6]
[Open3D INFO] 	depth_fps: [30]
[Open3D INFO] 	color_resolution: [640,480]
[Open3D INFO] 	color_format: [RS2_FORMAT_BGR8 | RS2_FORMAT_BGRA8 | RS2_FORMAT_RGB8 | RS2_FORMAT_RGBA8 | RS2_FORMAT_Y16 | RS2_FORMAT_YUYV]
[Open3D INFO] Open3D only supports synchronized color and depth capture (color_fps = depth_fps).
True
>>> 

RealSenseRecorderのサンプルが動作すること。

やった〜!
PRもマージされて、Open3DのContributorになったぞ〜!!

2018年3月24日土曜日

Open3Dを動かしてみる

最近、話題のOpen3Dをビルドしてみた。
DesktopPC(Ryzen 1700)とRaspberry pi 3で動作させてみた。

ビルド方法

チュートリアルに書かれてある通りにビルド
$ git clone https://github.com/IntelVCL/Open3D
$ ./scripts/install-deps-ubuntu.sh
$ mkdir build
$ cd build
$ cmake ../src
$ make -j

Tutorial/Basicのコードを動かしてみる

Raspberry pi 3の場合、画面が重くてほとんど動かない。表示もおかしい。
チュートリアルのコードを実行すると
GLFW Error: X11: RandR gamma ramp support seems broken
が出力されているのでOpenGL?の問題もありそう。

手持ちの環境(Ryzen1700 と Raspberry pi 3)で処理時間を比較してみる。
処理時間の計測はPython3のtime.perf_counter()を使用。単位はすべて秒

rgbd_redwood.py


Open3D python apiRyzen 1700Raspberry pi 3
create_rgbd_image_from_color_and_depth0.0031308780.035566293
create_point_cloud_from_rgbd_image0.0031308780.146715472

rgbd_odometry.py


Open3D python apiRyzen 1700Raspberry pi 3
compute_rgbd_odometry(using RGB-D Odometery)0.7698600583.41303919
compute_rgbd_odometry(using Hybrid RGB-D Odometery)0.7833153363.615518965

odometeryの結果、RtはRyzen, Raspberry pi 3とも一致。
Ryzenの場合
Using RGB-D Odometry
[[ 9.99985161e-01 -2.24233601e-04 -5.44316453e-03 -4.82515882e-04]
 [ 1.46064327e-04  9.99896920e-01 -1.43571495e-02  2.89043658e-02]
 [ 5.44582281e-03  1.43561414e-02  9.99882115e-01  7.88078866e-04]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]
Using Hybrid RGB-D Odometry
[[ 9.99994666e-01 -1.00290832e-03 -3.10826679e-03 -3.75410519e-03]
 [ 9.64494137e-04  9.99923448e-01 -1.23356688e-02  2.54977515e-02]
 [ 3.12040039e-03  1.23326051e-02  9.99919082e-01  1.88139777e-03]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]
Raspberry pi 3の場合
[[ 9.99985161e-01 -2.24233601e-04 -5.44316453e-03 -4.82515882e-04]
 [ 1.46064327e-04  9.99896920e-01 -1.43571495e-02  2.89043658e-02]
 [ 5.44582281e-03  1.43561414e-02  9.99882115e-01  7.88078866e-04]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]
Using Hybrid RGB-D Odometry
[[ 9.99994666e-01 -1.00290832e-03 -3.10826679e-03 -3.75410519e-03]
 [ 9.64494137e-04  9.99923448e-01 -1.23356688e-02  2.54977515e-02]
 [ 3.12040039e-03  1.23326051e-02  9.99919082e-01  1.88139777e-03]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]

pointcloud.py


Open3D python apiRyzen 1700Raspberry pi 3
voxel_down_sample0.0153782820.136582671
estimate_normals0.0052679820.085729508
crop_point_cloud0.0284832150.285484762
paint_uniform_color0.0001464830.00105934

kdtree.py


Open3D python apiRyzen 1700Raspberry pi 3
KDTreeFlann0.0005339760.00671003
search_knn_vector_3d0.0000498730.000483227
search_radius_vector_3d0.0000223110.000134426

icp_registration.py


Open3D python apiRyzen 1700Raspberry pi 3
evaluate_registration0.0733231261.06074374
registration_icp
(point-to-point ICP)
1.19398570718.54412634
registration_icp
(point-to-plane ICP)
1.13801447217.36850839

Raspberry pi 3の場合、ほとんど表示されない(黒い点の集合だけ)。

いや、もっとPoint Couldのことを覚えないと。。。