見出し画像

NVIDIA Jetson Nano Developer Kit 事始め

以下の記事を参考に書いてます。

Getting Started with the NVIDIA Jetson Nano Developer Kit

1. はじめに

ここ数年、エッジでの機械学習を高速化することを目的とした製品がたくさんリリースされています。Intelの「Moividius」ベースのハードウェアからはじまり、最近ではGoogleの「Edge TPU」ベースのものが提供しています。そして、NVIDIAからも「GPU」ベースのハードウェアが提供されていますが、より高性能で比較的高価でした。

もう少し手頃な製品を誰もが心待ちにしていたところ、ついに先月(2019年04月)、「Jetson Nano Developer Kit」が発売されました。

画像1

既存の「GPU」テクノロジーをベースにした「Jetson Nano」は、はるかに高価な「Jetson TX」「AGV Xavier」と「上位互換」があります。

2. 開封の儀

「Jetson Nano Developer Kit」は、控えめな箱に入っています。箱の中には、「Jetson Nano」とヒートシンクがすでに取り付けられたキャリアボード自体があります。また、ボックス内には小さなリーフレットがあります。最後に、ペーパースタンドが追加されてましたが、すぐに捨てました。

画像2

サイズ「80 × 100 × 28 mm」、重量「140g」の「Jetson Nano Developer Kit」は小さなボードではありません。しかし、エッジコンピューティングとして展開することを目的とした製品の場合、大きすぎるわけでもありません。

ヒートシンクの下に見える「Jetson Nano」自体は、きちんとしていて、適度なサイズです。ただし、モジュールの上部に取り付けられているヒートシンクは大きくて不格好です。リテールボックスには含まれていませんが、NVIDIAがレビューのために出荷したときに、オプションのファンが付属していました。

3. 用意する物

GoogleやIntelのハードウェアとは異なり、モニター、キーボード、マウスを使用せずに「Jetson Nano」をセットアップすることはおそらく不可能です。最近では、ヘッドレスモード以外でボードを使用することはほとんどありません。「Raspberry Pi」で本当にうまくいかないときに使用するポータブルモニター、キーボード、およびマウスを探しました。

モニター、キーボード、マウスだけでなく、「Jetson Nano」に接続するには、USB電源とmicro USBケーブル、モニターに接続するためのHDMIケーブル、32GB以上のmicro SDカードも必要です。

驚くべきことに、「Jetson Nano」にはWi-Fiのオンボードサポートがないため、イーサネットケーブルも用意して、接続できるようにルーターの近くに配置する必要もあります。USB Wi-Fi ドングルを使うこともできます。

競争相手と比較して、開始するために多くの物が必要になります。

4. ボードへの電力供給

NVIDIAは、2A〜3.5Aを供給できる5V micro USB電源を使用して「Jetson Nano」に電力を供給することを推奨します。さらに、ベンチマークなどの重い処理を実行する場合は4A電源を使用することをお勧めします。これは、電源の潜在的にかなり問題のある仕様要件です。

「Raspberry Pi」用の信頼できる2.5A電源を見つけるのがどれほど難しいかを考えると、公式のRaspberry Pi USB電源は数少ない良い選択肢の1つです。どこで3.5A電源を調達できるかわかりません。USB経由で3.5Aを提供することは、私が知る限りUSB仕様の範囲外です。

幸いなことに、ボードにはバレルジャックもあり、ジャンパーを使用してmicro USBとバレルジャックを切り替えることもできます。つまり、USB電源で低電圧の問題が発生している場合、通常のDC電源を使用して電源を供給できます。

5. OSイメージの取得

最初に行う必要があるのは、「Jetson Nano Developer Kit card image」を取得することです。これは、圧縮状態で約5.64GBと、平均的なRaspbianの約5倍あります。

micro SDカードへのイメージの書き込みには、「Etcher」をお勧めします。Windows、Linux、macOSで動作するクロスプラットフォームなアプリであり、4回クリックするだけでイメージを書き込むことができます。

