AbudoriLab.

自律ロボットで誰でも遊べるよう試行錯誤するブログです。

【ディープラーニング画像認識を手軽に使いたい人必見】誰もが躓くTAO ToolKitの環境構築方法を徹底解説


出典:https://blogs.nvidia.co.jp/2021/04/15/ai-workflow-tao-fleet-command/

AbudoriLab.です。
6月23日,24日の2日間で開催されたNVIDIA AI DAYS 2022の初日、Jetsonを中心としてEdgeAIを焦点に当てたセッションEDGE DAYSに登壇してきました。
TAO(Train, Adapt and Optimize) Tool Kitの活用先を事例も合わせた内容で発表しました。
www.nvidia.com
TAO Toolkitは手軽に深層学習手法を使えるツールです。
ただ日本語の解説記事や文献が少ないため、やり方が分からず困っている方も多いと思います。
実際に動かすことの出来た筆者が環境設定から使い方までの手順を徹底解説していきます。

本シリーズにおける今回記事の位置づけ

本シリーズは三部構成になります。
準備編:最強の深層学習ツールになるか?まずは環境設定から
教示データ作成編:学習データセットを作ってみよう
モデルカスタマイズ編:自作したデータセットから学習してみよう

準備編の本稿では難しくツールの使用を諦めるポイントになる環境設定の手順をご紹介します。

転移学習とは

TAO ToolKitを使用するにあたり転移学習は重要なキーワードで、学習済みのモデルに対して推論結果をより狙った結果に近づけるよう、追加で学習することを指します。
研究者がgithubなどでモデルを配布していますが、自身の環境で試してみると認識精度があまり高くありません。
なぜなら、学習に使用のデータセットが外国で撮られた画像で構成されており、日本の環境に適合できなかったことが考えらるからです。

外国の標識と信号機が集められたデータセット

学習を進めていくと同じ物体同士は特徴空間の中で近い位置に割り当てられていきます。

標識と信号機の特徴空間

このモデルにいざ日本で撮影した画像で推論させてみると、特徴が合致せずにうまく認識してくれないことがあります。

見たことがないモノを認識させようとしたときのAIの反応

そこで、自身の使いたい場所でも高い認識精度を出せるようにデータを追加して再学習させてのチューニングが必要になります。

再学習後の特徴空間

さらに転移学習の素晴らしい点として、手元で学習するデータは少ない量でも高精度な認識を可能とします。
大規模なデータセットで学習された公開のモデルに対して、手元のコンシューマ機で最後に微調整するように転移学習することで、簡単に高精度なモデルを手に入れることができそうです。

TAO Toolkitとは

2022年3月23日 GTC2022にてNVIDAは下記のツールを統合することでAI/ディープラーニングフレームワークの複雑さを抽象化させ、一般向けに使いやすくしたTAO Toolkitを公開しました。

  • 転移学習ツール(TLT)
  • 学習結果をJetsonなど各NVIDIA製品の実行環境ごとに最適化するツール
  • センサからAI、AIから活用先までをシームレスに変換するツール

中身の実態はツールの名前を変えて一本化した感じでしたが、専門知識が少なくてもAIの恩恵に預かれる仕組みが出来上がりつつあります。

TAOToolkitでは物体検出、骨格推定や音声認識などが用意されています。
有名な手法として物体検出ではSSD、YOLOV4、セマンティックセグメンテーションではU-Netを利用できます。

https://developer.nvidia.com/ja-jp/tao-toolkit

TAO Toolkitが便利なポイントとして、NVIDIAがサポートする手法に対しては同じ手順で転移学習を実施できるところにあります。
画像認識タスクは物体検出や領域分割など様々な手法があり、本来は転移学習のやり方がそれぞれ異なります。
その煩わしさを解消してくたことで、ユーザはデータセットと計算機を用意するだけで有名な認識手法を簡単に利用できるようになっています。

https://docs.nvidia.com/tao/tao-toolkit/text/overview.html#tlt-computer-vision-workflow-overview

他にもデプロイ先の計算機(JetsonNano,XavierNX)の仕様に合わせたチューニングをしてくれるため、通常の計算結果より圧倒的に速い推論が可能になります。

TAO Toolkitのインストール

下記のリンクから公式サイトにアクセスすると、ざっくりなインストール方法はわかります。
だたし、細かい指示がないことも多いため、筆者がイントールできた手順の詳細を紹介します。
docs.nvidia.com

環境
様々なツールを入れる際に躓くため、絶対に詰まりたくない方はUbuntu18.04とPython3.7の組み合わせをオススメします。

Ubuntu 18.04 ← 公式推奨
Ubuntu 20.04 ← 利用可能
20.04でインストールする場合にはエラー文から原因を解決することが必要です。

✕ Python3.6.9 ← 公式推奨 だが、pipが古すぎて対応していない
❍ Python3.7 ← 公式推奨
✕ Python3.8 ← 利用不可
試しにpython3.8でもやってみましたが、pycocotoolで要件を満たせず使用できませんでした。

