Jetson Nano による初めての推論

今更ではありますが、 Jetson Nano 2GB モデルを買いました。手始めに推論をさせてみるところまでやってみようとしたのですが、いくつかスムーズにいかない場面があったので、今後のためにも作業手順をまとめておきます。

OS の準備

OS イメージを microSD の準備

microSD カードとの相性があるとの話で心配していましたが、今回はこちらのカードを使ってうまく起動できているように思います。

  • KIOXIA 128GB UHS-I Class10
created by Rinker
キオクシア(KIOXIA)
¥4,659 (2022/08/11 19:41:27時点 Amazon調べ-詳細)

OS イメージはこちらのものを使用しました。 https://developer.nvidia.com/embedded/jetpack

今回使用したバージョンは JetPack 4.6 で、ファイル名は “jetson-nano-2gb-jp46-sd-card-image.zip” でした。ここは所持しているボードの種類に合わせてダウンロードします。

microSD へ OS を書き込む

ダウンロードしたファイルを展開して得られた img ファイルを balenaEtcher を用いて書き込みます。書き込みが終わると、各パーティションを Windows が検出して、ドライブ番号を割り当ててくる&フォーマットしますか?と聞かれますが、全ての問い合わせはキャンセルで閉じておきます。

起動チェック

この microSD カードを Jetson Nano に装着して、電源を入れます。ここでもし以下のような画面が出てしまう場合には、正しくOSイメージを認識できていないようです。

他のバージョンの img を書き込んでみたり、SD Formatter でフォーマットしてみたり、microSD 変換アダプタを噛ませてみたりと、色々と試してみるとこの状態から脱出できる可能性があります。

他の注意点として、あまりにも安い不自然な microSD は使用しないようにしましょう。

電源について

電源は、 Raspberry Pi 4 用として使っていた AC アダプタを流用しました。このアダプタは 5.1V 3A 供給できるので、この Jetson Nano ボードでもうまく合致しました。一方で、 Ancker の Ancker Nano II アダプタから直接 USB-C でつないでも電源が入りませんでした

  • スイッチサイエンスで購入した 5.1V/3.0A 出力 AC アダプタ

Amazon で見かける同等品でも問題ないだろうとは思っています。

初期セットアップ

OSが問題なく起動できたら、最初にライセンスの同意を求められます。

他にもキーボードの設定や、Wi-Fi アダプタが利用可能であれば Wi-Fi の設定などがあります。また、ディスクのサイズを変更して最大化することも聞かれるので設定しておきます。

その他、起動後の設定

私の環境では 5W のモードで動作させています。ファンを取り付けていないせいか、パフォーマンス最大化のモードではカメラ取り扱っていた時に不安定になっていました。

このパフォーマンスモードを設定するコマンドが、以下の通りです。

$ sudo nvpmodel -m 1
  • -m 0 とすればパフォーマンス最大化
  • -m 1 とすれば5W消費電力モード

5W モードだと、 CPU 4 コアのうち2コアを使用する状態となります。

推論の準備

サンプルとして提供されていたものを実行してみるために、前準備を行います。

メモリの設定

/zram でスワップが用意されているのですが、これを解除して、 10GB のスワップファイルを別途用意しました。そのときの手順は以下の通りです。

# スワップを一旦無効にする
$ sudo swapoff -a
$ sudo systemctl disable nvzramconfig

# スワップファイルを拡張する
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=10240
$ sudo mkswap /swapfile

# スワップを有効にする
$ sudo swapon -p 1 /swapfile

# 念のため再起動
$ sudo reboot

これで再起動後に、以下のコマンドを実行してみて、スワップファイルが有効かつサイズの確認をおこなっておきます。

$ free -h
          total        used        free      shared  buff/cache   available
Mem:      1.9G        204M         1.1G         26M        689M        1.6G
Swap:     10.0G          0B        10.0G

デスクトップ環境が起動しないように設定

メモリを節約するために、デスクトップ環境が起動しないようにしておきます。設定したら、次のステップのために再起動しておきます。

$ sudo systemctl set-default multi-user.target
$ sudo reboot

推論環境を作る

初めての機械学習・推論ということで、 GitHub に用意されているサンプルを使わせてもらいました。

ここにあるものを基本的に使わせてもらうのですが、色々と整った Docker コンテナを活用しようと思います。このとき、ベースとしている OS 環境に合わせたものを使うようにしましょう。バージョンがズレていると、この後の処理がうまく出来ないようです。

JetPack 4.6 を使用しているので、コンテナは dustynv/jetson-inference:r32.6.1 を使用します。以下のスクリプトを用意して、コンテナを起動してみます。このスクリプトを ~/nvdli-data ディレクトリで作成しておきました(スクリプト名は ~/nvdli-data/docker_dli_run.sh)。

#!/bin/bash
sudo docker run --runtime nvidia -it --rm --network host  \
   --volume ~/nvdli-data:/nvdli-nano/data   \
   --device /dev/video0    \
   --volume /tmp/argus_socket:/tmp/argus_socket \
    --memory=500M --memory-swap=8G \
    nvcr.io/nvidia/dli/dli-nano-ai:v2.0.1-r32.6.1

私の環境では CSI カメラを接続しているためこのようになっています。USB カメラの場合には一部設定(argus_socket のマウント)は不要なようです。

コンテナを起動します。

$ cd ~/nvdli-data
$ ./docker_dli_run.sh

コンテナを起動したら、 Web ブラウザでアクセスをします。 http://(hostIP):8888/ にアクセスすると以下のような画面が表示されるので、パスワード「 dlinano 」を入力して先に進みます。

ログイン後は、classification/classification_interactive.ipyn ファイルを開きます。今回は CSICamera のほうを使用するので、最初のコードを以下の図のように変更しています。

ここでカメラの生成に失敗する場合には、うまくカメラの認識が出来ていないか、各種バージョンのズレはないのかなどをチェックしておきましょう。

あとは、各コードブロックを順番に実行していき、最後のブロックを実行すると、ブラウザ上でカメラの様子も含めた UI が出現します。

学習と推論

ここでカメラに thumb-up, thumb-down の自分の手を写して、いくつかの角度、パターンなどを登録していきます。カテゴリを変更して、add ボタンを押していくだけでよいようです。

それぞれ20パターンくらいとったところで、 ephocs に 10 くらいの数値を入れ、train ボタンを押して学習させます。学習が終わった後、自分の手をカメラに写すと、右側に現在はどちらの状態か、推論した結果を表示するようです。

最初の train 実行時には、フリーズしたかと思うくらいに固まるのですが、その後学習の様子が動き出すのでしばらくは見守っていた方がよさそうです。

推論のツールについての説明はこちらの Web 記事の方が分かりやすくてよかったです。

参考情報

関連記事

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください