2021/05/03

Jetson-nano で tensorflow & tfjs-node-gpu 動かすまで(多分最短手順)

install

Jetson-nano devkit 買ったはいいものの、CUDAとかTensorRTとかでガリガリやる時間はないのですよ。もっと簡単に手早く既存の学習済みモデルで遊びたいのですよ。

python3 + tensorflow と nodejs + tfjs-node-gpu を動かしたい。だけど普通のインストールだとまともに動かない。特にtfjsはaarch64のプリビルドパッケージがないため、自分でビルドしないとならないが、tfjs-nodeをビルドするために必要な libtensorflow をまずは作らないとならず、これが尋常じゃないほど大変。
というか、自分はまだ成功していない。
ということで、先人の力を借りて、とにかく最短で動くところまでの手順を紹介します。

自分のJetson-nano環境

installed JetPack 4.5.1

$ cat /etc/nv_tegra_release
# R32 (release), REVISION: 5.1, GCID: 26202423, BOARD: t210ref, EABI: aarch64, DATE: Fri Feb 19 16:45:52 UTC 2021

$ cat /usr/local/cuda-10.2/version.txt 
CUDA Version 10.2.89

$ node -v
v14.16.1
$ npm -v
6.14.12

Tensorflow 手順

$ python3 -m venv tf
$ . ~/tf/bin/activate
$ pip install --upgrade pip
$ pip install numpy==1.19.4
$ pip install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v45 tensorflow 
  1. venvでtensorflow用のpython3環境を作る
  2. 作った環境をアクティベートする(pipが使えるようになる)
  3. pipアップグレード(しないとその後のインストールが上手く出来ない)
  4. numpy v1.19.4を先に入れる
    • 1.19.5はnanoのarm64でサポートしてない命令を使っているらしく、importすると Illegal instructionになる。いずれ解決されるだろう。
  5. tensorflowをnvidiaが提供するパッケージをインストールする
    • 芋づる式に依存パッケージがどっさり入る
    • h5pyとかが自動的にビルドされる(時間かかる)

以下のようにtensorflowをインポートしてみてlibcudart.soがロードされればOK

$ python -c "import tensorflow"
2021-05-03 13:43:44.320234: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.10.2

tfjs-node-gpu 手順

$ npm init
$ npm install @tensorflow/tfjs-node-gpu@3.3.0
  1. 適当なディレクトリ掘ってnpm init
  2. tfjs-node-gpuをインストール
    • 3.4.0以上だと以下の手順で入れるlibtensorflowではビルドできなかった

node_modules/@tensorflow/tfjs-node-gpu/scripts/custom-binary.json を作成して以下を記述

{
  "tf-lib": "https://s3.us.cloud-object-storage.appdomain.cloud/tfjs-cos/libtensorflow-gpu-linux-arm64-1.15.0.tar.gz"
}
$ npm rebuild @tensorflow/tfjs-node-gpu
  1. tfs-node-gpu をビルド(custom-binary.jsonで指定したライブラリが使用される)
  2. 時々libtensorflowダウンロードがスタックする時がある。その時はkillして再実行

https://www.tensorflow.org/js/guide/nodejs?hl=ja を試してみて動けばOK

import * as tf from '@tensorflow/tfjs-node-gpu'

libtensorflow-gpu-linux-arm64-1.15.0.tar.gz のダウンロード先は、 https://enricopiccini.com/en/kb/HOW_TO_RUN_TensorflowJs_in_NodeJs_on_NVidia_Jetson_Nano_arm64-658 を参照させてもらいました。

まだ色々試したわけじゃないけど、とりあえず絶望的な状況からは脱した。
できれば最新のlibtensorflow-gpu-linux-arm64を作るか、cdn見つけたい。

2021/02/08

Jetson Nano devkit(B01)+USBドライブブート

 久しぶりの投稿です。数年GPU/AI関連の組み込み系の仕事をしていましたが、昨年からWeb系になり、なんとなくブログも再開ですかね。

で、久しぶりのネタは、NVIDIA Jetson Nanoです。前回の仕事でTegraTX2とかいじってましたが、そういう仕事から離れてしまったので個人的に購入してみました。

セットアップする際にSDcardからブートするのはいいとして、自分がやりたいのはUSBでつないだSSDドライブからのブートです。

色々記事を読むと rootOnUSB を使うのが良さそう?と、やってみましたが、うまく起動しませんでした。無理やり起動させることは出来ましたが、安定しませんでした。rootOnUSBのリリースノートには、L4T 32.2.3 と書かれてますね。なるほど。今現在のJetPackSDK(4.5)のL4Tは32.5です。だからだめなんですかね。