必要なツール一覧

DockerCEのインストール

NVIDIAが用意した仮想環境を使用することを強く推奨します。
GPU周りの設定に経験ありの方はご存知だと思いますが、ツールのバージョンの制約が多いのが現実です。
Dockerの無料版であるDockerCEをインストールしましょう。
下記リンクの手順からsudoなしでDockerコマンドを使うところまで実行してください。
www.digitalocean.com

NVIDIA Container Toolkitのインストール

Installing on Ubuntu and Debian(Installing on CentOS 7/8の上の部分まで)の手順を実行してください。
英語なので日本語に翻訳しながら中身を確認します。
起動時確認としてaptを用いて Nvidia docker2 をインストールし、cudaやnvidiaドライバが入ったDockerを起動できればOKです。
docs.nvidia.com

NGC CLI toolのインストール

NGC (NVIDIA GPU CLOUD)のコマンドラインツールをインストールします。
NGCには学習済みモデルやTAO Toolkitで使用するAPIなどが入っています。
以下のインストールページに行き、AMD64 Linuxのタブに切り替えて手順を実行します。
ngc.nvidia.com
NVIDIA製の欲しいモデルをダウンロードして、自環境のデータセットで転移学習を実施する際に利用します。

API Keyの作成と登録

NGC利用時にAPI Keyが要求されます。
API Keyの発行手順も合わせてご紹介します。

1. NGCのWebサイトにログイン
アカウント未取得の方はまず作成をお願いします。
ngc.nvidia.com
2. API Keyの作成
ログイン後にアカウント選択タブから”Setup”を選択します。

NGCホーム画面

Generate API Key を選択し、次のページでもGenerate API Keyを選択します

APIKey作成画面

表示されたUsernameとPassを適当なテキストファイルに保存しておきましょう。
3. API Keyの登録
下記コマンドからAPI Keyを登録します。

ngc config set

API Keyを登録しなかった場合は、Dockerログイン時にも要求されるのでその時にも入力できます。

docker login nvcr.io

www.fsi-embedded.jp

venvでTAOToolkitの仮想環境構築

最後に、TAO Toolkitを使うためにPythonの仮想環境を構築していきます。
仮想環境はvirtualenvが推奨されていますが、Python3.7ではvenvが新しくこちらを採用します。
venvはPython3系であれば同梱されており、追加のインストールは必要ありません。
qiita.com

仮想環境の管理場所設定

TAO Toolkitを管理したいディレクトリにcdで移動します。
直下にtao_envというディレクトリを作り、その中を開発環境として設定します。

cd move/to/tao_env
python3 -m venv tao_env

lsでtao_env下のディレクトリ一覧を確認してみます。

ls
> bin  include  lib  lib64  pyvenv.cfg  share

通常のLinux環境のように見えます。

仮想環境のアクティベート

binに仮想環境をアクティベートさせるスクリプトが置いてあるので実行します。

cd tao_env/bin
source activate
> (tao_env)usr@pc_name:

アクティベートに成功すると(envname)usr@pc_nameと先頭に仮想環境の名前がshellに表示されます。

pathの参照先が仮想環境内に接続されるため環境を改めて整備していきましょう。
接続を無効にすると自PCに設定している元の環境に切り替わります。

TAOToolkitのインストール
pip3 install nvidia-tao

nvidia-taoが正しくインストールされたか、taoコマンドを実行して反応があるかで確認できます。
tao --helpを実行してみてコマンドが見つかりませんと反応があれば成功です。

tao --help

具体的なTAOToolkitのインストール方法は次のページも参考になります。
中国語なので日本語に翻訳して確認してください。
zhuanlan.zhihu.com

Jupyter Notebook でNVIDIAのサンプルを触ってみる

実際にAIモデルを実行したり、学習させたりするために Jupyter Notebook を利用します。
Jupyter Notebookとは、主にPythonコードと文字や画像を一つのドキュメントとして表示してくれるWebアプリケーションです。
book として複数のコードや、それを説明する文章や画像などを配置してブラウザで閲覧しながら作業できるようになります。

Jupyter Notebookのインストール

仮想環境内にJupyter Notebookをインストールします。

pip3 install jupyter
TAO Toolkitのbookをダウンロード

NVIDIAが用意したTAO Toolkitの使い方を説明したJupyter Notebookのbookをダウンロードして解凍します。

wget --content-disposition 
https://api.ngc.nvidia.com/v2/resources/nvidia/tao/cv_samples/versions/v1.3.0/zip -O cv_samples_v1.3.0.zip
unzip -u cv_samples_v1.3.0.zip  -d ./cv_samples_v1.3.0 && rm -rf
cv_samples_v1.3.0.zip && cd ./cv_samples_v1.3.0

cv_samplesの中に各モデルの使い方を説明したbookがあります。

yolo-v4やunetなどの.ipynbがあるディレクトリに移動して、下記コマンドでJupyter Notebookを起動するとブラウザが自動的に表示されます。

