やってみた!

やってみた!

試したことを中心に、書評や興味のあること、思ったこととか

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を使っていきたいと思います。

github.com

 さっそく動かしてみます。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以降が必要です。次は再インストールのご参考まで。

 Jetson Nanoのセットアップ - やってみた!

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:/#に変わります。こんな感じ。

f:id:akifukka:20191012104713j:plain

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

 f:id:akifukka:20191012111644p:plain

 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は開発環境が無かったため使用を断念しました。仮想環境を使用しないで実行させました。

おしまい

 

Jetson Nano カテゴリーの記事一覧へ