[やってみた] Jetson Nano でDeepComposerのWorkshop Lab2(GANカスタムモデルの学習&推論)をやってみた。#AIM223 #reinvent 2019

明けましておめでとうございます。AWS事業本部の梶原@福岡オフィスです。早速ですが、昨年のre:Inventで参加したワークショップ「AWS DeepComposer: Get started with generative AI」のDeepComposerのWorkshop Lab2(カスタムモデルの学習&推論部分)をJetson Nanoで学習&推論をやってみたので手順等、共有します。

DeepComopser自体はまだGAされておりませんが、Workshopで使用されたリポジトリはGithubにて先日公開されており、ワークショップではSageMakerを使用しましたが、カスタムモデルの実習部分(Lab2)はSageMakerには大きく依存していないように見えたので、手元にあるJetson Nanoで実施してみました。基本的にはローカルのPC(GPU付を推奨)でも今回ご紹介する学習、推論は実施可能だと思います。

先にお断りしておきますが、Jetson Nanoでの学習(モデル作成)はSageMakerと比較するとやっぱり時間がかかります。推論は結構実用範囲(2~3秒)できますので、現実的な解としては、学習(モデルの作成)はSageMakerで実施することをお勧めします。ネットワーク環境が不安定とか、エッジで全部やりたい(Jetsonでやりたい)という強い動機を持たれてる方のご参考になればと思います。

必要なもの

  • Jetson Nano
    • 32G以上のSD(スワップファイルを8GB確保します)
    • できれば、電源はAC供給、Fan付、パフォーマンスモード
  • Jupyter Notebook用のWebクライアント
    • WebブラウザがあればOK
    • Jetson Nano単体でもできなくはないとおもうのですが、学習時にJupyter Notebook(Python)にメモリをとられてしまいバッチサイズをかなり小さくする必要がありましたので別PCからアクセスしたほうがいいかと思います。
  • SciPy(依存パッケージ)のインストール失敗やエラーが出てもあきらめない強い気持ち

目次

  1. 機械学習環境整備
  2. 学習
  3. 推論

0. Jetson Nanoの機械学習環境整備

Workshopでは、Notebookの先頭で実施していましたが、SageMakerとJetson nanoでは環境がちがいそのままでは実施できませんので、事前に環境整備を実施します

SDカード(OS)イメージの準備

既にJetson Nanoの初期セットアップ等が終わっている場合は本項はスキップしてください

  1. Jetpack 4.3 [L4T 32.3.1] (SDイメージ:nv-jetson-nano-sd-card-image-r32.3.1)を使用して検証しています
    • https://developer.nvidia.com/embedded/downloads
  2. ダウンロードしたSDイメージをSDカードに焼いて、初期セットアップ(ネットワーク設定、sshログイン程度まで)を実施します。
    • Lang : English

スワップファイルの拡張

学習時スワップファイルがかなり発生するのでスワップ領域を拡張します。 便利なスクリプトがありますのでこれを使わせてもらいます(8GB確保されます)

git clone https://github.com/JetsonHacksNano/installSwapfile
cd installSwapfile
./installSwapfile.sh -s 8
free -h
              total        used        free      shared  buff/cache   available
Mem:           3.9G        550M        2.9G         19M        487M        3.2G
Swap:          7.9G          0B        7.9G

機械学習環境の準備

tensor flowの依存パッケージのインストール

sudo apt-get update
sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev
sudo apt-get install python3-pip
sudo pip3 install -U pip testresources setuptools
  • numpyは1.16.4を指定(DeepComposerの環境と合わせて) Jetson公式のインストール手順から変更
  • numpy他のビルドが実施されるため、インストールに時間がかかります。(少しでも時間を短くしたい場合はこのタイミングでsudo jetson_clocks!)
  • enum34は pypianoroll のインストール時にエラーとなるため、Jetson公式のインストール手順から外しています。
sudo pip3 install -U numpy==1.16.4 future==0.17.1 mock==3.0.5 h5py==2.9.0 keras_preprocessing==1.0.5 keras_applications==1.0.8 gast==0.2.2 futures protobuf
<略>
Successfully installed future-0.17.1 futures-3.1.1 gast-0.2.2 h5py-2.9.0 keras-applications-1.0.8 keras-preprocessing-1.0.5
 mock-3.0.5 numpy-1.16.4 protobuf-3.11.2

tensor flow のインストール

