NVIDIA Jetson Xavier NXを初期設定してCloud-Native Demoを動かしてみる

NVIDIAからエッジコンピューターJetsonシリーズの新機種Xavier NXが発売されました。
既に発売されているAGX Xavierの方が処理能力が上ということだったので、買うつもりは無かったのですが、NVIDIAが出しているサンプルプログラムのCloud-Native Demoを見て「!」と。
うちの会社のプロダクトに工場内の作業者の見守りシステムというのがあるのですが、骨格推定にOpenPoseを使っていてJetsonではどうにも重いのが悩みどころでした。
サンプル動画を見るとかなり高速にしかもそれなりの精度で動いているように見え、思わずポチっと。

ということで、早速セットアップとCloud-Native Demoの中から骨格推定のコンテナを動かすところまでをやってみました。

Jetson Xavier NX 起動用SDの作成

セットアップはJetson nanoと同様に、microSDにシステムを書き込む方式です。
以前のJetsonのように、UbuntuのホストマシンからSDKをUSBでインストールする方式から考えるとかなり楽になりました。
balenaEtcherを使ってmicroSDにイメージを書き込みます。
Validateまで含めるとかなりの時間がかかりました。

イメージを書いたmicroSDをXavier NXにセットして起動します。

Ubuntuセットアップ

起動するとまずはUbuntuのセットアップが走ります。
ライセンス同意画面が出て、言語設定へと進みます。

英語を選ぶかたも多いと思いますが、自分はメッセージ等を日本語にしたいので日本語を選びました。

キーボードの設定はデフォルトは英語になっていましたが、日本語キーボードと結構配列が違うので、日本語キーボードをお使いの場合は正しく設定しておきましょう。

Xavier NXにはWi-Fiボードが搭載されているため、Wi-Fi接続設定をここで行います。
細かいところですが、最初から搭載されているのはとても便利です。

地域の設定を東京にし、Ubuntuのユーザーを作ります。

最後にシステムパーティションのサイズを設定します。
デフォルトで使えるMAXサイズが表示されているはずですので、そのまま続けます。

ファイルのコピーが終了すると自動的に再起動します。
最初のチュートリアル等は閉じてしまって問題ありません。

日本語設定にしたことでユーザーディレクトリ名が日本語になってしまっています。
このままでは使い勝手が悪いので、まずはターミナルを起動し、ユーザーディレクトリ名を英語に変更します。

ターミナルは、Ctrl+Alt+tで起動できます。

LANG=C xdg-user-dirs-gtk-update

続いてapt updateとupgradeを行います。

sudo apt update && sudo apt upgrade

あと、自分の場合は外部のPC等から接続して作業をしたいので、openssh-serverを入れておきました。

sudo apt install openssh-server

Jetson Xavier NX へのM.2 SSD (NVMe)の取付

ここでSSD(M.2スロット使用)の装着についてもご紹介しておきます。
装着の際は、かならず電源を切って行ってください。

背面にM.2のKEY Mがありますので、ここにNVMeを装着しました。
おそらくB+MタイプのSATAとかでも使えると思います。
Amazonを見ていたら1つだけNVMeで妙に安い製品があったので、こちらを買ってみました。
購入した時は256GBはなくて128GBを買ったのですが、256GBも4,999円とお買い得。

M.2スロットに差し込みねじ止めするだけです。

Jetson Xavier NX システムにSSDをマウントする

Xavier NXを起動し、ターミナルを立ち上げます。

まずはlsblkでSSDを認識できていることを確認します。

fdiskを使ってパーティションを作成します。
SSDの種類によってデバイス名が異なる可能性がありますので、lsblkで確認したデバイス名を使ってください。

sudo fdisk /dev/nvme0n1

コマンドnで新規パーティションの作成に入り、全てデフォルト設定で使用可能な最大サイズをプライマリパーティションとして作成します。
最後にコマンドwでパーティションテーブルに書き込みます。
再度lsblkで見てみると、パーティションが作成されたことがわかります。

このパーティションをext4でフォーマットします。

sudo mkfs -t ext4 /dev/nvme0n1p1

これでNVMeを使う準備ができましたので、/media/nvmeにマウントして使えるようにします。
Cloud-Native DemoのREADMEでは、/home/nvidia/nvmeにしていたりしますが、使いやすいところにマウントすれば良いと思います。

sudo mkdir /media/nvme
sudo mount /dev/nvme0n1p1 /media/nvme

このままだと再起動するとマウントが解除されてしまいますので、blkidコマンドで作成したパーティションのUUIDを調べてfstabに情報を書き込んでおきます。
この作業は間違えるとシステムが起動不能になったりしますので、間違いのないよう慎重に行ってください。

sudo vi /etc/fstab

dockerデータをSSDに移設

使用する上で、一番容量を食うであろうdockerのデータディレクトリをSSD側に移設します。
まずは、dockerを止めます。

sudo service docker stop

/var/lib/dockerを丸ごと先ほどマウントしたSSD(NVMe)に移して、シンボリックリンクを作成します。

sudo mv /var/lib/docker /media/nvme/
sudo ln -s /media/nvme/docker /var/lib/docker

dockerを起動します。

sudo service docker start

Cloud-Native Demo on Jetsonの中からPoseコンテナの実行

基本的に、Cloud-Native DemoのREADMEを見ながら準備を進めてください。
まずは32GBのスワップ領域を確保します。(そんなに!?)

run_demo.shを覗き、poseに関する部分だけをピックアップして実行してみます。
run_demo.shでは、コンテナ内からディスプレイを使うためのxhostの設定、パワーモデル設定とjetson_clocksを使った最大パフォーマンス設定を有効にし、デモ用のコンテナを順次起動していくようになっています。

そして、run_pose.shの方を見ていきます。
こちらでもディスプレイ設定、パワーモデル設定とパフォーマンス設定を行い、コンテナを起動しています。
ディスプレイ設定、パワーモデル設定、パフォーマンス設定は一度実行すれば良いので重複して実行していることになります。

肝心のコンテナです。
run部分では変数が多く使われていますので、これらを展開しつつ起動します。

実行結果は、以下の動画の11:02からをご覧いただければと思います。
かなり高速で精度も出ています。

また、Webカメラの映像で動くように書き換えて実行してみました。
動画の11:19~をご覧ください。

NVIDIA Jetson Xavier NXを初期設定してCloud-Native Demoを動かしてみるへのコメント

Cloud-Native Demo の参考にさせて頂きサンプル動画の動作確認できました。
私もwebカメラで動くようにしてみたいのですが、もしよろしければ、入力部分の変更箇所を教えていただけないでしょうか。

投稿者: たくみ

すみません。コメント埋もれてて1年以上も経って気づきました。
もう解決されましたか?
NXのどこかにソースコード置いてあると思うので、見つけたら記載します。
参考になるかわかりませんが、他のDeepStreamサンプルのWebカメラ対応config書き換えはこちらにあります。
https://o-84.com/article/jetson-nano-deepstream/

投稿者: jun

今更ながら…
コンテナ内のソースですが、run_pose_pipeline.pyの
#from video import Video
from camera import Video
でv4l2srcが使われるようになります。
あとは実行時に/dev/video0(USBカメラ指定)、width, heightの指定ぐらいです。
コンテナなので、起動時にvideo0のアタッチかprivilegedでの実行が必要です。

投稿者: jun

NVIDIA Jetson Xavier NXを初期設定してCloud-Native Demoを動かしてみるにコメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です