Ubuntu Weekly Recipe

第563回NVIDIA Jetson Nano Developer KitにUbuntuをインストールしよう!

Jetson Nano Developer KitはNVIDIAが提供するエッジAI向けの「パワフルな」シングルボードコンピューターです。今回はこのJetson Nano Developer KitにUbuntuをインストールしてみましょう。

公式にUbuntuをサポートしている開発ボード

Ubuntu Weekly Topicsの2019年3月22日号でも紹介しているように、⁠Jetson Nano」は謎のAI半導体メーカーとして日本でも有名なNVIDIAが開発するAIデバイス向けのモジュールボードです。

Raspberry Piよりも(水平方向にだけ)小さな筐体には、4コアのCortex-A57と4GiBのメモリ、Maxwell第二世代のGPUなどを組み込んだ、Tegra X1ベースのSoCが搭載されています。

ただしJetson Nano本体はSO-DIMMタイプのスロットに刺せるモジュールボードとして提供され、それ単体では動作しません。Jetson Nano Developer Kitは、電源・USB・HDMI・DisplayPort・M.2スロット・RJ45・CSI端子を備えたキャリアボードもセットにすることで、Jetson NanoをRaspberry Piのようなシングルボードコンピューターとして使えるようにした製品なのです[1]⁠。

本連載としてのポイントは、開発用のOSとしてUbuntu 18.04 LTSをサポートしていること。つまりNVIDIA公式のイメージをダウンロードして、microSDカードに書き込めば、それだけでTegraドライバーやCUDAまで一式インストールされたUbuntuが立ち上がります。

さっそく公式の手順を参考に試してみましょう。

機材の準備

Jetson Nano Developer Kitは、microSDカードスロットが搭載されていて、そこから任意のOSを起動できます。NVIDIAではJetson Nano用にUbuntuベースのインストーラーを公開しているので、今回はそれを元に起動してみます。

あらかじめJetson Nano以外に次のハードウェアを用意しておいてください。

給電用Micro USBケーブル(5V2A以上)