Jetsonには公式パッケージが用意されてますのでそちらを使用します。

  • tensorflowは 1.15.0を指定(DeepComposerの環境は1.14.0) Jetson公式のインストール手順から変更しています
  • ビルドが実施されるため、インストールに時間がかかります。
sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v43 tensorflow-gpu==1.15.0
<略>
Successfully installed absl-py-0.9.0 astor-0.8.1 google-pasta-0.1.8 grpcio-1.26.0 markdown-3.1.1 opt-einsum-3.1.0 tensorboa
rd-1.15.0 tensorflow-estimator-1.15.1 tensorflow-gpu-1.15.0+nv19.12.tf1 termcolor-1.1.0 werkzeug-0.16.0 wrapt-1.11.2

SciPy のインストール(ついでにJupyter他)

参考 https://www.scipy.org/install.html

  • SciPyのビルドでNo lapack/blas resources found.のエラーが発生したため依存する開発用ライブラリのインストールを実施しています。
  • SciPyのビルドでpybind11/pybind11.h: No such file or directoryのエラーが発生したため依存する開発用ライブラリのインストールを実施しています。(pybind11)
  • matplotlibのビルドでft2build.h: No such file or directoryのエラーが発生したためfreetypeのライブラリをインストールしています

  • SciPyの手順にのっとって、jupter他のパッケージもインストールしています。

  • ビルドが実施されるため、インストールに時間がかかります。
sudo apt-get install gcc gfortran python-dev libopenblas-dev liblapack-dev libfreetype6-dev cython
sudo pip3 install pybind11
sudo pip3 install scipy
sudo pip3 install matplotlib ipython jupyter pandas sympy nose

DeepComposerのNotebookで使用するパッケージのインストール

  • DeepComposerのインストールではsudo pip3 install --ignore-installed moviepyとなっていますが、numpy等のバージョンアップが実施されてしまいますので。--ignore-installedは使用していません。(元のnotebookで使用している理由は不明です)
sudo pip3 install pretty_midi
sudo pip3 install pypianoroll
sudo pip3 install music21
sudo pip3 install seaborn
sudo pip3 install moviepy

1. 学習

Jupyter Notebookを起動します

  • 起動時にオプションで外部からの接続を許可して起動します。
jupyter notebook --ip=* --no-browser
[I 18:14:36.602 NotebookApp] Writing notebook server cookie secret to /home/jetson/.local/share/jupyter/runtime/notebook_cookie_secret
[W 18:14:37.506 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 18:14:37.518 NotebookApp] Serving notebooks from local directory: /home/jetson
[I 18:14:37.518 NotebookApp] The Jupyter Notebook is running at:
[I 18:14:37.519 NotebookApp] http://jetson-nano:8888/?token=hogehoge
[I 18:14:37.519 NotebookApp]  or http://127.0.0.1:8888/?token=hogehoge
[I 18:14:37.519 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 18:14:37.535 NotebookApp] 

    To access the notebook, open this file in a browser:
        file:///home/jetson/.local/share/jupyter/runtime/nbserver-22926-open.html
    Or copy and paste one of these URLs:
        http://jetson-nano:8888/?token=hogehoge
     or http://127.0.0.1:8888/?token=hogehoge

表示されたhttp://jetson-nano:8888/?token=hogehogeにアクセスします。

DeepComposerのWorkshopのリポジトリをclone

SageMakerの右上のメニューからnew->Terminalを実施します。 (作成しているディレクトリSageMakerは任意です。コマンドを揃えたかったので)

mkdir SageMaker
cd SageMaker/
git clone https://github.com/aws-samples/aws-deepcomposer-samples.git

ワークショップのLab2の実施

  • Jupter Notebookから"SageMaker/aws-deepcomposer-samples/Lab 2"のGAN.ipynbを開き、各行を実施しています。
  • SageMakerでは特に問題なく実施できますが、Jetson Nanoで実施する際は下記変更を行いました。
  • カスタムモデルの学習詳細については他のブログのエントリー等で紹介されていますので割愛します。

[レポート]Deep Composer入門してみた #reinvent #AIM223

