2021年9月11日土曜日

2021.9.11の釣行

いつもの川。午前中だけ。

やろうとおもっていたところは工事中だったので、もうすこし上流。

いないかな〜と思っていたけど...

イワナ、出てきてくれた😁(このちょっと前にもイワナばらしていた😭)

もっと、写真のとり方うまくなりたい😇(このあと逃げていった...)


これはスプーンだったけど、トリコロール舞45もよかったな〜





あと、一回ぐらいかな?


もうすぐ秋かな







2021年5月1日土曜日

Fedora 34でNVIDIA GPUのコンテナーを使う(Podman)

 目的


Fedora 34でpodmanを使ってNVIDIA GPUのコンテナーを扱いたい。


環境


  • Fedora 34 x86_64
  • CUDA 11.3 + cuDNN 8.2.0
  • CPU AMD Ryzen 7 1700
  • GPU GeForce GTX 1070


参照




手順


NVIDIA Driver、CUDA、cuDNNのインストール


RPM FusionのHowtoを参考にNVIDIA Driver、CUDAのインストールを行う。
cuDNNは、NVIDIAのサイトからcuDNN v8.2のRedHat/Centos 8.1 x84_64向けのRPMをダウンロード、インストールする。理由は前回のブログを参照。


nvidia-container-toolkitのインストール


nvidia-dockerのリポジトリを追加する。Fedora向けはないためRHEL 8.3をインストールし、nvidia-container-toolkitをインストールする。

$ curl -s -L https://nvidia.github.io/nvidia-docker/rhel8.3/nvidia-docker.repo |   sudo tee /etc/yum.repos.d/nvidia-docker.repo
$ sudo dnf update
$ sudo dnf install nvidia-container-toolkit

SELinuxポリシーの変更が必要なのだが、RED HATブログにある手順ではうまくいかず、、、permissiveに変更して再起動した。


動作確認


Docker Hubからnvidia/cudaのイメージを取得して、確認する。

$ sudo su
# podman pull nvidia/cuda:11.3.0-base-ubuntu18.04
# podman run -it --rm nvidia/cuda:11.3.0-base-ubuntu18.04 nvidia-smi
Thu Apr 29 23:19:57 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 465.24.02    Driver Version: 465.24.02    CUDA Version: 11.3     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:0A:00.0  On |                  N/A |
|  0%   42C    P8     9W / 151W |    212MiB /  8116MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+




やったー👏👏👏👏👏👏👏👏

Fedora 33のときは結構苦労した記憶があったけど、今回はあっさりOK!

Fedora 34 でTensorflow 2.5-rc2(CUDA11.3 cuDNN8.2.0)をビルドする

目的


Tensorflowの2.5-rc2をFedora 34でソースビルドする。
2.5の正式版リリースに向けての準備と備忘録。


環境


  • Fedora 34 x86_64
  • Python 3.9.4(virtualenv)
  • GCC 11.0.1 20210324
  • CUDA 11.3 + cuDNN 8.2.0
  • CPU AMD Ryzen 7 1700
  • GPU GeForce GTX 1070


事前の準備


GCC10.2のビルド


前回の記事
と同様、CUDA 11.3がサポートするGCCは10.2.1で、Fedora 34のGCC11ではビルドができない。このため、まずはGCC10のビルドを行う。
GCCのビルドについては、以前の記事を参照。


GCC9.3のソースダウンロード&ビルド


ソースをダウンロードし、ビルドする。

$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-10.2.0/gcc-10.2.0.tar.gz
$ tar xf gcc-10.2.0.tar.gz
$ cd gcc-10.2.0/
$ ./contrib/download_prerequisites 
$ mkdir build
$ cd build/
$ ../configure \
    --enable-bootstrap \
    --enable-languages=c,c++ \
    --prefix=/home/xxxxx/gcc/10.2 \
    --enable-shared \
    --enable-threads=posix \
    --enable-checking=release \
    --disable-multilib \
    --with-system-zlib \
    --enable-__cxa_atexit \
    --disable-libunwind-exceptions \
    --enable-gnu-unique-object \
    --enable-linker-build-id \
    --with-gcc-major-version-only \
    --with-linker-hash-style=gnu \
    --enable-plugin \
    --enable-initfini-array \
    --with-isl \
    --enable-libmpx \
    --enable-gnu-indirect-function \
    --build=x86_64-redhat-linux
$ make -j16
$ make install


specsファイルの作成


コンパイルしたGCC9でビルドした際に、適切な動的リンクライブラリ(libstdc++.so)がリンクされるようにSPECEファイルを修正する。

$ /home/xxxxx/gcc/10.2/bin/gcc -dumpspecs > specs
$ vi specs

# before
*link_libgcc:
%D

# after
*link_libgcc:
%{!static:%{!static-libgcc:-rpath /home/xxxx/gcc/10.2/lib64/}} %D

$ mv specs /home/xxxx/gcc/10.2/lib/gcc/x86_64-redhat-linux/10/