画像3

6. Jetson Nanoのセットアップ

ボードにモニターとキーボードとマウスに接続し、micro SDカードをJetson Nanoモジュールの下側のスロットに挿入します。

画像4

micro SDカードスロットは、ボードではなくJetson Nanoモジュールにあります。 モジュールとキャリアボードの間でスロットを確認する必要があります。

最後に、電源に接続します。 micro USB接続の横にある緑色のLEDは、電源を入れるとすぐに点灯し、起動が完了すると、初期設定が行われます。

【注】Jetson Nanoは、HDMI接続について特にうるさいようです。デバッグのために私が持ち歩いている3台の古いモニターと接続できませんでした。 これはおそらく、古いハードウェアでのHDMIハンドシェイクの問題が原因でダウンしています。 開始手順には、「HDMI to DVIアダプタはサポートされていません。 HDMIまたはDP入力を受け入れるディスプレイを使用してください。」とあります。

最初にソフトウェアEULAに同意する必要があります。次に、使用するシステム言語、キーボードのレイアウト、現在のタイムゾーンを選択します。 最後に、ユーザーを作成するよう求められます。このユーザーには管理者権限があります。ホスト名を選択します。 簡単にするために、「jetson」というユーザーを作成し、同様にホスト名として「jetson」を選択しました。

7. ワイヤレスネットワークへの接続

NVIDIA L4T」はUSB Wi-Fiアダプタのサポートが不十分であり、机に置いているほとんどのアダプタは動作しませんでした。

サポートされていないアダプタのリストには、Broadcomチップセットを搭載した公式のRaspberry Pi Wi-Fiアダプターに沿った、本当に一般的なRT5370ベースのドングルが含まれています。 しかし、スペアボックスを調べてみると、あまり一般的ではないRT8188CUSベースのドングルを見つけることができました。幸いにもサポートされているEdimax EW-7811Unでした。

デスクトップを右クリックし、ドロップダウンメニューから[端末を開く]を選択します。

通常、ドングルがどのチップセットに基づいているかは、アダプタをボードに接続した後に「lsusb」コマンドの出力を見ればわかります。

$ lsusb
Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 011: ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]
Bus 001 Device 004: ID 248a:8367
Bus 001 Device 003: ID 045e:07fd Microsoft Corp. Nano Transceiver 1.1
Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$

ここでは、ワイヤレスキーボードおよびマウス用のアダプタと、RTL8188ベースのワイヤレスアダプタを見ることができます。「lsmod」コマンドを使用して、適切なカーネルモジュールがロードされたことを確認することもできます。

$ lsmod | grep rt
rtl8xxxu              115372  0
rtl8192cu              85379  0
rtl_usb                14074  1 rtl8192cu
rtl8192c_common        54245  1 rtl8192cu
rtlwifi                88873  3 rtl_usb,rtl8192c_common,rtl8192cu
btrtl                   7318  1 btusb
rt2800usb              22944  0
rt2x00usb              12492  1 rt2800usb
rt2800lib              80870  1 rt2800usb
rt2x00lib              61822  3 rt2800lib,rt2800usb,rt2x00usb
mac80211              719792  7
rt2800lib,rt2x00lib,rt2x00usb,rtl_usb,rtlwifi,rl8192cu,rtl8xxxu
cfg80211              589351  3 rt2x00lib,mac80211,rtlwifi
$

最後に、「nmcli」コマンドを使用して、正しく検出されたことを確認できます。 その後、ワイヤレスネットワークに接続できます。

$ nmcli
wlan0: disconnected
"Realtek 802.11n WLAN Adapter"
wifi (rtl8192cu), 74:DA:38:58:6F:0F, hw, mtu 1500