つうことで、JetPackSDK(4.5)のリリースノートを読むと、なんとブータブルUSB drive対応と書かれています。やってみました。ちゃんと出来ました。ブート時、SDcardも不要です。SDcardがなければ自動的にUSBドライブからブートするシーケンスになっています。

以下自分がやったこと

昔何かで使って余っていたIntel SSD 600pシリーズ 512GB M.2 PCIEx4をUSB-SSDケースに入れ、Nanoに接続

JetsonNanoのJ50の9と10をショートさせて、リカバリーモードで起動する

JetsonNanoのflush port(microUSB port)からLinuxホストマシンへ、USBシリアルデバイス ftdi232 経由で接続。ホストでlsusbすると

Bus 001 Device 029: ID 0955:7f21 NVIDIA Corp. APX

って出てくる。7f21ってのがリカバリーモードで接続されているってことになるらしい。

LinuxホストにSDKManagerをインストール。手動でもできるようだが、勝手がわからないので無難に。と思ったがSDKManagerはUbuntu 16.04か18.04じゃないと動かないと!自分の環境は20.04。実際に動かしてみるとバージョンが合わないというメッセージが出て先に進めない。。。dockerで18.04動かしてX動かしてとも考えたが、超めんどい。

/etc/os-releaseのVERSION_IDを"18.04"に書き換えると動くという情報があり、やってみたら無事に動いた!よかった。。。

SDKManagerでの作業を進める。SSDドライブへのフラッシュも問題なく行えた。
こちらからフラッシュするドライブを選択とかしないのかな?と思ったけど特に指定することなく自動認識されたようだ。
フラッシュが完了したあたりで、JetsonNanoがリブートするので、リカバリージャンパーは外しておく。あとはSDcardでやることと同じ。

シリアルコンソールで確認
Jetsonのシリアルコンソールにドライブのinodeが破損している的なメッセージが出たが、何度かe2fsckを行って修復した。
あと、tegra-xusb 70090000.xusb: ERROR Transfer event for disabled endpoint or incorrect stream ring とかなんとかエラーが出てる。これは Quick Summary on Using USB external disk for Jetson Nano で解決した。
シリアル接続は こちら を参考にした。手元にesp32cam用に使っていたftdi232を使って接続した。
シリアル端末はminiconやcuを使う話が多いが、自分はscreenを使った。cuだとキー入力が送られなかった。sudo screen /dev/ttyUSB0 115200 って感じ。

ここまで動いたら、JetPack SDKはSDKManager使わなくても
sudo apt update
sudo apt install nvidia-jetpack

 で入る。この方がアップデートもしやすい。

次やりたいのが、headless起動でもx11vnc使って1920x1080リアルフレームバッファのリモートデスクトップ環境が作れないかと。edid読むようにカーネルビルドしただけではだめっぽい。やってる人いたら教えてほしいです。

$ xrandr --fb 1920x1080

で普通にできた!ポイントは、x11vnc経由でちゃんとログインすること。その後ならxrandrが使える。ディスプレイ出力しないので、fb解像度だけ設定すれば良い。~/.xsessionrcの最後に書いておけばログインしたときに自動的に拡張される。

2017/09/29

シンプルなOpenboxにちゃんとした日本語環境構築

久々の投稿です。

最低限のデスクトップ環境+ちゃんとした日本語環境セットアップをDockerイメージとして構築してみた。という内容です。

今まで何かを動かすためにlxcやlxdでコンテナ作ってせっせとセットアップして、そのセットアップ手順とかをブログにつらつらと書き残していました。
しかし最近、Dockerの便利さを知ってしまってからはDockerイメージからスタートすることが多くなってます。

しかし日本語環境が(日本語入力も含めて)ちゃんとセットアップされているDockerイメージがないなぁと。ということで自分の好みにあったシンプルかつちゃんと使える日本語デスクトップ環境のDockerイメージを作ってみました。

デスクトップはOpenbox。IMEはfcitx-mozc。エディタはEmacs。ブラウザはFirefox。それ以外は最低限のツールのみというシンプルな環境。
VNC環境は大好きなx11vncです。ついでにnoVNCからも使えるようにしました。

これだけでも、ちゃんと使える日本語環境にするのは面倒な作業です。その面倒なセットアップ作業を全部一気にDockerがやってくれます。

いつもだと構築手順をここに書いてましたが、今回はDockerファイルセットをGitHubに入れました。同時にDockerHubにもイメージを置いてみました。

* GitHub
https://github.com/hiroshi-nishiura/openbox-mozc-docker

* DockerHub
https://hub.docker.com/r/hironishi/openbox-mozc-docker

DockerHubの使用は今回が初です。
細かな設定手順をあちこちに記録しなくてもいいなんて、いやー便利ですねぇ。