Environment Modulesの設定


GCC10をEnvironment Modulesで切り替えられるようにする。environment-modulesをインストール後、/etc/modulefiles 配下に、gcc10xのファイルを作成する。

$ sudo dnf install environment-modules

$ sudo vi /etc/modulefiles/gcc10x

#%Module 1.0
#
#  gcc-10.X module for use with 'environment-modules' package:
#

prepend-path    PATH                    /home/xxxxx/gcc/10.2/bin/


Bazelのビルド


Bazel をソースビルドする。最新の3.7.4をソースビルドした。
公式のソースビルド方法はここを参照。手順どおりであり詳細の説明は割愛。


CUDA、cuDNNのインストール


CUDA: 11.3、cuDNN: 8.2.0をインストール。
  • CUDAはRPM Fusion Howto/ CUDA を参考にインストールを行う。
  • cuDNNはNVIDIAのダウンロードサイトからダウンロード、インストールを行う。
    2021.5.1時点ではRPM Fusion(Machine Learning repository)からインストールできるcuDNNがCUDA11.1の組み合わせで古いため。


Tensorflowのビルド


さて、本題。TensorFlow 2.5-rc2をビルドする。


virtualenvの設定


まずはvirtualenv(virtualenvwapper)でTensorflow用の仮想Python環境を作成し、必要なモジュールをインストールする。

$ mkvirtualenv -p python3  tf2.5-rc2
$ pip install pip numpy wheel
$ pip install keras_preprocessing --no-deps

ビルド


Githubからソースを取得し、configureスクリプト実行し、ビルドを行う。
  • CUDAのサポートを有効とする。
  • Host compilerにGCC9のgccのパスを指定してあげる。
  • ビルドオプションには"--config=v2"と"--config=nonccl "を指定。


(tf2.5-rc1) $ git clone -b r2.5 https://github.com/tensorflow/tensorflow.git
(tf2.5-rc2) $ cd tensorflow
(tf2.5-rc2) $ ./configure 
(tf2.5-rc2) $ bazel build \
    --config=cuda \
    --config=v2 \
    --config=nonccl \
    --config=opt \
    //tensorflow/tools/pip_package:build_pip_package
(tf2.5-rc2) $ ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
(tf2.5-rc2) $ pip install /tmp/tensorflow_pkg/tensorflow-2.5.0rc2-cp39-cp39-linux_x86_64.whl


インストール確認


  • tf.__version__が2.5-rc2であること。
  • GPUデバイスを認識していること。

(tf2.5-rc2) $ python
Python 3.9.4 (default, Apr  6 2021, 00:00:00) 
[GCC 11.0.1 20210324 (Red Hat 11.0.1-0)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
2021-05-01 21:07:37.359112: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
INFO:tensorflow:Enabling eager execution
INFO:tensorflow:Enabling v2 tensorshape
INFO:tensorflow:Enabling resource variables
INFO:tensorflow:Enabling tensor equality
INFO:tensorflow:Enabling control flow v2
>>> tf.__version__
'2.5.0-rc2'
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
2021-05-01 21:08:05.854665: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  SSE3 SSE4.1 SSE4.2 AVX AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-05-01 21:08:05.865237: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcuda.so.1
2021-05-01 21:08:05.908808: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-05-01 21:08:05.909879: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:0a:00.0 name: NVIDIA GeForce GTX 1070 computeCapability: 6.1
coreClock: 1.7085GHz coreCount: 15 deviceMemorySize: 7.93GiB deviceMemoryBandwidth: 238.66GiB/s
2021-05-01 21:08:05.909938: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-05-01 21:08:05.942599: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublas.so.11
2021-05-01 21:08:05.942733: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublasLt.so.11
2021-05-01 21:08:05.953447: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcufft.so.10
2021-05-01 21:08:05.970201: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcurand.so.10
2021-05-01 21:08:05.982505: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusolver.so.11
2021-05-01 21:08:05.994212: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusparse.so.11
2021-05-01 21:08:05.995767: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudnn.so.8
2021-05-01 21:08:05.995901: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-05-01 21:08:05.996970: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-05-01 21:08:05.997553: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-05-01 21:08:05.997592: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-05-01 21:08:06.441157: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-05-01 21:08:06.441208: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-05-01 21:08:06.441217: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-05-01 21:08:06.441408: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-05-01 21:08:06.441949: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-05-01 21:08:06.442510: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-05-01 21:08:06.442984: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/device:GPU:0 with 6992 MB memory) -> physical GPU (device: 0, name: NVIDIA GeForce GTX 1070, pci bus id: 0000:0a:00.0, compute capability: 6.1)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 17887149015766682436
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 7332429824
locality {
  bus_id: 1
  links {
  }
}
incarnation: 2150787946068778776
physical_device_desc: "device: 0, name: NVIDIA GeForce GTX 1070, pci bus id: 0000:0a:00.0, compute capability: 6.1"
]
>>> 

OK!

2021年3月30日火曜日

2021年の初釣行