$ sudo nmcli dev wifi connect MY_SSID password MY_PASSWORD ifname wlan0
Device 'wlan0' successfully activated with 'e08e5ecf-b2a5-4b32-ac2a-44b6754867f8'.
$

アクティブ化後、接続のステータスを確認できます。

$ nmcli connection show
NAME                UUID                                  TYPE      DEVICE
MY_SSID             e08e5ecf-b2a5-4b32-ac2a-44b6754867f8  wifi      wlan0
Wired connection 1  d0d5acde-fcfe-3d3a-bc1d-584df2b7bfb2  ethernet  eth0
l4tbr0              d0cb0095-06cf-4528-b9f3-18a8cf740122  bridge    l4tbr0
$

ボードはこの時点でwlan0上のDHCPサーバーからIPアドレスを取得する必要がありますが、場合によってはそうではなく、それはさまざまな理由による可能性があるため、この時点で再起動するのがおそらく最も簡単です。 その後、「ip」コマンドを使用してワイヤレスアドレスを見つけることができます。

$ ip addr | grep wlan0
7: wlan0:  mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.1.118/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0

これで、「Jetson Nano」がワイヤレスネットワークに接続され、イーサネットケーブルを外すことができるはずです。

8. デスクトップ共有の有効化

残念ながら、デスクトップで設定アプリを開いて「デスクトップの共有」をクリックしても失敗します。静かにクラッシュします。

 古いGnomeデスクトップとの非互換性が原因と思われる問題です。

この問題に対処する方法はいくつかありますが、最も簡単な方法はコマンドラインとグラフィカルな修正を組み合わせることです。 最初に「org.gnome.Vino.gschema.xml」を編集して「missingenabled」パラメータを復元します。

お気に入りのエディタでスキーマを開きます。

$ sudo vi /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml

そして、次のキーをXMLファイルに追加します。

     <key name='enabled' type='b'>
      <summary>Enable remote access to the desktop</summary>
        <description>
          If true, allows remote access to the desktop via the RFB
          protocol. Users on remote machines may then connect to the
          desktop using a VNC viewer.
        </description>
      <default>false</default>
    </key>

次に、「glib-compile-schemas」コマンドを使用してGnome schemasをコンパイルします。

$ sudo glib-compile-schemas /usr/share/glib-2.0/schemas

このクイックハックにより、「デスクトップの共有」のクラッシュが停止し、開くことができます。 そのため、「システム設定」をクリックしてから、一番上の行にある「デスクトップの共有」をクリックします。

画像5

「Allow other users to view your desktop」と「Allow other users to control your desktop」をチェックします。 次に、「You must confirm each access to this machine」がオフになっていることを確認します。 最後に、「Require the user to enter this password」をチェックして、VNCセッションのパスワードを入力します。

「システム設定」を閉じてから、画面の左上にある緑色のアイコンをクリックして「コンピュータを検索」を開きます。 

アプリケーションタブの「タイプ→カスタマイズ」で、「自動起動するアプリケーション」を開きます。 ここで、コンピューターにログインしたときに自動的に開始されるアプリのリストにVNCを追加できます。

画像6

ボックスの右側にある「追加」をクリックし、名前に「Vino」、コマンド「/usr/lib/vino/vino-server」、コメントに「VNC Server」と入力します。ボックスの右下にある「追加」をクリックして、アプリを閉じます。

【注】Vinoでサポートされている暗号化はTLSセキュリティタイプ(18)です。これは、TigerVNC、TightVNC、RealVNCなどの一般的なビューアを含むほとんどのビューアでは広くサポートされていません。 この非互換性は既知の問題であり、5年以上前から存在しています。 おそらくすぐに消えることはありません。

最後に、端末を開きます。残念ながら、おそらく機能させるにはVNC接続の暗号化を無効にする必要があります。

$ gsettings set org.gnome.Vino require-encryption false
$ gsettings set org.gnome.Vino prompt-enabled false

