機械学習向け小型マイコンボードJetson-Nanoの互換機OKdo Nano C100の使い方を説明します。
Nano C100はハード・ソフトともJetson-Nanoと互換性があるとの商品説明になっていますが、最も大きな違いがeMMCを搭載していて、SDカードよりもストレージアクセスが高速という点になります。
Jetson-Nano (SDカード起動) | Nano C100 SDカード起動 | Nano C100 eMMC起動 |
|
---|---|---|---|
キャッシュ使用読み込み | 1635 MB/s | 1638 MB/s | 1673 MB/s |
キャッシュ不使用読み込み | 89 MB/s | 22 MB/s | 265 MB/s |
書き込み | 26 MB/s | 10 MB/s | 56 MB/s |
MNIST実行時間(Tensorflow) | 15 m 7 s | 15 m 42 s | 10 m 52 s |
eMMC以外はほぼ同じ、といって間違いないと思います。
Jetson-NanoおよびNano C100の開発者ボードは、2階建て構造になっていて、2階部分がメインのボード、下のボードはUSBやHDMI、カメラ、GPIOといった拡張用のボードになっています。
Jetson-Nanoの2階部分のボードのみの構造かつ16GB eMMC搭載のJetson-Nano Computing Moduleというボードも発売されていて、Nano C100はこれと同一の構成になっています。
そのため、本記事はJetson-Nano Computing Moduleをお使いの方にも参考になるはずです。
eMMC起動に関して、ネット上に参考になる記事が見当たらず、立ち上げるまでに苦労したので、同じく悩んでいる方には参考になると思います。
本記事の内容は以下の動画でも説明していますので、ご覧ください。
Micro SDカード起動での動作確認
こちらのサイト(IoT本舗)からOKdo社提供のOSイメージファイル(Ubuntuベース)をダウンロードしてBalena Etcherなどのアプリを使ってMicro SDカードにOSイメージを書き込みます。
このOSイメージはJetPack 4.6.1がベースになっています。
イメージファイルc100.img.xzを書き込んだMicro SDカードをNano C100に差し込んで電源を入れるとUbuntuのセットアップ画面が立ち上がります。
セットアップ方法は、本家Jetson-Nanoと同じ方法でできるので、以下の記事に従い、Tensorflow、DeepStreamの実行確認まで実施できます。
eMMC起動 その1(CUIモード)
c100.img.xzを焼いたMicro SDカードを差して、GUIでのセットアップ完了後、Nano C100からMicro SDカードを抜いた状態、またはOSをインストールしていないMicro SDカードを差した状態で起動すると、eMMCモードで起動します。
やっかいなのが、eMMCモードはCUI操作になる(真っ黒な画面で文字だけ)こと、およびJetPackなど通常必要なものはおろか、ビルド環境やWi-Fiドライバもインストールされていません。
有線LANケーブルを差してもネットワークにつながりませんでした。
このような状態からのスタートとなるため、本章のCUIモードの内容はハードルが高めだと思います。
何はなくとも、まずはネットワークにつながらないと話にならないので、Wi-Fiドライバとビルドするための各種ライブラリをMicro SDカード起動で用意してeMMCにコピーしする方法で進めていきます。
Micro SDカード起動での準備
まず、OSをインストールした(c100.img.xzを焼いた)Micro SDカードを差し込んだ状態で起動します。
以下を実行して、Wi-Fi接続に必要となるライブラリのローカルリポジトリを作成します。
sudo apt update sudo apt upgrade git clone https://gist.github.com/jeanlescure/084dd6113931ea5a0fd9 cd 084dd6113931ea5a0fd9 chmod +x *.sh sudo ./dependencies.sh mkdir ~/archives ./getpkg.sh build-essential ~/archives ./getpkg.sh dkms ~/archives ./getpkg.sh git ~/archives ./getpkg.sh network-manager ~/archives ./mkrepo.sh ~/archives gunzip ~/archives/Packages.gz
使用するWi-Fi子機は以下で、こちらの記事の中で紹介している2例目のものです。
TP-Link TP-WN725N 無線LAN 子機 11n/11g/b デュアルモード対応モデル
ホームディレクトリに移動して、上記Wi-Fi子機のドライバをダウンロードします。
cd git clone https://github.com/lwfinger/rtl8188eu.git
ローカルリポジトリ(archives)とWi-Fiドライバ(rtl8188eu)をeMMCにコピーして、書き込み権限を追加します。
sudo cp -r archives rtl8188eu /media/USERNAME/xxxx/home/nano sudo chmod -R a+w /media/USERNAME/xxxx/home/nano/archives /media/USERNAME/xxxx/home/nano/rtl8188eu
eMMC起動のセットアップ
Micro SDカード抜いて起動し、ユーザ名: nano、初期パスワード: nanoでログインします。
aptコマンドの参照先にローカルリポジトリを追加するため、以下のファイルを編集します。
sudo vi /etc/apt/sources.list
viエディタの使い方がわからない方は以下の動画を参考にしてください。
/etc/apt/sources.list
の最後の行に以下を書き足します。
deb [trusted=yes] file:/home/nano/archives ./
これでapt
コマンドがローカルリポジトリを認識できるようになるので、以下のコマンドで最低限ネットワーク接続に必要なライブラリをインストールします。
sudo apt update sudo apt install build-essential dkms git network-manager
make
コマンドによるビルドを行う際、ファイルのタイムスタンプと現在時刻に矛盾があると正常にビルドできないので、以下のコマンドで時刻を手動で合わせます。(日付と時刻の部分は実行時の日時で置き換えてください)
sudo timedatectl set-ntp false sudo timedatectl set-time "2023-06-02 09:06:00"
Wi-Fiドライバのディレクトリに移動して、ビルド、インストール、その後再起動します。
cd rtl8188eu make sudo make install sudo reboot
以下のコマンドでWi-Fiの状態を確認します。
nmcli radio wifi
enabledと表示されればWi-Fiは有効な状態です。
有効でない場合、以下のコマンドで有効にします。
sudo nmcli radio wifi on
以下のコマンドでデバイスの一覧が表示され、ステータスを確認できます。
nmcli device status
以下のように表示され、Wi-Fiにはつながっていないことがわかります。
DEVICE TYPE STATE CONNECTION wlan0 wifi disconnected -- eth0 ethernet unavailable -- ...
接続可能なWi-Fi SSIDをリストアップします。
nmcli device wifi list
お使いのSSIDが表示されていることを確認し、以下のコマンドでWi-Fiに接続します。
sudo nmcli --ask device wifi connect 'SSID' ifname wlan0
SSIDの部分は、お使いのSSID名で置き換えてください。
Wi-Fiパスワードを聞かれるので、入力するとWi-Fiにつながると思います。
インターネット接続を確認するため、以下のコマンドを実行します。
ping google.co.jp
“Unknown host”や”Request timed out”といったエラーが出ず、一定間隔でパケット情報が表示され、Ctrl+Cで終了した際に”0% packet lost”となっていれば、インターネットに接続できています。
これでネットワークにつながったので、最初のアップデートを行います。
sudo apt update sudo apt upgrade
あとは、「eMMC起動 その2(初期化)」の章に記載の方法でTensorflowまでを実施できるはずです。(DeepStreamの画面出力のあるデモなどはCUIモードのため試せません。)
ただし、私の場合、何度かMicro SDカード起動とeMMC起動を切り替えて使っているうちに、下の画面になり、ログインできない状態になってしまいました。
後述のMicro SDカード起動を復活させるための試行を行っている間、Bootに関係するファイルを書き換えたりしている際にも、何度も上図の状態になり、起動不能に陥ったので、何らかBoot関連の問題が起きた際にこの状態になると思われます。
ただ、初めて上図の状態になった際は、Boot関連のファイル操作をしていた訳ではないので、なぜそうなってしまったか不明です。
この状態になったら、次章「eMMC起動 その2(初期化)」の方法でeMMC起動を可能にし、さらに次の章「Micro SDカード起動を復活させる」の方法を順次実行することでMicro SDからの起動も復活できました。
eMMC起動 その2(初期化)
eMMCを初期化するために、Ubuntu 18.04 LTSをインストールしたPCとNano C100をUSBケーブルでつないでデータを転送する必要があるので、Ubuntu PCの立ち上げ方から説明します。
Ubuntu 18.04 LTS PCの立ち上げ
使っていないWindows PCなどを用意します。(ここがまずハードルが高いですよね・・・)
こちらからUbuntu 18.04 LTSのISOイメージファイルをダウンロードします。
Balena EtcherなどでUSBメモリに上記でダウンロードしたISOイメージを焼きます。
用意したPCにUSBメモリを差し込み、電源を入れ、すぐにF2とF10を連打します。
BIOSが立ち上がったら、BOOTメニューを開き、USBメモリの起動優先順位を最上位にし、Save & Exitします。
これでUbuntuのインストーラが立ち上がるので、あとは画面の指示にしたがってインストールします。
起動したらログインして、以下のコマンドでアップデートします。
sudo apt update sudo apt upgrade
sudoのパスワードタイムアウトを無効にしておきます。
sudo visudo
ファイルの末尾に以下の行を書き足して、保存終了します。
Defaults timestamp_timeout=-1
Ubuntu PCとNano C100をUSB接続
Nano C100のeMMCを初期化するには、Micro SDカードを差し込む側にあるFCRECとGND端子をジャンパーピンなどでショートしておく必要があります。
私は下図のようにメス-メスのジャンパーケーブルを使用しました。
この状態でOKdo Nano C100のMicro USB端子とUbuntu PCのUSB端子をケーブルで接続します。
OKdo Nano C100のHDMI端子にディスプレイにつないでおきます。
以降はUbuntu PCのターミナル上の操作です。
まず、以下のコマンドでUSBケーブルでつないだOKdo Nano C100を認識できていることを確認します。
lsusb
正しく認識できていれば、以下のような行があるはずです。
Bus 002 Devide 020: ID 0955:7020 NVidia Corp.
eMMCへの書き込み
ビルドに必要なライブラリをインストールします。
sudo apt install build-essential bison flex git sudo apt install crossbuild-essential-arm64 qemu-user-static binfmt-support
Nano C100初期化用GitHubリポジトリをクローンし、できたディレクトリに移動します。
git clone --recurse-submodules https://github.com/LetsOKdo/c100-bootupd.git cd c100-bootupd
以下の3ファイルをダウンロードします。
- Driver Package (BSP): Jetson-210_Linux_R32.7.3_aarch64.tbz2
- Sample Root Filesystem: Tegra_Linux_Sample-Root-Filesystem_R32.7.3_aarch64.tbz2
- Driver Package (BSP) Sources: public_sources.tbz2
ダウンロードした3ファイルを今いるc100-bootupdディレクトリ直下に移動します。
mv ~/Downloads/*.tbz2 .
以下のコマンドを実行します。
./init-jetpack
次にLinux_for_Tegra/tools/samplefs
ディレクトリに移動して、nvubuntu-bionic-aarch64-packages
の中身を最小構成にリストで置き換えるため、nvubuntu-bionic-aarch64-packages.orig
というファイル名に変更します。
cd Linux_for_Tegra/tools/samplefs mv nvubuntu-bionic-aarch64-packages nvubuntu-bionic-aarch64-packages.orig
次に最小構成のパッケージリスト入手するため、FireFoxブラウザを立ち上げ、こちらのページを表示し、Rawボタンをクリックします。
ファイルの中身のみが表示された画面上で右クリックし、Save Page As…をクリックします。
Downloads以下にファイルを保存します。
保存したファイルを今いるc100-bootupdディレクトリ直下に移動し、nvubuntu-bionic-aarch64-packages
にコピーします。
mv ~/Downloads/nvubuntu-bionic-minimal-aarch64-packages . cp nvubuntu-bionic-minimal-aarch64-packages nvubuntu-bionic-aarch64-packages
これでnvubuntu-bionic-aarch64-packages
が最小構成のパッケージリストになったのですが、ビルドやネットワーク接続に必要なライブラリすら入っていないので、追加していきます。
build-essential
、git
、network-manager
が元のGUI込みのパッケージリストに入っていたので、egrep
コマンドで取り出して、最小構成のパッケージリストに書き足します。
egrep '^(build-essential|git|network-manager)=' nvubuntu-bionic-aarch64-packages.orig >> nvubuntu-bionic-aarch64-packages
これでパッケージリストの準備ができたので、eMMC用のファイルシステムを構築していきます。
sudo ./nv_build_samplefs.sh --abi aarch64 --distro ubuntu --version bionic | tee nv_build_samplefs.log cd ../../rootfs sudo rm -rf */ sudo tar xpf ../tools/samplefs/sample_fs.tbz2 cd .. sudo ./apply_binaries.sh cd tools sudo ./l4t_create_default_user.sh -u user -p 1234 -n C100 -a --accept-license cd ..
l4t_create_default_user.sh
の引数の意味は以下ですので、お好みで設定値を変更してください。
オプション | 意味 |
---|---|
-u ユーザ名 | ユーザ名 |
-p パスワード | パスワード |
-n マシン名 | マシン名 |
-a | 自動ログイン |
–accept-license | ライセンス承諾(必須と思われます) |
Wi-Fiでネット接続する場合、ドライバが必要になります。
私はこちらの記事のTP-WN725Nを使用するので、ファイルシステムのユーザのホームディレクトリ以下にドライバのビルド環境(GitHubから入手)を展開します。
cd rootfs/home/user git clone https://github.com/lwfinger/rtl8188eu.git cd ../../..
rootfs/home/user
のuser
の部分はl4t_create_default_user.sh
実行時の-u
オプションで指定した名称になりますので、適宜置き換えてください。
また展開すべきドライバはお使いのWi-Fi機器によって異なりますので、適切なものをお使いください。
これでeMMC書き込みの準備が整いましたので、次はいよいよ書き込みです。
以下のコマンドでNano C100のeMMCドライブに書き込みます。
sudo ./flash.sh jetson-nano-emmc mmcblk0p1
「〜 flashed successfully.」のように表示されれば書き込み成功です。
Nano C100をeMMCから起動
PCとのUSB接続を外し、Nano C100の電源を落としてからジャンパーピンを外し、再度電源を入れます。
上記で設定したユーザ名でログインした状態でターミナルが立ち上がります。
Wi-Fi接続
Wi-Fiドライバをビルドするためにmake
コマンドを使用しますが、時刻が合っていないとうまくビルドできないので、まず現在時刻を手動で設定します。
sudo timedatectl set-ntp false sudo timedatectl set-time "2023-06-02 09:06:00"
Wi-Fiドライバをビルド、インストールし、再起動します。
cd rtl8188eu make sudo make install sudo reboot
以下のコマンドでWi-Fiの状態を確認します。
nmcli radio wifi
enabledと表示されればWi-Fiは有効な状態です。
有効でない場合、以下のコマンドで有効にします。
sudo nmcli radio wifi on
以下のコマンドでデバイスの一覧が表示され、ステータスを確認できます。
nmcli device status
以下のように表示され、Wi-Fiにはつながっていないことがわかります。
DEVICE TYPE STATE CONNECTION wlan0 wifi disconnected -- eth0 ethernet unavailable -- ...
接続可能なWi-Fi SSIDをリストアップします。
nmcli device wifi list
お使いのSSIDが表示されていることを確認し、以下のコマンドでWi-Fiに接続します。
sudo nmcli --ask device wifi connect 'SSID' ifname wlan0
SSIDの部分は、お使いのSSID名で置き換えてください。
Wi-Fiパスワードを聞かれるので、入力するとWi-Fiにつながると思います。
インターネット接続を確認するため、以下のコマンドを実行します。
ping google.co.jp
“Unknown host”や”Request timed out”といったエラーが出ず、一定間隔でパケット情報が表示され、Ctrl+Cで終了した際に”0% packet lost”となっていれば、インターネットに接続できています。
時刻設定
以下のコマンドで時刻設定の情報を表示します。
sudo timedatectl
以下のように表示されると思います。
Local time: Thu 2023-03-02 12:59:42 UTC Universal time: Thu 2023-03-02 12:59:42 UTC RTC time: Sat 2000-01-01 01:01:50 Time zone: n/a (UTC, +0000) System clock synchronized: no systemd-timesyncd.service active: no RTC in local TZ: no
ここで着目すべきは、System clock synchronizedがnoで自動調整がOFFになっていること、Time zoneがn/aでUTC、およびLocal timeの最後にもUTCとあり、Universal timeと同一になっていることです。
以下のコマンドで自動時刻調整をONにします。
sudo timedatectl set-ntp true
UTCはイギリスの時間帯なので、以下のコマンドで日本に合わせます。
sudo apt install tzdata sudo timedatectl set-timezone Asia/Tokyo
これで再度sudo timedatectlを実行すると以下のようになり、日本時間に合うはずです。
Local time: Sun 2023-06-18 09:13:57 JST Universal time: Sun 2023-06-18 00:13:57 UTC RTC time: Sat 2023-06-18 00:13:58 Time zone: Asia/Tokyo (JST, +0900) System clock synchronized: yes systemd-timesyncd.service active: yes RTC in local TZ: no
初期設定
sudoのパスワードタイムアウトを無効化します。
sudo visudo
ファイルの末尾に以下の行を書き足します。
Defaults timestamp_timeout=-1
最初のアップデートを行います。
sudo apt update sudo apt upgrade
冷却ファンの設定をします。
git clone https://github.com/Pyrestone/jetson-fan-ctl.git cd jetson-fan-ctl/ sudo ./install.sh
上記を実行後、冷却ファンが回れば成功です。
Tensorflowの実行
nvidia-jetpackのインストールを行います。
sudo apt install nvidia-jetpack
以下のコマンドでTensorflowのインストールを行います。
sudo apt update sudo apt -y install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran sudo python3 -m pip install --upgrade pip sudo pip3 install -U pip testresources setuptools==49.6.0 sudo apt install python3-h5py sudo pip3 install -U numpy==1.16.1 future==0.18.2 mock==3.0.5 keras_preprocessing==1.1.1 keras_applications==1.0.8 gast==0.2.2 futures protobuf pybind11 sudo pip3 install --no-cache-dir --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v461 'tensorflow<2'
以下のコマンドで使用CPU数とクロック周波数を最大に設定します。
sudo jetson_clocks
続いてGitHubからMNISTの実行サンプルをダウンロードします。
git clone https://github.com/tak6uch1/cuda-tensorflow
mnist_cnn.py
を実行します。実行時間測定のためにtime
コマンドを使用しています。
cd cuda-tensorflow/work time python3 mnist_cnn.py
以下のように結果が表示されれば成功です。
Test loss: 0.765024191570282 Test accuracy: 0.8433 real 10m52.775s user 1m57.548s sys 0m34.868s
Micro SDカード起動でのTensorflow MNIST実行は15分42秒だったので、上記は3割程度速いです。
eMMCの方がSDカードよりも高速という謳い文句は本当のようです。
DISKアクセス速度測定
DISKアクセス速度の測定を行い、eMMCとSDカードを比較します。
eMMCの結果を先に記載し、続いてMicro SDカード起動の場合を記載します。
まず、以下のコマンドでDISKの名前を確認します。
lsblk
MOUNTPOINTが/と表示されるのが、mmcblk0p1になっていると思います。
DISK読み込みスピード測定に使用するhdparm
をインストールします。
sudo apt install hdparm
以下のコマンドで読み込みスピードを測定します。
sudo hdparm -tT /dev/mmcblk0p1
私の場合、以下のようにキャッシュ使用あり/なしのアクセススピードが表示されました。
/dev/mmcblk0p1: Timing cached reads: 3342 MB in. 2.00 seconds = 1673.27 MB/sec Timing buffered disk reads: 796 MB in. 3.0 seconds = 265.31 MB/sec
Micro SDカード起動の場合は以下だったので、buffered disk readsの方は10倍程度速いですね。
/dev/mmcblk0p1: Timing cached reads: 3274 MB in. 2.00 seconds = 1638.97 MB/sec Timing buffered disk reads: 70 MB in. 3.08 seconds = 22.70 MB/sec
続いて以下のコマンドで書き込みスピードを測定します。
sudo dd if=/dev/mmcblk0p1 of=test bs=1G count=1 oflag=direct
私の場合、以下のように表示されました。
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 18.9407 s, 56.7 MB/s
Micro SDカード起動の場合は以下だったので、5倍くらい速いですね。
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 99.9844 s, 10.7 MB/s
Micro SDカード起動を復活させる
前章の「eMMC起動 その2(初期化)」を実施後は、Micro SDカードを差し込んでもeMMCから起動してしまう状態になり、Micro SDカードからの起動および、c100.img.zxを書き込んだMicro SDカードでの初期化ができなくなってしまいます。
こちらにMicro SDカード起動できるようにする方法の記載がありましたが、うまくいきませんでした。
工場出荷状態から初回のc100.img.xzによる初期化後、eMMCからU-Bootに関係するファイルを吸い出してコピーする方法でうまくMicro SDカード起動を復活させることができたので、吸い出したデータをこちらのGitHubリポジトリに保存しました。
そのデータを利用して、eMMCからしか起動できなくなった状態から、Micro SDカードからも起動できるようにする方法を説明します。
まず、下図のようにデバッグ用のUSBシリアル接続とMicro USB端子からの2系統のUSB接続を行います。
使用したUSBシリアルモジュールはFTDI社のチップが載ったもので、特にドライバのインストールなどは不要で使用できました。
USBシリアルモジュール上にあるジャンパーピンで3.3Vと5Vを選択できるようになっていて、Nano C100のインターフェイスが5Vのようだったので、5V側に設定しました。
Nano C100とUSBシリアルモジュールのGND同士をつなぎ、Nano C100のRXにはUSBシリアルモジュールのTX、Nano C100のTXにはUSBシリアルモジュールのRXをつなぎます。
Nano C100のRX/TXはMicro SDカードの差込口側にある端子を使用します。(UART RXD, UART TXDと記載のある端子です)
eMMC初期化の際に付けていたFCRECのジャンパーピンは外しておきます。
この状態で以下のコマンドを実行してUSB接続を確認します。
lsusb
正しくUSBシリアルモジュールが認識されていれば、表示された一覧の中に以下のような行があるはずです。(使用するUSBシリアルモジュールの機種によって表示は異なります)
Bus 001 Device 055: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
私の場合、USBシリアルモジュールは/dev/ttyUSB0
としてUbuntu PCから見えていましたので、以下のコマンドでUART接続を確立しておきます。
sudo screen /dev/ttyUSB0 115200
screenコマンドは、UART通信で文字情報のやり取りをするためのターミナルアプリケーションです。
Nano C100にはMicro SDカードを差し込んでおきます。
Nano C100の電源を入れると「Hit any key to stop autoboot: 」と表示され、その右の数値が2→1→0と減っていきます。
このコメントが出ている間に何かのキーを押すと下図のようにU-Bootのプロンプトが出て入力待ち状態になります。
U-Bootのプロンプトが表示された状態で、以下のコマンドを打ち込みます。
ums 0 0
これで、Nano C100のMicro USB端子との接続側がUbuntu PCからUSB接続のドライブとして見えるようになります。
screenコマンドを立ち上げたターミナルは、U-Bootの操作に使用するため、別のターミナルウィンドウを立ち上げて以降のコマンドを実行します。
dfコマンドでドライブ名と容量を確認します。
df
14GB程度に見えるドライブがeMMCになります。私の場合、/dev/sdb1
でした。
以下のコマンドを入力して、Nano C100のeMMCを/mnt
にマウントします。
sudo mount /dev/sdb1 /mnt
次にU-Bootに関係するファイルをダウンロードして、/mnt
にマウントしたNano C100のeMMCにコピーします。
git clone https://github.com/tak6uch1/NanoC100_SDboot.git cd NanoC100_SDboot ./run_cp.sh
/mnt
のマウントを解除します。
sudo umount /mnt
ums 0 0
を入力したU-BootのターミナルでCtrl+Cを押して、U-Bootのプロンプトに戻り、以下を入力します。
reset
これでNano C100が再起動し、自動的にシャットダウンします。
再度、Nano C100の電源を入れるとMicro SDカードから起動できるようになっているはずです。
screenコマンドを終了するには、Ctrl+Aを押した後に”\”(バックスラッシュ)を押し、終了するか聞かれるので”y”を押します。
トラブルシューティング
eMMCへの書き込み失敗
flash.sh
を実行しても途中で止まってしまって書き込みに失敗することがありました。
sudoパスワードのタイムアウト無効化を行うことで、正常に書き込みが終了するようになりました。
Wi-Fiにつながらない
初回のWi-Fiドライバビルド・インストール後にWi-Fi子機を認識しない状態になりましたが、一度抜き差しすることで認識しました。
また、update, upgrade後にWi-Fi子機を認識しなくなることはLinuxではよくあり、この場合、Wi-Fiドライバをビルドしたディレクトリに移動し、以下を実行します。
cd rtl8188eu sudo make uninstall make sudo make install
上記の後、Wi-Fi子機を抜き差しすると認識しました。
まとめ
Jetson-Nanoの互換機OKdo Nano C100のセットアップからTensorflowの実行確認と実行速後の測定を、SDカード起動およびeMMC起動の両方で行いました。
また、本家Jetson-Nanoでも同じ方法で実行速度を測定して比較したのが下表になります。
Jetson-Nano (SDカード起動) | Nano C100 SDカード起動 | Nano C100 eMMC起動 |
|
---|---|---|---|
キャッシュ使用読み込み | 1635 MB/s | 1638 MB/s | 1673 MB/s |
キャッシュ不使用読み込み | 89 MB/s | 22 MB/s | 265 MB/s |
書き込み | 26 MB/s | 10 MB/s | 56 MB/s |
MNIST実行時間(Tensorflow) | 15 m 7 s | 15 m 42 s | 10 m 52 s |
Nano C100の謳い文句であるeMMC搭載により、ストレージアクセスが高速というのは確かですね。
Tensorflowの実行時間が3割程度改善するので、処理速度で悩んでいた方には朗報だと思います。
頻繁にストレージにアクセスするようなアプリケーションでは、よりeMMCによる高速化が効いてくると思います。
少々意外だったのが、同じSDカード起動であってもNano C100は本家Jetson-Nanoより遅いということです。
これは、SDカードスロットが上の基盤(2階部分)にあるJetson-Nanoと、下の基盤(1階部分)にあるNano C100ではハードウェアの構造に違いがあり、アクセス速度の差になって現れていると思われます。
したがって、GUIを前提としてSDカード起動での使用をメインに考えている方は、本家Jetson-Nanoを使用すべきと言えます。
以上のことから、Nano C100は、本番運用で高速に動作させたいとうニーズに応える製品と言えます。
ただし、eMMC起動はCUIでの操作が必要になるのが、初心者泣かせです。
本家Jetson-Nano Computing Module(eMMC搭載)は、2階建て構造の2階部分単体の製品となっていますが、ハードウェア互換のNano C100は、1階部分のUSBやHDMI端子を含んだ製品になっているので、開発段階はMicro SDカード起動のGUIを使用し、実運用段階ではeMMC起動にするという使い方が可能です。
Jetson-Nano開発者キットとJetson-Nano Computing Module双方のいいとこ取りをした製品と言えます。
このような2段階運用をしたい方には最適な製品と言えるでしょう。
OKdo Nano C100購入例(Amazon/IoT本舗)
ものづくりに興味があり、いろいろ触り始めたらLinuxの知識が必要になって困っているという方向けに以下のページを作成しましたので、よろしければ参考にしてください。
参考文献
- Nano C100の初期設定(https://iothonpo.com/nano-c100-setup/)
- GitHub: LetsOKdo/c100-bootupd(https://github.com/LetsOKdo/c100-bootupd)
- OSをクリーンインストール – reComputer J1010(https://lab.seeed.co.jp/entry/2022/06/06/120000)
- Jetson のストレージ使用量の削減(https://developer.nvidia.com/ja-jp/blog/minimizing-storage-usage-on-jetson/)
- Option: Starting with Minimal L4T(https://nvidia-ai-iot.github.io/jetson-min-disk/minimal-l4t.html)
- GitHub: NVIDIA-AI-IOT/jetson-min-disk(https://github.com/NVIDIA-AI-IOT/jetson-min-disk)