Jetson nanoで「現場で使える!TensorFlow開発入門」のサンプルを動かす


現場で使える!TensorFlow開発入門 Kerasによる深層学習モデル構築手法

書影

この本を写経したりサンプルをダウンロードして動かそうとしたのだけど、 tensorflowのバージョンが1.15のため、Nvidia NGCが提供する NVIDIA L4T MLでは素直に動かせなかった。

なので、tensorflow 1.15のサンプルをほぼそのままで動かせるよう Docker環境を構築した。

※ 今 NVIDIA L4T MLを確認したら "* TensorFlow 1.15"って書いてた...最初に動かしたときは確かに 2.x系になっていたはずなのだが。といってもせっかく作った Dockerfileがもったいないので、学習の記録として記事に残しておくことにする (opencvなんかも必要だし)。

準備

Jetson nanoに swapを追加しないとビルドに失敗した。6GBくらいのスワップファイルを作っておく。
https://qiita.com/n-yamanaka/items/dd82996312ab333fe9b2

Dockerfile

githubに上げた。
https://github.com/Nunocky/JetsonNano_Docker_Containers

FROM nvcr.io/nvidia/l4t-tensorflow:r32.4.4-tf1.15-py3

RUN apt-get update
RUN apt-get install -y fonts-ipaexfont
RUN apt-get install -y libffi-dev
RUN apt-get install -y python-pip
RUN apt-get install -y python3-pip
RUN pip3 install -U pip
RUN pip3 install notebook
RUN pip3 install matplotlib
RUN pip3 install pandas
RUN pip3 install scipy
RUN pip3 install opencv-contrib-python

RUN mkdir /tf
RUN chmod 777 /tf

ADD jupyter_notebook_config.py /root/.jupyter/

CMD ["jupyter", "notebook"]

Dockerfileと同じ場所に jupyter_notebook_config.pyを用意する。
Jupyter notebookのパスワードは jetsonnano に設定した。 パスワードを変えたい場合は
ここを参考にすると良い。

jupyter_notebook_config.py
c.NotebookApp.notebook_dir = '/tf'
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.password = u'argon2:$argon2id$v=19$m=10240,t=10,p=8$kDrfziXaxPvbrLZfP2oTKA$zSNR85lqmziWEVjx/ApauQ'    

ここまで出来たらビルド

sudo docker build -t tensorflow:1 .

matplotlib, opencvなどのビルドで数時間かかる。

実行

sudo docker run -it --rm --runtime nvidia --network host tensorflow:1

起動時に -v オプションでホストのディレクトリと dockerコンテナ上の /tf を関連付ければ作業記録を消さなくても済むが、それは dockerの基本の話なので割愛

tensorboardは Jetson nano上から docker execで実行。

sudo docker exec -it <container id> tensorboard --host 0.0.0.0 --logdir /tf/log --port 6006

注意

大量の画像を扱う 10章以降のサンプルはそのままでは ResourceExhaustedError が出て動かせないことがある。

その時はバッチやエポックの数を調整し、GPUに渡すデータの大きさを変えると良い。

深層学習とかでのtensorflowエラー「tensorflow.python.framework.errors_impl.ResourceExhaustedError: 2 root error(s) found. 」への対処