jupyter notebook unet.ipynb
.ipynbをjupyter notebookサーバを開いてブラウザで見た様子
Bookのアレンジ

ノートブックではワープロツールのように、見出し、文章、写真、コードブロック、実行ブロックを配置できます。

コードブロック内の配置図

灰色で区切られた領域にPythonコードやbashを記述でき、画面上部の▶Runボタンで実行されます。
ちなみに、%以降に書かれた領域がPythonとして認識され、!以降に書かれた領域がbashとして認識されます。

パス設定

TAOToolkitを動作させるためにパスをここで記憶させておきましょう。
1つ上の画像を参考にしながら、自分の環境にあったパスに変更し実行してみてください。
日本語で記述してある部分は筆者が追記した箇所になります。
パス設定に関しては情報も少なく基本的にノーヒントなので、うまく行くまで根気よく試してみてください。

bookのアレンジで失敗しがちのバッドノウハウ
一番躓きやすいポイントはパス設定です。
パスをコピペしてタイポがない状態でも通らないことがあったので、上記ノウハウを意識してお試しください。

・パスはすべて半角で絶対パスで入力
相対パスでもうまく行くケースもあるみたいだが、筆者の環境では相当悩まされた。
not foundが出たときはだいたいこのパスがおかしい。

・.ipynbがあるディレクトリは参照しない
絶対パスで設定して、タイポがなくてもなぜか参照されずにnot foundとなってしまうことがありました。
データセットや他に参照するワークスペースのパスは別で作成したのちにそちらを参照すると良い。

・仮想環境外のファイルを実行したときにエラーが発生
仮想環境外のファイルを参照したときも仮想化ソフトウェアでの動作になるはずだが、インストールしていないはずのパッケージのエラーが出たりします。
TAOToolkitに関わるデータはすべて仮想環境内に入れて作業したほうが良いです。

最後にbookの指示に従いコマンドを順番にRunしてエラーがでなければ環境設定は完了です。

次回予告

TAOToolkitで使えるセマンティックセグメンテーションのデータセットをゼロから作成する方法について紹介します。

その他の筆者が躓いたポイント一覧

  • OpenCVのバージョンが古い

OpenCVのバージョンが古すぎて、Python標準の古い2.7系しか初期状態では含まれておらず、自分でインストールする必要がありました。
Python3.7で動作するOpenCVをインストール後、requirement.txtでOpenCVのバージョンを編集して再実行してください
OpenCVのインストールはこちら :
avinton.com

・numpyのバージョンが古い
numpyもバージョンが古いため現在の環境で動作するようにアップデートしてください。

pip3 install numpy

さらにrequirement.txtにもアップデート後のnumpyバージョンに書き換えて再実行してください。
バージョンは次のコマンドで確認できます。

python3
>> import numpy
>> print(numpy.__version__)

・matplotlibのバージョンが古い
matplotlibもバージョンが古いため現在の環境で動作するようにアップデートしてください。

pip3 install matplotlib

matplotlibが原因のように見えて、その後にあるpycocotoolが原因で怒られている可能性もあります。

・pycocotoolを入れる?
直接的な原因はPythonのバージョン。
3.6系でも3.8系でも何らかのpycocotoolのような依存パッケージ関連でうまく行きません。
Python3.7.11をvenvに入れることで回避しています。

isbiデータセットが参照できない
Jupyter notebook内のリンクはサーバからの応答がなくデータセットが参照できませんでした。
作者や団体名をヒントに探してみたところこれが同じものに当たりそうです。
github.com

Jupyter notebook内で指定されたディレクトリ構造に従って、LOCAL_DATA_DIR内にisbiディレクトリを作成して必要なファイルを保存していきます。
はじめにgitからファイルをダウンロードします。

git pull https://github.com/alexklibisz/isbi-2012.git

LOCAL_DATA_DIRの場所がわからない場合は下記のコマンドでパスを確認できます。

!echo $LOCAL_DATA_DIR

isbiディレクトリを作成してgithubからのファイルを手動でコピーしてください

  • test-voloume.tif
  • train-labels.tif
  • train-volume.tif

念の為にvenvのactivateもしてください。
また、別にターミナルを開いてコピー作業を実施してください。
・trainのディレクトリが参照されない
学習の際にnotebook通りに進めてみるとデータセットが参照できませんでした。
なぜか$LOCAL_EXPERIMENT_DIRが機能していなかったので、動いている$SPECにexperimentディレクトリをつくって実行すると、無事にmodel_isbi.tltが出力されました。

・TAOToolkitはDockerコマンド操作が不要
DockerでNVIDIA-Dockerを作成してマウントするかと思っていたが、おそらくTAOコマンドに内包されているらしく、ドライバ関連は何もせずとも適用されています。
notebook内でインストールされているが、うまく動作しない場合はTAOToolkit Launcherを入れ直したところ改善しました。
docs.nvidia.com
docs.nvidia.com