ここ半年ほど、Pytorchで実装されているアルゴリズムをJetson上で動作確認した。
比較的簡単だったので、手順を示す。
準備
- 動作させるアルゴリズムの実装を見つける。
- 機械学習のフレームワークの種類を確認する。
- 以下は、pytorchだったとして。
- JetsonのLTのバージョンに即したpytorch のDockerImageを明確にする。
- 既存のDockerfileをまずは、雛形として用意する。
- docker build 用、docker run 用のシェルスクリプトを用意する。
FROM nvcr.io/nvidia/l4t-pytorch:r35.2.1-pth2.0-py3
これは、Pytorchの動作する環境をNVIDIAがl4t(Linux_for_Tegra), つまりjetson用に用意したDockerImageを使います。(docker build 時にダウンロードされる。)
RUN apt-get update
RUN apt install sudo
RUN apt install -y git-lfs
# only for development
RUN apt update && apt install -y eog nano
RUN apt install -y meshlab
RUN で始まる行は、Docker build の際に実行されるコマンドです。
Docker環境内でnanoエディタや、画像ファイルのビューワーeogを使いたいので入れています。
本題です。
移植元でaptでインストールしているライブラリ・コマンドがあれば、以下のようにDockerfileに書き加えます。
RUN apt install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
RUN apt install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
RUN apt install -y libv4l-dev v4l-utils qv4l2
RUN apt install -y curl
RUN apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
Pythonのライブラリをpipで入れる必要があれば入れます。
RUN python3 -m pip install パッケージ名
RUN python3 -m pip install -r requirements.txt
あるいは、元のリポジトリにpyproject.toml があれば
RUN cd ${そのディレクトリ} && python3 -m pip install .
を実行します。
例 以下のようにシエルスクリプトを用意します。
#/bin/bash
docker build -t depth-anything-zed:100 .
#!/bin/bash
xhost +
export GIT_ROOT=$(cd $(dirname $0)/.. ; pwd)
docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY \
-v ${GIT_ROOT}/depth-anything-zed/weights:/root/depth-anything-zed/weights \
-v ${GIT_ROOT}/depth-anything-zed/data:/root/depth-anything-zed/data \
-v ${GIT_ROOT}/depth-anything-zed/test:/root/depth-anything-zed/test \
--device /dev/bus/usb \
--device /dev/video0:/dev/video0:mwr \
-v /tmp/.X11-unix/:/tmp/.X11-unix depth-anything-zed:100
以下のように実行します。
sh docker_build.sh
sh docker_run.sh
として、docker環境を立ち上げることができました。
ここまでの手順をふむと,
CUDAデバイスのあるUbuntuPCでの動作例をJetsonで動作させるのは比較的簡単です。
UbuntuPCでのDockerfileが移植元で公開されている場合には、FROM行で指定するDockerImageをNVIDIAのL4T(もしくはjetpack)の指定のあるDockerImageに置き換えればいいだけですから。