Dockerコンテナを起動してJupyterLabにアクセス

解説

NVIDIA社から、Jetsonに最適化されたDockerコンテナがいくつか提供されています。

NVIDIA社から提供されているDockerコンテナを実行してJupyterLabにアクセスする方法をまとめます。

NGC Catalog

NVIDIA社からは、AI/HPCに関するDockerコンテナが多数提供されています。
どのようなDockerコンテナが提供されているかは、「NGC Catalog」(※1)で確認できます。

※1 : NGP : NVIDIA GPU Cloud。GPU を搭載したオンプレミス、クラウド、エッジシステムで、AI、機械学習、HPC(ハイパフォーマンスコンピューティング)の開発をするためのサービスやソフトウェアやサポートを提供するポータルサイトです。

機械学習開発用のコンテナ

「NGC Catalog」にて提供されているDockerコンテナの中から、Jetsonに最適化された機械学習開発用のコンテナ「L4T ML」を実行することとします。

提供元ページは以下です。
NVIDIA L4T ML | NVIDIA NGC

※L4T : Linux for Tegra の略です。Jetson Linuxのことです。Jetson Linuxは、以前は、Linux for Tegraという名称でした。Tegraとは、NVIDIA社のSoCシリーズの名前です。Jetsonシリーズは、NVIDIAのTegraを搭載しています。
※ML : Machine learningの略です。機械学習のことです。

コンテナ「L4T ML」には、以下のソフトウェアが含まれています。(詳しくは、提供元ページ参照)

コンテナ起動コマンド

機械学習用のコンテナ「L4T ML」の起動コマンドは、提供元ページに記載があり、以下です。



コマンドオプション解説

-it
インタラクティブモードで実行します
--rm
コンテナを終了したらコンテナを削除します。(コンテナを終了してもコンテナを削除したくない場合は、このオプションは外します)
--runtime nvidia
l4t-base コンテナの実行中に NVIDIA コンテナランタイ ムを使用します。
--network host
コンテナが Jetson ホストのネットワークとポートを使用できるようにします。

コンテナタグの確認

コンテナ起動コマンドの「<tag>」については、実行する Jetson nano の環境に合わせたコンテナタグを指定する必要があります。

まず、「OSバージョンの確認」等を参考に、Jetson Linux とJetPackのバージョンを確認します。
この Jetson nano の、Jetson Linux のバージョンは、 32.7.1 で、JetPackのバージョンは、 4.6.1 でした。

続いて、環境に合わせたコンテナタグを、提供元ページ「NVIDIA L4T ML | NVIDIA NGC」から確認します。
Jetson Linux のバージョン 32.7.1 、JetPackのバージョン 4.6.1 の場合のコンテナタグは、「r32.7.1-py3」であることがわかりました。

ホストのディレクトリをコンテナにマウント

「--rm」オプションにより「コンテナを終了したらコンテナが削除」されます。コンテナが削除されるということはコンテナのファイルシステムが削除されるということで、コンテナ起動中に行なったファイル操作は次回のコンテナ起動時に引き継がれません。
コンテナ起動中に行なったファイル操作が次回のコンテナ起動時にも引き継がれるように、「ホストのディレクトリを、コンテナにマウント」するようにします。「ホストのディレクトリ」内のファイルは、コンテナが削除されても、削除されません。

マウントするホストのディレクトリを用意します。
以下のコマンドを実行し、ディレクトリを作成します。今回はユーザーのホームディレクトリ下に「work」というフォルダを用意することとしました。



ホストのディレクトリをコンテナにマウントしてコンテナを起動するコマンドの書式は以下です。

コンテナ起動スクリプトファイルの作成

コンテナの実行コマンドは文字数が多いので、何度も実行する際にタイピングするのが少し面倒です。短い文字数のタイピングで実行できるようにスクリプトファイル化します。

スクリプトファイルを編集する際のテキストエディタとして nano (nano – Text editor) を使用することとします。
nanoをインストールしていない場合は、以下のコマンドを実行し、nanoをインストールします。



以下のコマンドを実行し、スクリプトファイルを新規作成し、nanoで開きます。今回は「docker_ml_run.sh」というスクリプトファイルを作成することとしました。



スクリプトファイルの内容を以下のようにします。「r32.7.1-py3」はコンテナタグであり、上記で確認した「実行する Jetson nano の環境に合わせたコンテナタグ」にします。ホストの「work」ディレクトリをコンテナの「/work」ディレクトリとしてマウントするオプションも記述します。



「ctrl + o」を押下し、ファイルを上書き保存します。
「ctrl + x」を押下し、ファイルを閉じます。

以下のコマンドを実行し、スクリプトファイルに実行権限を付与します。

コンテナの起動

以下のコマンドを実行し、「L4T ML」コンテナを起動します。



初回のコンテナ起動は、コンテナイメージのダウンロードと解凍が行われるため、時間を要します。
2回目以降のコンテナ起動は、ほとんど時間を要しません。

コンテナが起動すると、Terminalでの表示が「root@ホスト名:/#」に変わり、コンテナ上での作業になります。

初回のコンテナ起動時のTerminal画面(コンテナイメージのダウンロードと解凍の結果としての「XXXX: Pull complete」が多数表示されています。)


2回目以降のコンテナ起動時のTerminal画面(コンテナイメージのダウンロードや解凍は行なわれず、「XXXX: Pull complete」はありません。)

Jupyterにアクセス

「L4T ML」コンテナを起動すると、以下のようなメッセージが表示され、JupyterLabサーバーも起動します。(IPアドレス部は、実行する Jetson nano の環境によって異なります)



Jetson nano のデスクトップの「Chromium ウェブ・ブラウザ」アプリ、もしくは、同一ネットワーク上のPCのブラウザアプリ(ChromeやEdge)から、
http://[Jetson nano のIPアドレス]:8888
もしくは
http://[Jetson nano のホスト名]:8888
にアクセスします。

同一ネットワーク上のPCのChromeから「http://[Jetson nano のホスト名]:8888」にアクセスした際の画面

「JupyterLab」のログイン画面が表示されます。

ログインパスワードは、「nvidia」です。入力し、「Log in」ボタンをクリックします。


JupiterLabにログインできました。

ファイル操作は、ホストのディレクトリをマウントした「/work」ディレクトリ内で行なうようにします。「/work」ディレクトリ以外でのファイル操作は、次回コンテナ起動時に引き継がれません。

コンテナの終了

コンテナを終了するには、起動したコンテナ上にいるTerminalで「exit」と入力します。