Jetson NanoでDocker Containerを動かす
Rev1 2019/10/22
Container再起動について誤りがあったので修正しました。再起動方法を追記しました。また次回予告でYOLOをNGCで動かす予定としていましたが、NGC環境に開発環境が含まれていなかったため、仮想環境抜きで実施した旨変更しました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Dockerは仮想化環境を提供する仕組みのひとつで、ホストOSのカーネルをそのまま使うことで軽量なことが特徴。仮想環境をContainerと呼びます。これを使うと色々周辺パッケージのインストール、バージョン違い等で煩わされることが減ります。
バージョン4.2.1以降のJetPackにはベータ版ということですがDockerが含まれています。NVIDIAは各種開発環境が含まれたContainer を使った環境のことをNGC(NVIDIA GPU Cloud)Containerと呼び公開しています。これからNGCを使っていきたいと思います。
さっそく動かしてみます。NVIDIAの手順の通りです。
1.Container Runtimeの確認
- ちゃんとインストールされているか確認します。
<CODE> sudo dpkg --get-selections | grep nvidia</CODE>
ずらずらっと表示されますが、次が含まれていればOKです。
libnvidia-container-tools install
libnvidia-container0:arm64 install
nvidia-container-runtime install
nvidia-container-toolkit install
nvidia-docker2 install
- Dockerコマンドが動くことを確認します
sudo docker info | grep nvidia
次が表示されます。
Runtimes: nvidia runc
表示されない場合、エラーが出る場合はJetPackが古いかもしれません。JetPackのバージョンは4.2.1以降が必要です。次は再インストールのご参考まで。
2.l4t-base Containerを動かす
l4t-baseはLinux4Tegraの略でJetsonの基本部分だけのcontainerです。詳細はl4tのページを参照してください。
https://ngc.nvidia.com/catalog/containers/nvidia:l4t-base
さっそく動かします。
- ContainerからX windowを使えるようにします。
sudo xhost +si:localuser:root
- l4t Containerを起動します。初めての場合は自動的にダウンロードが始まります。
sudo docker run --runtime nvidia --network host -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/l4t-base:r32.2.1
コマンドの意味
run :Containerを起動
--runtime :nvidiaのruntimeを使う。GPUを使うのに必要。
--network :ネットワークに接続
-it :Containerの入出力用にTerminalを使用
-e :環境変数を設定
-v :ホストとContainerとのVolumes接続(mount)。ホスト側:Container側。
コマンドプロンプトがroot@jetson:/#に変わります。こんな感じ。
3.N-body Simulationサンプルを動かす
N-body simulationデモを動かします。container内にコンパイラ等の環境をインストールするところから始めます。
- コンパイラをインストールします。container内で次のコマンドを入力します。
apt-get update && apt-get install -y --no-install-recommends make g++
- サンプルソースを/tmpにコピーして、コピー先のフォルダに移動します。コピーに数分かかります。
cp -r /usr/local/cuda/samples /tmp
cd /tmp/samples/5_Simulations/nbody
- コンパイルして起動します。
make
./nbody
4.Container終了、削除する
今回はサンプルということでSDカードの容量確保のためContainerのファイルを削除します。Containerで変更した内容を残したい場合は「6.ContainerからImageを作るには」を参照してください。
- Containerと別のTerminalを起動します。Ctrl+Alt+t。
- 起動しているContainerの情報を表示させます。
sudo docker ps :起動しているcontainerの情報を表示
sudo docker ps -a :全てのcontainerの情報を表示
- Containerを終了させます。container内で実施した内容は全て消えてcontainerは最初の状態に戻ります。containerのTerminalで次のコマンドを打ちます。
exit
- Imageの一覧を表示します。ImageはContainerの元となるものです。
sudo docker images :Imageの一覧を表示
- Containerを消します。sudo docker rm CONTAINER_IDでコンテナを削除できます。sudo docker ps -aでCONTAINER_IDを確認してから消します。CONTAINER_IDは各自で異なる(5cfcc46f37ecの部分)ので確認したIDを指定してください。
sudo docker rm 5cfcc46f37ec
- imageを消します。IMAGE_ID(593e936de911の部分)はsudo docker imagesで確認してください。
sudo docker rmi 593e936de911
5.Container再起動
Containerは消さなければ再起動できます。
sudo docker start -i CONTAINER_ID
6.ContainerからImageを作るには
ホストのTerminalで次のコマンドを打ちます。sudo docker ps -aであらかじめCONTAINER_ID を調べておきます。
image名:TAGは保存先のimage名、TAGです。
sudo docker commit CONTAINER_ID image名:TAG
再度起動する方法は次の通り。
sudo xhost +si:localuser:root
sudo docker run --runtime nvidia --network host -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix image名:TAG
7.まとめ
- Jetson NanoでNVIDIA提供のNGC(NVIDIA GPU Cloud)Containerを使ってDocker Containerを動かしました。
- ホストの画面にContainerのGPU出力を表示させました。
- Containerの起動、終了、commit、削除のコマンドを整理しました。
次はNGCを使ってDeepStream SDKを動かしYOLOv3-tinyを動かす予定です。Containerはその準備でした。
DeepStream用のNGCは開発環境が無かったため使用を断念しました。仮想環境を使用しないで実行させました。
おしまい