これでボードをリブートし、リブート後にアカウントに再度ログインする必要があります。 これでVNCが実行され、デスクトップが提供されます。

「nmap」コマンドを使用して、PCからこれを確認できます。

$ nmap jetson
Starting Nmap 7.70 ( https://nmap.org ) at 2019-04-13 01:11 BST
Nmap scan report for jetson (192.168.1.118)Host is up (0.0030s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
111/tcp  open  rpcbind
5900/tcp open  vnc
Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
$

PCにVNC Viewerがまだインストールされていない場合、RealVNCはWindows、Linux、macOS、および他の多くのプラットフォーム用のVNC Viewerアプリを提供します。 アプリをダウンロードしてPCにインストールしてください。

インストールしたら、JetsonへのVNC接続を開きます。 VNCセッションでの暗号化の不足について警告され、パスワードの入力を求められます。すべてが正常に機能していれば、ウィンドウにデスクトップが表示されます。

9. リモートデスクトップの有効化

残念ながら、VNCサーバーは、ユーザーがコンソールで「Jetson Nano」にログインした時のみ実行されます。 ログアウトすると、サーバーは停止します。 モニター、キーボード、マウスを取り外して、ヘッドレスモードでボードを実行することはできません。

そうしたい場合、おそらく最も簡単な方法は「xrdp」と呼ばれるRDPサーバーを実行することです。 インストールは、VNCをセットアップするよりも簡単です。

$ sudo apt-get install xrdp

インストールが完了したら、「Jetson Nano」を再起動する必要があります。 再起動が完了すると、PCから「nmap」コマンドを使用して、「xrdp」のインストールが成功したことを確認できます。

$ nmap jetson
Starting Nmap 7.70 ( https://nmap.org ) at 2019-04-13 01:39 BST
Nmap scan report for jetson (192.168.1.118)
Host is up (0.0025s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
111/tcp  open  rpcbind
3389/tcp open  ms-wbt-server
Nmap done: 1 IP address (1 host up) scanned in 1.25 seconds
$

ログインしていないため、VNCサーバーはシャットダウンされていますが、物理マシンのログイン画面に現在いるにもかかわらず、RDPサーバーは実行されています。

RDPは独自のプロトコルですが、Microsoftはほとんどのプラットフォームで無料で提供しています。Macでは「Mac App Store」からをダウンロードしてインストールします。「Microsoft Remote Desktop」を開き、「Add Desktop」をクリックします。

画像7

好みに合わせて設定を行います。たとえば「Start session in full screen」をオフにして、結果のウィンドウのデスクトップに適切な解像度を設定することができます。 「Save」をクリックし、「Jetson Nano」デスクトップアイコンをクリックしてRDPデスクトップを開きます。

RDPを使用してボードに接続すると、デスクトップの外観が多少異なります。 これは、L4Tのデフォルトである古いUnityスタイルのデスクトップではなく、Gnomeを実行している標準のUbuntuデスクトップが表示されるためです。

画像8

【注】物理デスクトップにログインしてRDPデスクトップを開くことはできません。逆に、RDPデスクトップが既に開いている場合は、物理デスクトップにログインできません。 RDPデスクトップを開いて、VNCを使用して「Jetson Nano」に接続しようとすると、RDPセッションに接続されます。

リモートデスクトップを使用するときにVNCに慣れている場合は、違いに留意する必要があります。 既存の「Jetson Nano」デスクトップを表示しているのではなく、別のデスクトップを作成しています。 その仮想デスクトップは、物理的なキーボードの前に座っている場合のようにログアウトするまで持続します。 RDPウィンドウを閉じて立ち去っただけでは、デスクトップは閉じられず、ログアウトもしません。 次に「Jetson Nano」のRDPサーバーに接続すると、RDPデスクトップは同じように見えます。

最後に、すでにイーサネットケーブルを取り除いて、「Jetson Nano」への接続にワイヤレスネットワークに依存している場合は、新しいGnomeの「設定」を開き、左側のメニューから「電源」を選択して、 「Turn off Wi-Fi to save power」がオフになっていることを確認してください。

「Jetson Nano」は、ヘッドレスモードで実行できるようになりました。 モニター、キーボード、およびマウスのプラグを抜くことができます。それらはもう必要ありません。

10. NVIDIA TensorRTのセットアップ

「Coral Dev Board」とは異なり、「Jetson Nano」には、リアルタイムの推論が行われるデモアプリは付属していません。

しかし、プロジェクトのGitHubリポジトリからダウンロードできる「Hello AI World」という広範な最初のデモがあります。それを確認する前に、「cmake」と「git」がインストールされていることを確認する必要があります。

$ sudo apt-get install cmake
$ sudo apt-get install git

次に、リポジトリのクローンを作成し、サブモジュールを構成します。

$ git clone https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ git submodule update --init

次に、ソースをビルドします。

$ mkdir build
$ cd build
$ cmake ../
$ make
$ sudo make install

しばらく時間がかかります。

11. 初めての機械学習モデルの実行

これで、モデルを実行できるデモアプリが作成されました。 先に進んでディレクトリをビルドディレクトリに変更すると、付属のdetectnet-consoleデモアプリを実行できます。 これは入力としてイメージを受け入れ、検出された境界ボックスの座標のリストを出力します。 3番目の引数として、事前に訓練されたモデルを指定する必要があります。

$ cd ~/jetson-inference/build/aarch64/bin
$ ./detectnet-console ~/dog.jpg out.jpg coco-dog
【注】デモアプリを初めて実行するとき、TensorRTはネットワークを最適化するために時間がかかる場合があります。 最適化されたネットワークファイルは、初めて使用するときにディスクにキャッシュされ、次回は高速になります。 モデルを初めて実行するときは、コードがハングして動作していないと思われるかもしれません。 「数分」では終わりません。

COCOを使用して訓練されたDetectNetのCaffeモデルでビーチでフェッチをプレイしている犬の画像を投げます。これは「Common Objects in Context」データセットであり、最終的にかなりしっかりした検出と大丈夫な境界ボックスになります。

1 bounding boxes detected
detected obj 0 class #0 (dog) confidence=0.710427
bounding box 0 (334.687500, 488.742188) (1868.737549, 2298.121826) w=1534.050049 h=1809.379639

画像9

画像10

「Jetson Nano」には、画像内の複数の人間や荷物を検出するように訓練されたモデルなど、事前訓練された他のモデルがいくつかあります。

画像11

次に、CESで撮影した自分の画像を投げました。これは、事前にトレーニングしたネットワークでIntel Neural Compute Stick 2で使用したものと同じです。

$ ./detectnet-console me.jpg out.jpg facenet

興味深いことに、境界ボックスは以前に見たものとはわずかに異なり、検出の信頼性は低くなりました。 しかし、まだ確実な検出です。

1 bounding boxes detected
detected obj 0  class #0 (face)  confidence=0.604924
bounding box 0  (336.479156, 32.527779)  (441.888885, 199.777786)  w=105.409729  h=167.250000

違いは、他の要因ではなくモデルの調整にかかっています。 私の推測では、「Jetson Nano」に含まれているデモモデルは十分に調整されていません。

「Jetson Nano」のヒートシンクの大きさを考えると、現在どのくらい熱くなっているかを見るのに興味があります。 そこで、レーザー赤外線温度計をつかんでチェックしました。

ヒートシンクは、ボードがしばらく動作した後、約50°C(122°F)の温度に達していました。 これは、GoogleのCoral Dev Boardと同じくらいです。

12. バナナがバナナではない場合

GoogleのCoralハードウェアで行ったのと同じ昼食時のフルーツイメージをNVIDIAハードウェアで試してみます。 今回は、imagenet-consoleデモアプリを使用します。

$ ~/jetson-inference/build/aarch64/bin
$ ./imagenet-console ~/fruit.jpg out.jpg

バナナを検出しましたが、実際にはうまくいきませんでした。

画像12

画像13

そこで、いくつかの果物の画像を試しましたが、時々かなり悪い結果になりました。サンプルネットワークは、含まれている画像では良好に機能しますが、実際の画像では非常に劣っています。 ここでの説明は、このモデルはオブジェクトを検出するのではなく、画像を分類するように訓練されているということです。 含まれているフルーツ関連の画像の背景がすべて白またはニュートラルであることは注目する必要があります。

このドキュメントでそれらをの画像を見ることができます。

13. 独自の物体認識コードの作成

独自の物体認識コードの作成はそれほど難しくありません。分類のタスクに関連する複雑なことをしようとしないのであれば、C++でさえかなりコンパクトに作ることができます。

// Object Recognition example code from NVIDIA
// See https://github.com/dusty-nv/jetson-inference/blob/master/examples/my-recognition/my-recognition.cpp

#include <jetson-inference/imageNet.h>
#include <jetson-utils/loadImage.h>

int main( int argc, char** argv ){
	if( argc < 2 ) {
		printf("object_recognition:  expected image filename as argument\n");
		printf("example usage:   ./object_recognition image.jpg\n");
		return 0;
	}

	const char* imgFilename = argv[1];
	float* imgCPU    = NULL;
	float* imgCUDA   = NULL;
	int    imgWidth  = 0;
	int    imgHeight = 0;

	if( !loadImageRGBA(imgFilename, (float4**)&imgCPU, (float4**)&imgCUDA, &imgWidth, &imgHeight) ) {
		printf("failed to load image '%s'\n", imgFilename);
		return 0;
	}

	imageNet* net = imageNet::Create(imageNet::GOOGLENET);
	if( !net ) {
		printf("failed to load image recognition network\n");
		return 0;
	}

	float confidence = 0.0;
	const int classIndex = net->Classify(imgCUDA, imgWidth, imgHeight, &confidence);

	if( classIndex >= 0 ) {
		const char* classDescription = net->GetClassDesc(classIndex);
		printf("image is recognized as '%s' (class #%i) with %f%% confidence\n",
			  classDescription, classIndex, confidence * 100.0f);
	} else {
		printf("failed to classify image\n");
	}

	delete net;
	return 0;
}

「wget」を使用してコマンドラインからコードと関連ビルドファイルを取得し、次のようにビルドできます。

$ cd ~
$ mkdir object_recognition
$ cd object_recognition
$ wget https://gist.githubusercontent.com/aallan/4de3a74676d4ff10a476c2d6c20b9255/raw/818eb292805520a9fc01aaaee2f7a5692cdf1f92/object_recognition.cpp
$ wget https://gist.githubusercontent.com/aallan/9945105f8ae2aed47d96e23adb8dddc1/raw/fef4e1249de9f4be6763e40cfcd8e1a7b92a40d4/CMakeLists.txt
$ cmake .
$ make

コードは、先ほど見たimagenet-consoleデモアプリと同じGoogleNetモデルをロードしますが、今回は確実性と分類のみをコンソールに出力します。

画像14

私はフィンランドで撮影したホッキョクグマの画像セットに対してそれを実行し、影が与えられた場合でもかなり良い分類結果を得ました。

class 0150 - 0.010576  (sea lion)
class 0181 - 0.020546  (Bedlington terrier)
class 0182 - 0.012807  (Border terrier)
class 0279 - 0.010743  (Arctic fox, white fox, Alopex lagopus)
class 0294 - 0.014232  (brown bear, bruin, Ursus arctos)
class 0296 - 0.741458  (ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus)
class 0360 - 0.089249  (otter)
image is recognized as 'ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus' (class #296) with 74.145813% confidence

いくつかの画像は悪い結果を返しましたが、これらのほとんどは子供のホッキョクグマの画像でした。 繰り返しになりますが、これはおそらくモデルの調整と、モデルの初期トレーニングデータに依存します。

14. Jetson NanoのPythonサポート

C++でJetson Nanoを使用したい場合は、NVIDIAの「Hello AI World」チュートリアルを参照することを強くお勧めします。 しかし、私はPythonが使いたいです。幸いなことに、Jetson Nanoの公式TensorFlowリリースがあります。 しかし残念ながら、ここでインストール手順に関する問題が発生します。

「pip」を使用して「pip」を更新しないでください。これは破壊行為です。

明らかな落とし穴を避けて、インストールはそれほど長くなく、それほど悪くはありません。はじめに、いくつかの依存関係をインストールする必要があります。

$ sudo apt-get install libhdf5-serial-dev hdf5-tools
$ sudo apt-get install python3-pip
$ sudo apt-get install zlib1g-dev zip libjpeg8-dev libhdf5-dev
$ sudo pip3 install -U pip        ←【元記事にはないですが必要だったので追加してます】
$ sudo pip3 install -U numpy grpcio absl-py py-cpuinfo psutil portpicker grpcio six mock requests gast h5py astor termcolor

これらがすべてインストールされたら、TensorFlowをインストールする必要があります。 必要に応じて特定のバージョンをインストールできますが、以下では利用可能な最新リリースをインストールしています。

$ sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu

PythonでTensorFlowモジュールをインポートすることで、TensorFlowが正しくインストールされたことを確認できます。

$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>>

エラーが表示されない場合、TensorFlowは正しくインストールされています。

15. 最大パフォーマンスモデル

J48をジャンパー接続することで、micro USBコネクタまたはバレルジャックを使用してJetson Nanoに電力を供給できることに気づいたかもしれません。 J48を閉じると、電源がmicro USBジャックからバレルジャックに切り替わります。

画像15

4A電源を使用してバレルジャックからボードに電力を供給している場合、「最大パフォーマンスモデル」を有効にすると、動作が速くなります。

sudo nvpmodel -m 0

しかし、エッジで追加のプッシュが必要な場合にのみ、これを行うと思います。

【注】バレルジャックを使用するようにボードを切り替えて、十分に安定した電源を確保するまで、「最大パフォーマンスモデル」を有効にしないでください。 ボードで最大のパフォーマンスを有効にした場合、低電圧イベントを引き起こさないmicro USB電源はほとんどありません。

16. おわりに

NVIDIAは、セットアップを必要以上に難しくしました。エッジを想定したハードウェアの場合、ボードをセットアップするためにモニター、キーボード、マウスを机の上に置く必要があるのはかなり奇妙です。 NVIDIAの伝統を物語っていると思いますが、組み込みデバイスよりもデスクトップコンピューターやラック型サーバーの構築にはるかに慣れていると思います。

しかし、それは彼らのLinuxディストリビューションのひどい状態の言い訳ではありません。セットアップ中と作業中の両方で、それが引き起こした痛みの量は膨大でした。 

Jetsonのドキュメントは、Intel Neural Compute Stickのドキュメントほど悪い状態ではありませんが、いくぶん広範であり、どこを読むべきかを追跡するのは困難です。ただし、その一部は優れています。

いくつかの優れたリソースのコレクションがありますが、ディープビジョンチュートリアル「Hello AI World」をこれ以上強く推奨することはできません。 Jetson NanoでC++を使用する場合は、開始するのにすばらしい場所です。

しかし、Intel Neural Compute Stickと同じように、NVIDIAハードウェアですぐに利用できるのは、PythonではなくC++です。私は彼らの推論とそこに導かれた歴史を理解することができますが、彼らの悪い決断だったと思います。彼らは、機械学習の開発者やデータサイエンティストに馴染みのある環境を主導すべきでした。

この記事が気に入ったらサポートをしてみませんか?