前準備(Dependencies)

  • tensorflow等の依存パッケージはインストールしてますので、コメントアウト(先頭に#)してスキップします。
# Create the environment
# !conda update --all --y 
# !pip install tensorflow-gpu==1.14.0
# !pip install numpy==1.16.4
# !pip install pretty_midi
# !pip install pypianoroll
# !pip install music21
# !pip install seaborn
# !pip install --ignore-installed moviepy

Load data

  • メモリが確保できない旨のエラーが発生したため(OOM when allocating tensor with shape)、BATCH_SIZE = 16 に変更しています
#Number of input data samples in a batch
BATCH_SIZE = 16

#Shuffle buffer size for shuffling data
SHUFFLE_BUFFER_SIZE = 1000

#Preloads PREFETCH_SIZE batches so that there is no idle time between batches
PREFETCH_SIZE = 4

Training

  • なんどか学習するとメモリが確保できなくなってしまう状況だったので for iteration in range(iterations): の下の部分に tf.keras.backend.clear_session() を挿入してセッション開放しています。
for iteration in range(iterations):
    tf.keras.backend.clear_session()

また、メモリが足りない旨のメッセージがでたら別途、GCを実行してます。

import gc
gc.collect()

また、上記のループが1000 回実施されると終了しますが、メモリ不足のためバッチサイズを1/4にしているため、学習の回数は4000回以上が正解だと思います。(学習のチューニングは今回の目的からはずれるため、時間短縮のため同じ1000回数にしています)

学習の終了まで2時間程度かかりますので、気長に待ちます。

ちなみに学習中はGPUを占有してしまうので、Jetson Nanoではほぼ操作はできません。そしてめちゃ熱いのでファンは必須だと思ってください

Evaluate results (結果の評価)

Generated samples during training

で、iteration を50~950で変更して、自分の耳で聞いてみてください。 回数が増えるにつれてそれっぽくなるはずです。 (残念ながらきれいにいい感じには収束してくれていないようなのでもう少しチューニングまたが必要そうです。)

2. 推論

作成したモデルでキラキラ星に伴奏をつけてみましょう。ということで、作成したモデルを使用して、伴奏を生成してみます。

latest_midi = inference_utils.generate_midi(generator, eval_dir, input_midi_file='./input_twinkle_twinkle.mid')
display_utils.playmidi(latest_midi)
inference_utils.show_generated_pianorolls(generator, eval_dir, input_midi_file='./input_twinkle_twinkle.mid')

率直に言うと、まだまだ学習が足りないようです。回数等を増やしてチューニングして、収束してくれるように頑張ってもらおうと思います。

まとめ

Jetson NanoでのGANの機械学習環境の構築みたいな感じになってますが、学習できるめどはついたので、チューニングしていこうかなと思っています。 Jetson Nanoでは時間はかかりますがWあたりの効率はかなり高いので機械学習に興味がある方 は購入して遊んでみてはいかがでしょうか。 (それでもGPUを使わないでPCのCPUや一世代前のGPUでの学習にくらべたらかなり速いです)

Jetson Nanoでも推論は結構実用範囲内だとおもうので、他のカスタムモデルを用いてJetson Nano用にTensor-RTを用いた推論の高速化などまでやってみると、Jetson Nanoにマイクをつけたら、おもしろいのができるんじゃないかと画策しています。

実際のところ、Jetson Nanoの機械学習環境は既存の環境(機械学習用にごちゃごちゃはいってる)だとすんなり行ったんですが、ブログ化の為、0の状態から環境を整えると年をまたいでしまいました。(環境構築時にビルドしなければ少しは時間は短縮できるとは思いますが未検証です) 数分で環境が立ち上り、手軽にスケールアップできたり、パラメータのチューニングが手軽にできる。SageMakerの良さを再確認することになりました。今年もSageMakerのお世話になりそうです。

そして、DeepComposerはGANのリファレンス実装みたいな雰囲気を感じるのでGAが待ち遠しいです。

参考リンク

DevlopsersIO DeepComposer記事

https://dev.classmethod.jp/referencecat/deepcomposer/

おまけ

Jetsonで学習中にGPUの使用率などを確認したいときはjtop(jetson_stats)が便利です

https://github.com/rbonghi/jetson_stats

sudo -H pip install jetson-stats
sudo jtop

Jetson Nanoのみで実施する場合

  • chromium & Jupyterにメモリをとられ、バッチサイズをさらに小さくしないと1000回の学習は実施できませんでした。(実際にSageMaker同等のモデルに近づけたい場合は学習の回数はさらに増やす必要があるかと思います。
  • chromium がエラーを吐くのでchromium-browser --no-sandbox で実施しました