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が起動しなくなります。
実際に書き込まれるパーティションは次のとおりです。
よくわからない名前のパーティションがいくつかあります。中身を見てもよくわかりませんでした。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]。このモードでは最低限必要なインストールセットアップは完了済みで、初回起動時に最初のユーザーの言語・キーボード・ユーザーアカウントを設定するだけです。
アカウント情報を入力して「続ける」を押すとセットアップが開始します。それなりに時間がかかるので放置しておきましょう。しばらく待つと再起動して、ログイン画面が表示されるはずです。
ログイン画面での注意事項
最初にログインするときは注意が必要です。そのままだとUbuntu 18.04 LTSであるにも関わらずデスクトップ環境としてのUnity 7が起動します。読者の皆様はご存知の通り、UbuntuはUnityからGNOME Shellへ移行しました。
どうやらJetson Nanoのイメージは、わざわざUnityをインストールした状態で提供しているようです。しかも本来であればUnityセッションよりも(GNOME Shellベースの)Ubuntuセッションのほうが選択されるにも関わらず、意図的にUnityセッションが優先されるように調整しています。
Unity 7はコミュニティでの開発は継続しているため、このままUnityを使い続けてもかまいません。ただ、Ubuntu公式としてはGNOME Shellに移行しているので、Ubuntuセッションを選択したいところです。Ubuntuセッションでログインするには、ログイン時にパスワード入力画面の右下にある歯車アイコンから「Unity」ではなく「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/」にインストールされています。そこでサンプルコードをあらかじめユーザーが読み書き可能な領域にコピーしておきます。
サンプルコードのトップディレクトリでmakeを実行すればひととおりビルドしてくれます。時間がかかるのが嫌なら、次の例のように個別にビルドしましょう。
まずは第456回でも試したように、CUDAの動作確認ツールでもある「deviceQuery」を動かしてみます。
期待通りに動いているようですね。ビルドしたバイナリはmake時に「~/sample/bin/aarch64/linux/release/」にもインストールされます。そちらに環境変数PATHを設定しておいてから、実行しても良いでしょう。
CUDAのサンプル:oceanFFT
oceanFFTはCUDAの高速フーリエ変換ライブラリcuFFTを利用して、海面をシミュレーションします。
ひたすら海が波打つ様子を眺めて世の中の面倒なことを忘れたいものの、海に出かける気力はない時におすすめのサンプルです。
CUDAのサンプル:smorkeParticles
smorkeParticlesは体積をもった粒子をシミュレートすることにより、よりリアルな煙を表現します。
「個性」の名の元に「他の奴らとは同じ生き方は嫌だ」って粋がっている粒子も、大局的に見ると結局みんなと同じ方向に向かっているんだねって感じたい時におすすめのサンプルです。
CUDAのサンプル:nbody
nbodyはランダムな初期値を元にN体計算を行います。
あんなに一緒だった粒子たちが、ちょっとしたボタンのかけ違いで、あっという間に離れ離れになっていくさまを見て人付き合いの侘しさを感じたい時におすすめのサンプルです。
VisionWorksのサンプルコード
GPUを利用したより実践的なデモとして、自動運転や動画解析に使えるVisionWorksライブラリのサンプルコードもインストールされています。
まずはサンプルコードを適当なディレクトリにコピーしておきましょう。
VisionWorksのサンプル:ハフ変換
ハフ変換のサンプルは、与えられた動画に対してリアルタイムで輪郭抽出を行います。
人間は結局物事の外側だけを見て判断しているんだなってことがわかるデモです。
VisionWorksのサンプル:移動予測
移動予測のサンプルは、動画上で動く物体の「移動する方向を」画面上に表示します。
どんなに探してもウォーリーは見つからないデモです。
UARTへ接続する方法
公式イメージを使用する限りあまりお世話になることはないはずですが、せっかくなのでUARTからシリアルコンソールを取得する方法も紹介しておきましょう。
UARTのピンはJ44としてキャリアボードのほうに搭載されています。具体的にはUSBのポートが手前になるように配置したときの、左奥にある縦5本のピンです。奥から2本目がTX、3本目がRX、一番手前がGNDになっています。
たとえば3.3VのUSBシリアルコンバーターなどを利用できます。TX/RXが互い違いになるよう接続し、GNDも繋いだら、あとは起動するだけです。
あらかじめホストマシンでシリアルコンソールアプリケーションを起動しておきましょう。シリアルコンソールアプリケーションはscreen、minicom、kermit、cuなど好きなのを選んでください。次はscreenを使用した例です。
dialoutグループに入っていたら、一般ユーザーの権限で/dev/ttyUSB0にアクセスできます。そうでないならsudoを使ってください。電源を入れるといろいろメッセージが流れるので、逐一内容を確認してみるのも良いでしょう。