去年は行けなかったので、ひさびさの釣行。

いつもの渓流に。

あと、新しく買ったランディングネットも使いたかった。

前日の雨と雪代で増水、濁りもあるので支流で。


まずはイワナがヒット!、ランディングネットも使ってみる!!

うまく、撮るのむずかしい😅(尾が写ってるぐらい...?)

Pixel 4a防水じゃないし...
こんどは、防水ケースに入れていけばいいかな?

あとは、もう一匹。ちっさいけど...ヒット
ピンボケ...下手だ...

この後、川を移動してもう一匹、ヒット(オートリリースしたので写真なし)

午後からちょっと寒くなって終了。

久々で満足の一日💪🎣

春もそこまできてる。



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になったぞ〜!!

2021年2月21日日曜日

Jetson Nano(JetPack 4.5)でlibrealsenseをソースビルドする

目的


NVIDIA Jetson NanoでIntel RealSenseをソースビルド(Native Backend)する。

RealSenseのSDK(librealsense)でNative Backendを使うには、カーネルにパッチを当てたうえでソースビルドが必要。
しかし、librealsenseのJetson用のパッチはJetPack 4.3用のため、JetPack4.5ではパッチがエラーとなってしまう。
このため、パッチをJetPack 4.5に対応してビルドする。


注意事項


2021.2.21時点
  • 公式のリポジトリ(librealsense)が対応した場合、この内容は古くなってしまうため、必ず最新情報を確認すること。
  • パッチの内容について誤りがある可能性があること(公式の対応でないため)。


リファレンス



リポジトリ


librealsenseをforkしたリポジトリを用意した。



手順


カーネルのパッチ適用&ビルド


JetPack 4.5を書き込んだJetson Nanoを用意する。
あとは公式の「Building from Source using Native Backend」と同じ手順で問題ない。
途中でCloneしたカーネルソースのtag を求められるので「tegra-l4t-r32.5」を入力する。

$ sudo apt update
$ sudo apt upgrade

$ git clone -b jetson_l4t-r32.5-4.9 https://github.com/NobuoTsukamoto/librealsense.git
$ cd librealsense
$ ./scripts/patch-realsense-ubuntu-L4T.sh

~~~~~~~~~~
Create the sandbox - NVidia L4T source tree(s)
Downloading default kernel/kernel-4.9 source...
Cloning into '/home/jetson/librealsense/Tegra/sources/kernel/kernel-4.9'...
remote: Enumerating objects: 5207472, done.
remote: Counting objects: 100% (5207472/5207472), done.
remote: Compressing objects: 100% (833434/833434), done.
remote: Total 5207472 (delta 4367040), reused 5173766 (delta 4333423)
Receiving objects: 100% (5207472/5207472), 943.55 MiB | 1.03 MiB/s, done.
Resolving deltas: 100% (4367040/4367040), done.
The default kernel/kernel-4.9 source is downloaded in: /home/jetson/librealsense/Tegra/sources/kernel/kernel-4.9
Please enter a tag to sync /home/jetson/librealsense/Tegra/sources/kernel/kernel-4.9 source to
(enter nothing to skip): 

ここで、「tegra-l4t-r32.5」入力してEner。あとはビルドが終わるのを待つ。

~~~~~~~~~~
Copying the patched modules to (~/)
~/librealsense
Move the modified modules into the modules tree
Insert the modified kernel modules
Replacing uvcvideo  -
        Applying the patched module ...  succeeded
Replacing hid_sensor_accel_3d  -
        Applying the patched module ...  succeeded
Replacing hid_sensor_gyro_3d  -
        Applying the patched module ...  succeeded
Replacing hid_sensor_trigger  -
        Applying the patched module ...  succeeded
Replacing hid_sensor_iio_common  -
        Module hid_sensor_iio_common  is used by hid_sensor_trigger
        Unloading dependency hid_sensor_trigger
        Module is resident, unloading ...  succeeded.
        Applying the patched module ...  succeeded      Reloading dependent kernel module hid_sensor_trigger ...  succeeded.


Script has completed. Please consult the installation guide for further instruction.


librealsenseのビルド


あとはlibrealsenseのビルドを行う。
念のため再起動してcloneしたlibrealsenseディレクトリに移動。

$ mkdir build && cd build
$ export PATH=${PATH}:/usr/local/cuda/bin
$ cmake \
  -DBUILD_WITH_CUDA=ON \
  -DBUILD_WITH_OPENMP=ON \
  -DBUILD_PYTHON_BINDINGS=ON \
  -DCMAKE_BUILD_TYPE=Release \
  ..
$ make -j$(($(nproc)-1))
$ sudo make install

Pythonラッパーを使う場合は、/usr/lib/python3/dist-packages/pyrealsense2/にパスを通しておく。

$ export PYTHONPATH=$PYTHONPATH:/usr/lib/python3/dist-packages/pyrealsense2/


確認


realsense-viewerを起動してFrame Metadataが正しそうなことを確認する。


できたー!