Jetson Nanoの電源コネクタとしてRaspberry Piなどと同じようにMicro-Bタイプのケーブルを繋ぐUSBポートが用意されています。Jetson Nanoの要件としては5V2A以上が必要になっているようです。NVIDIAはAdafruitの5V2.5AのACアダプターで動作確認しているとのことでした。ちなみに内径2.1mm、外径5.5mm、奥行き9.5mmのセンタープラスな電源ジャックも搭載しています。それに適合する電源プラグを搭載した電源アダプター(たとえばAdfruitの5V4Aの電源アダプターがあればそれを使用することも可能です。電源ジャック側から給電したい場合は、J25ピンをショートさせてください[2]⁠。

microSD

16GB以上UHS-Iに対応したmicroSDカードが必要です。インストール用のイメージの時点で12GiBほど使用します。また、ルートファイルシステムはインストール直後で9GiBほど、もろもろ設定したあとだと12GiBほど使用しているため、32GBぐらいあったほうが安心かもしれません。ちなみにmicroSDXCのサポートの有無についてはドキュメントには記載がありませんでした。手元で試す限り、認識はするもののブートローダーでうまく起動できないことがあるようです。どうしても大きなストレージが必要なら、M.2スロットにSSDを載せるか、USB 3.0の先に外付けのストレージを用意することになります。

HDMIもしくはDisplayPortのケーブルとディスプレイ

初回起動はUbuntuのOEM Configが走ります。つまりデスクトップ画面でユーザーアカウントなどを登録することになるため、初回起動時はディスプレイが必須です。HDMIとDisplayPortのポートが用意されています。

USB接続のキーボードとマウス

同じく初回起動時のOEM Config時に必要です。USB 3.0 Type Aのポートが4つ搭載されていますので、そこに接続してください。

LANケーブル

WiFiは搭載されていないので、ネットワークを使いたいならRJ45の口に有線のLANケーブルを接続する必要があります。

microSDカードの準備

機材が揃っていることを確認したら、起動用のmicroSDカードを作成します。まずは公式サイトからイメージをダウンロードしましょう。

NVIDIAの開発者向けダウンロードサイトにアクセスすると、最新版ZIPファイルのダウンロードが開始します。

3月30日時点でのファイル名は「jetson-nano-sd-r32.1-2019-03-18.zip」でした。⁠r32.1」の部分はL4T(Linux for Tegra)のバージョンなので、L4Tのバージョンが変わるたびにファイル名も変わるものと思われます。

ファイルサイズは5.3GiB程度あり、とても大きいです。ダウンロードする際のネットワーク環境には注意してください。

公式で紹介している書き込み手順では第488回でも紹介しているEtcherかddコマンドを使う方法を採用しています。Etcherならダウンロードしたzipファイルをグラフィカルに書き込めますが、別途ソフトウェアのインストールが必要です。ddコマンドはUbuntuに最初からインストールされていますし、GUIがなくても利用可能ですが、⁠誤ったデバイスに書き込み」その結果として「世界の破滅を引き起こす」可能性がある危険なツールです。各個人の事情にあわせてどちらを使うか選択してください。

ddの場合は次のようにunzipしながら書き込みます。ここで「/dev/sdb」は対象となるmicroSDカードのデバイスです。⁠sudo blkid」やdmesgコマンドの結果から、正しいデバイスを選択しましょう。間違えるとPCが起動しなくなります。念の為もう一度言っておくと、書き込み先を間違えるとPCが起動しなくなります。

$ unzip -p jetson-nano-sd-r32.1-2019-03-18.zip | sudo dd of=/dev/sdb bs=1M status=progress

実際に書き込まれるパーティションは次のとおりです。

セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前  フラグ
 2    1049kB  1180kB  131kB                     TBC
 3    2097kB  2556kB  459kB                     RP1
 4    3146kB  3736kB  590kB                     EBT
 5    4194kB  4260kB  65.5kB                    WB0
 6    5243kB  5439kB  197kB                     BPF
 7    6291kB  6881kB  590kB                     TOS
 8    7340kB  7406kB  65.5kB                    EKS
 9    8389kB  9044kB  655kB                     LNX
10    9437kB  9896kB  459kB                     DTB
11    10.5MB  10.6MB  131kB                     RP4
12    11.5MB  11.6MB  81.9kB                    BMP
 1    12.6MB  12.9GB  12.9GB  ext4              APP

よくわからない名前のパーティションがいくつかあります。中身を見てもよくわかりませんでした。LNXはLinuxカーネルイメージ、DTBはDevice Tree Blob、EBTはブートローダーではないかと思います[3]⁠。

ストレージの末尾にあるPartition 1がルートファイルシステムとなります。サイズは12GiB(12.9GB)になっていますが、これは初回起動時にSDカードのサイズにあわせて拡張されます。

いずれにせよmicroSDカードに書き込めたら、Jetson Nanoの裏側(モジュールボードとキャリアボードの間)にあるmicroSDカードスロットに接続してください。その後、MicroUSBケーブルを接続すると、Jetson Nanoが起動します。

初回起動(OEM Config)

microSDカードに書き込んだイメージは、UbuntuのOEM Configが有効化されてインストールされています[4]⁠。このモードでは最低限必要なインストールセットアップは完了済みで、初回起動時に最初のユーザーの言語・キーボード・ユーザーアカウントを設定するだけです。

図1 ⁠NVIDIA End User License Agreements」をクリックするとEULAが表示されるので、内容を熟読して「I accept ther terms of these licenses」にチェックを入れて「Continue」をクリックする
画像
図2 言語を選択
画像
図3 キーボードレイアウトを選択
画像
図4 タイムゾーンを選択
画像
図5 アカウント情報を入力
画像

アカウント情報を入力して「続ける」を押すとセットアップが開始します。それなりに時間がかかるので放置しておきましょう。しばらく待つと再起動して、ログイン画面が表示されるはずです。

ログイン画面での注意事項

最初にログインするときは注意が必要です。そのままだとUbuntu 18.04 LTSであるにも関わらずデスクトップ環境としてのUnity 7が起動します。読者の皆様はご存知の通り、UbuntuはUnityからGNOME Shellへ移行しました

図6 わかる人にはこれだけでわかる懐かしいUnityのUI
画像
図7 Tegraのドライバーはインストールされているので3Dアクセラレーションは動く
画像

どうやらJetson Nanoのイメージは、わざわざUnityをインストールした状態で提供しているようです。しかも本来であればUnityセッションよりも(GNOME Shellベースの)Ubuntuセッションのほうが選択されるにも関わらず、意図的にUnityセッションが優先されるように調整しています。

Unity 7はコミュニティでの開発は継続しているため、このままUnityを使い続けてもかまいません。ただ、Ubuntu公式としてはGNOME Shellに移行しているので、Ubuntuセッションを選択したいところです。Ubuntuセッションでログインするには、ログイン時にパスワード入力画面の右下にある歯車アイコンから「Unity」ではなく「Ubuntu」を選択してください。

図8 Ubuntuセッションでログインした場合
画像

これでGNOME Shell版の新しいUbuntuのUIになりました[5]⁠。ログイン時のセッションは、前回のセッションが流用されます。Unityに戻したい場合は、一度ログアウトした上でパスワード入力時に歯車アイコンから設定し直してください。

日本語環境の構築

NVIDIAのイメージは日本語関連パッケージがインストールされていません。日本語UIや日本語入力が必要な場合は、日本語関連のパッケージをインストールする必要があります。

まずデスクトップ左にあるLauncherから歯車アイコンのシステム設定を起動します。起動した画面の左端から「Region & Language」を選択してください。画面に表示される「Manage installed language」をクリックすると、パッケージのインストール確認ダイアログが表示されます。パッケージのインストールを開始した上で、システム管理者のパスワードを入力してください。

インストールが完了したら、一度ログアウトしてから再度ログインし直します。これで日本語入力が可能になっているはずです。Superキーからgeditを起動した上で、最初に「Super + Space」を入力して入力ソースを「日本語キーボード」から「Mozc」に変更しておきます。おそらく右上のアイコンが「JA」から「A▼」もしくは「あ▼」になることでしょう。あとは「半角/全角」キーで日本語入力のオンオフができるはずです。

入力ソースの切換が面倒な場合はシステム設定の「地域と言語」にある「入力ソース」「日本語(Mozc⁠⁠」だけにしておくと良いでしょう。

日本語環境の構築と合わせてパッケージの更新もしておくと良いかもしれません。⁠Superキー」を押して表示されるアクティビティ画面から、⁠update」と入力すると表示される「ソフトウェアの更新」を起動します。あとは画面の指示に従って更新してください。

すべての設定が完了したら、一度再起動しておきましょう。また、この状態のSDカードのバックアップをとっておくと、何かあったときのリカバリーが楽になります。

Jetson Nanoのテスト

NVIDIAのイメージの便利な点は、JetPackが最初からインストールされていることです[6]⁠。JetPackはJetson向けのカーネルモジュール・CUDA・Jetson向けの各種ライブラリ・各種開発ツール・サンプルコードがまとまっています。つまりJetPackが入っていれば、何か追加でインストールすることなくAI系のいろいろを試せる状態になっているということです。

ということで、動作確認がてらサンプルコードをいくつかビルド・実行してみましょう。

CUDAのサンプルコード

CUDAのサンプルコードは「/usr/local/cuda-10.0/samples/」にインストールされています。そこでサンプルコードをあらかじめユーザーが読み書き可能な領域にコピーしておきます。

$ cp -a /usr/local/cuda-10.0/samples/ ~/

サンプルコードのトップディレクトリでmakeを実行すればひととおりビルドしてくれます。時間がかかるのが嫌なら、次の例のように個別にビルドしましょう。

まずは第456回でも試したように、CUDAの動作確認ツールでもある「deviceQuery」を動かしてみます。

$ cd ~/samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "NVIDIA Tegra X1"
  CUDA Driver Version / Runtime Version          10.0 / 10.0
  CUDA Capability Major/Minor version number:    5.3
  Total amount of global memory:                 3957 MBytes (4148756480 bytes)
  ( 1) Multiprocessors, (128) CUDA Cores/MP:     128 CUDA Cores
  GPU Max Clock rate:                            922 MHz (0.92 GHz)
  Memory Clock rate:                             13 Mhz
  Memory Bus Width:                              64-bit
  L2 Cache Size:                                 262144 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            Yes
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            No
  Supports Cooperative Kernel Launch:            No
  Supports MultiDevice Co-op Kernel Launch:      No
  Device PCI Domain ID / Bus ID / location ID:   0 / 0 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.0, CUDA Runtime Version = 10.0, NumDevs = 1
Result = PASS

期待通りに動いているようですね。ビルドしたバイナリはmake時に「~/sample/bin/aarch64/linux/release/」にもインストールされます。そちらに環境変数PATHを設定しておいてから、実行しても良いでしょう。

CUDAのサンプル:oceanFFT

oceanFFTはCUDAの高速フーリエ変換ライブラリcuFFTを利用して、海面をシミュレーションします。

$ cd ~/samples/5_Simulations/oceanFFT/
$ make
$ ./oceanFFT
図9 今がどんなに沈んでいても、きっと波のようにいつか浮くときがくるはず
画像

ひたすら海が波打つ様子を眺めて世の中の面倒なことを忘れたいものの、海に出かける気力はない時におすすめのサンプルです。

CUDAのサンプル:smorkeParticles

smorkeParticlesは体積をもった粒子をシミュレートすることにより、よりリアルな煙を表現します。

$ cd ~/samples/5_Simulations/smokeParticles/
$ make
$ ./smokeParticles
図10 うにょうにょ動いているのを見るだけで時間を忘れる
画像

「個性」の名の元に「他の奴らとは同じ生き方は嫌だ」って粋がっている粒子も、大局的に見ると結局みんなと同じ方向に向かっているんだねって感じたい時におすすめのサンプルです。

CUDAのサンプル:nbody

nbodyはランダムな初期値を元にN体計算を行います。

$ cd ~/samples/5_Simulations/nbody/
$ make
$ ./nbody
図11 初期設定に合わせてさまざまな動きをするN個の粒子たち
画像

あんなに一緒だった粒子たちが、ちょっとしたボタンのかけ違いで、あっという間に離れ離れになっていくさまを見て人付き合いの侘しさを感じたい時におすすめのサンプルです。

VisionWorksのサンプルコード

GPUを利用したより実践的なデモとして、自動運転や動画解析に使えるVisionWorksライブラリのサンプルコードもインストールされています。

まずはサンプルコードを適当なディレクトリにコピーしておきましょう。

$ /usr/share/visionworks/sources/install-samples.sh ~/visionworks/

VisionWorksのサンプル:ハフ変換

ハフ変換のサンプルは、与えられた動画に対してリアルタイムで輪郭抽出を行います。

$ cd ~/visionworks/VisionWorks-1.6-Samples/demos/hough_transform/
$ make
$ ~/visionworks/VisionWorks-1.6-Samples/bin/aarch64/linux/release/nvx_demo_hough_transform
図12 車のカメラから見える風景の輪郭をリアルタイムで抽出する様子
画像

人間は結局物事の外側だけを見て判断しているんだなってことがわかるデモです。

VisionWorksのサンプル:移動予測

移動予測のサンプルは、動画上で動く物体の「移動する方向を」画面上に表示します。

$ cd ~/visionworks/VisionWorks-1.6-Samples/demos/motion_estimation/
$ make
$ ~/visionworks/VisionWorks-1.6-Samples/bin/aarch64/linux/release/nvx_demo_motion_estimation
図13 犬の予期せぬ動きもばっちり追跡
画像

どんなに探してもウォーリーは見つからないデモです。

UARTへ接続する方法

公式イメージを使用する限りあまりお世話になることはないはずですが、せっかくなのでUARTからシリアルコンソールを取得する方法も紹介しておきましょう。

UARTのピンはJ44としてキャリアボードのほうに搭載されています。具体的にはUSBのポートが手前になるように配置したときの、左奥にある縦5本のピンです。奥から2本目がTX、3本目がRX、一番手前がGNDになっています。

たとえば3.3VのUSBシリアルコンバーターなどを利用できます。TX/RXが互い違いになるよう接続し、GNDも繋いだら、あとは起動するだけです。

あらかじめホストマシンでシリアルコンソールアプリケーションを起動しておきましょう。シリアルコンソールアプリケーションはscreen、minicom、kermit、cuなど好きなのを選んでください。次はscreenを使用した例です。

$ screen /dev/ttyUSB0 115200

dialoutグループに入っていたら、一般ユーザーの権限で/dev/ttyUSB0にアクセスできます。そうでないならsudoを使ってください。電源を入れるといろいろメッセージが流れるので、逐一内容を確認してみるのも良いでしょう。

おすすめ記事

記事・ニュース一覧