UbuntuでGithubからSSHクローンができないとき、以下の設定をする
~/.ssh/config
ファイルに以下を加える
Host github.com
IPQoS none
ポイントはIPQoS設定。"github ssh ipqos"で調べると色々出てくる
回線、IPv6など特定条件で起きるらしい
UbuntuでGithubからSSHクローンができないとき、以下の設定をする
~/.ssh/config
ファイルに以下を加える
Host github.com
IPQoS none
ポイントはIPQoS設定。"github ssh ipqos"で調べると色々出てくる
回線、IPv6など特定条件で起きるらしい
大したものではありませんが、以前作成したものを整理してGithubで公開しました。
最近はWebとかAIとかの仕事が増えて、デバイスよりのことは趣味でしかできなくなってきたのがちょっと寂しい。。。
前回かいた記事 で UnitVでsensor.snapshot()だけで10fpsと書いたんですが、ファームの問題でした。今更感がありますが、ファームについて書いておこうと思います。
https://docs.m5stack.com/en/quick_start/unitv/unitv_quick_start_maixpy を参照して素直にセットアップすると、M5StickVと同じファームを入れる流れになりますが、このファームが sensor の動作周波数を12MHzと設定しているためでした。しかもこのページ内のファームはファイル名はv5.1.2となっていますが、中のファームは0.5.0で結構古い。
新しいファームは https://dl.sipeed.com/shareURL/MAIX/MaixPy/release/master に置いてあって現時点では、maixpy_v0.6.2_58_g783789e06 が最新。
ここに _m5stickv.bin がありますが、これではなく普通のmaixファームを使うと倍速の24MHzになり、UnitVのmicroPython上では20fpsで動くようになります。
前記事で書いたような mobilenet 1000class動かそうとするとフルスペックのファームだとメモリが足りません。よって minimum構成のファームにしたいわけですが、ここに置いてあるminimumたちは微妙に自分が使いたい組み合わせじゃないんですよね。
自分が使いたいのは IDE + _thread + ws2812 + sensor 24MHz + KPU V3 です。kpu V4サポートは今の所いらない。ws2812は大して使わないけど入れても大差ない。_threadはちょっと使いたい。IDEないと辛すぎ。こういう組み合わせがほしい。
ということでファームをビルドしよう!
オンラインでビルドできるサービスがあるようですがユーザ登録とかしないといけないので、ローカルに環境構築してビルドします。
https://github.com/sipeed/MaixPy/blob/master/build.md を見ながらやりますが、ここで要求されている環境はすでに入っているので以下の手順だけでOK。
$ git clone --recursive https://github.com/sipeed/MaixPy.git $ wget http://dl.cdn.sipeed.com/kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz $ sudo tar -Jxvf kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz -C /opt下が今回ビルドするときに使ったコンフィグファイルの内容(config_tiny.mk)
$ cd MaixPy/projects/maixpy_k210 $ python project.py clean_conf $ python project.py build --config_file config_tiny.mkすると、buildフォルダに maixpy.bin が出来上がります。サイズは736192でした。
maix_train は何とか動いたけれど結果が0,1しか出ないのはやはりつまらないです。
探してたら、MaxiPy_scripts に1000クラス分類できるやつあるじゃないですか。
この中の machine_vision/mobilenet_1000_class です。
ただ、ここには本体はなく説明だけです。目当てのkmodelは、説明にある通り https://dl.sipeed.com/MAIX/MaixPy/model に mobilenet_0x300000.kfpkg が入っているのでダウンロードします。
これをkflashで焼いて使うわけですが、でかいのでファームをminimunにして、GCヒープサイズも半分の256kbにしろとドキュメントには書いてあります。動くんでしょうけど、それは辛いです。。$ ../model_le2be.py m.kmodel
$ python kfpkg.py m_be一発で m_be.kfpkg を作ってくれます。そしたらこれを kflash します。
task=kpu.load_flash(model_addr, is_dual_buf(0/1), batch_size, spi_speed)
$ . ~/tf2/bin/activatemaix-trainクローン
$ git clone https://github.com/sipeed/maix_train.gitライブラリの事前インストール
$ cd maix_train $ pip install -r requirements.txt $ sudo apt install libgeos-dev初期化
$ python train.py init
instance/config.pyが作成される。中に色々設定が記述されている。プラットフォームに合わせて編集しろと説明がされているが、そのままトレーニング開始!$ python train.py -t classifier -z datasets/test_classifier_datasets.zip train
2021-08-11 16:16:25,330 - [INFO]: now generate kmodel
2021-08-11 16:16:25,331 - [INFO]: save model as .h5 file
2021-08-11 16:16:26,166 - [INFO]: save model as .tflite file
2021-08-11 16:19:08,334 - [ERROR]: failed: TrainFailReason.ERROR_INTERNAL, node error:[Errno 2] No such file or directory: '/home/jetson/maix/maix_train/instance/../tools/ncc/ncc_v0.1/ncc': '/home/jetson/maix/maix_train/instance/../tools/ncc/ncc_v0.1/ncc'
最後にnccがないってエラーが出てkmodelはできません。当然ですね。$ sudo apt install -y gcc-8 g++-8 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7 $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 7 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8 $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8 $ sudo apt install libgtk2.0-dev -y $ pip install conan現時点の最新を取得してcmake & make
$ git clone --recursive -b v0.2.0-beta4 https://github.com/kendryte/nncase.git $ cd nncase $ mkdir out && cd out $ cmake .. -DCMAKE_BUILD_TYPE=Release -DNNCASE_TARGET=k210かなり時間かかる。conan関係のビルドが。。。
ERROR: boost/1.71.0@conan/stable: Error in source() method, line 151 tools.get(url, sha256=sha256) AuthenticationException: Forbidden!bintrayから取得できない(死んでる?)ようなので、URLを変更する。
url = "https://dl.bintray.com/boostorg/release/%s/source/%s" % (self.version, zip_name)
url = "https://boostorg.jfrog.io/artifactory/main/release/%s/source/%s" % (self.version, zip_name)そして再度
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DNNCASE_TARGET=k210cmakeは成功したのでビルドしてみる
$ make -j4だめだー
mutex.cc:(.text+0x12c): undefined reference to `absl::base_internal::SpinLock::SlowUnlock(unsigned int)'
mutex.cc:(.text+0x160): undefined reference to `absl::base_internal::LowLevelAlloc::Alloc(unsigned long)'
mutex.cc:(.text+0x1f4): undefined reference to `absl::base_internal::SpinLock::SlowLock()'
・・・とかどっさりリンクエラー
軽く調べてみると、conanでortools/7.3@sunnycase/testing をrequireしていて、ortoolsがrequireしている abseil/20190619@sunnycase/testing がだめらしい。あちこちでabseilがリンクエラーするという記事が上がっているが、ドンピシャの解決方法が発見できず。conanバージョンを1.21.1にしてみろとか(やってみたがcmakeでエラー)、abseilのリンクライブラリ順番を依存順に変えてみろとか(どこでー?)・・・$ ../ncc-0.1.0rc5/ncc -i tflite -o k210model --dataset datasets/ m.tflite m_v3.kmodelkmodelが約2MBで出来ました。これをflashかsdに書いて、kpu.load()で読んでkpu.forward()する流れです。このとき、立地なファームを使っている場合メモリ不足でロードが失敗したり、ロードは成功するけど、今度はsensorのFB確保時にメモリ不足になったりします。その場合は、 https://dl.sipeed.com/shareURL/MAIX/MaixPy/release/master/maixpy_v0.6.2_57_gae955b706 から maixpy_v0.6.2_57_gae955b706_minimum_with_ide_support.bin あたりを使えば大丈夫です。
なんだかちょっと使おうかなと思うたびにやっている気がするが。。。
JetsonNanoでSSDブートとかやってたが、ブートしなくなった。SDブートに切り替えしばらく使っていたが、それもブートしなくなった。多分ちゃんとシャットダウンしなかったからかなぁと思っている。かなりセットアップが面倒になってきたので、基本SDブートで、/homeをSSDに分けることにした。壊れてもSD焼きだけで済むように。
JetPackは4.6のイメージを焼いた。ストレージ壊れる前は4.5.xだったがついでに上げる。
また同じことが起きる可能性大なので、Tensorflowセットアップ手順だけメモっておく。今回は https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html に沿って素直な手順で。ただ、そのとおりやっても引っかかる部分があるのでちょっとだけ手を加える。
最初にライブラリインストール
$ sudo apt install python3-dev libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran
venvでTF2.x用のローカル環境作って、TF2インストール
$ sudo apt install python3-venv $ python3 -m venv tf2 $ . ~/tf2/bin/activate
$ pip install -U pip testresources setuptools==49.6.0 wheel $ pip install -U numpy==1.19.4 future==0.18.2 mock==3.0.5 h5py==2.10.0 keras_preprocessing==1.1.1 keras_applications==1.0.8 gast==0.2.2 futures protobuf pybind11 $ pip install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v46 tensorflowh5pyのビルドに時間かかる。tensorflowインストール時にはgrpcioのビルドあたりからすごい時間かかる。https://developer.download.nvidia.com/compute/redist/jp/v46 をブラウザからアクセスしてもファイルリストが取れないため不安になるがpipからはアクセスできるようだ。grpcioが無事ビルドされたあとに以下のメッセージが。。
Attempting uninstall: six Found existing installation: six 1.16.0 Uninstalling six-1.16.0: Successfully uninstalled six-1.16.0 Attempting uninstall: keras-preprocessing Found existing installation: Keras-Preprocessing 1.1.1 Uninstalling Keras-Preprocessing-1.1.1: Successfully uninstalled Keras-Preprocessing-1.1.1 Attempting uninstall: gast Found existing installation: gast 0.2.2 Uninstalling gast-0.2.2: Successfully uninstalled gast-0.2.2keras-preprocessing, gast入れなくてよかったんじゃ?
$ deactivate $ python3 -m venv tf1 $ . ~/tf1/bin/activate
$ pip install -U pip testresources setuptools==49.6.0 $ pip install -U numpy==1.18.5 future==0.18.2 mock==3.0.5 h5py==2.10.0 keras_preprocessing==1.1.1 keras_applications==1.0.8 gast==0.3.3 futures protobuf pybind11 $ pip install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v46 'tensorflow<2'
M5StickCplus買いました。最初やりたかったのはBLEをプログラムして、ChromeのWebBluetoothから接続してみたかったから。BLE通してジャイロ情報送って簡単なアプリ作って。この時点でPlusじゃなくても良かったなと思ったけど、せっかく結構きれいなLCDが付いてるんで、カメラ接続してみたくなり、UnitV AI Camera買ってみた。
なぜかカメラだけのHatがないんですよね。M5CameraとかTimerCameraになってしまう。UnitVはM5StickVから色々取り除いた廉価版。AI処理用のKPUというのが入っているので簡単なモデルなら動くらしい。いずれやってみよう。
ここでは、StickCにCamera映像を描画することが第一目的だが、せっかくなのでUnitVに標準で入っている顔認識(tiny yolo v2)もついでにやってみたという内容。
まずはUnitV側のプログラム(MicroPython)
UnitVとStickCとは4Pinケーブルで接続してシリアル通信するので、UARTの設定をする。次にカメラ(sensor)の設定、KPUの設定、ループ内でカメラ>yolo処理>転送の流れ。
ポイントとしては、QVGAのまま転送すると超遅いので160x120にリサイズして、それをJPEG圧縮して転送している。だいたい1.5kbytesくらいになるので5fps位になる。
単純にカメラ処理だけなら10fps。KPU処理入れると8fpsくらい。転送が一番やばい。この時点で素直にM5StickVにしとけばと思ったが、遊びだしこの不自由さがまたたまらない!
最初からQQVGA(160x120)でやればと思ったが、yolo2がそのサイズを受け付けなかった。
そして以下がStickCplus側のプログラム
hostname -I > /tmp/ip.txt zenity --text-info --filename /tmp/ip.txt --width=800 --height=400 --font "Monaco 70"これを実行可能なスクリプトファイルとしてどこかに作成する
[Seat:*] greeter-setup-script=<スクリプトへのパス>
Jetson-nano devkit 買ったはいいものの、CUDAとかTensorRTとかでガリガリやる時間はないのですよ。もっと簡単に手早く既存の学習済みモデルで遊びたいのですよ。
python3 + tensorflow と nodejs + tfjs-node-gpu を動かしたい。だけど普通のインストールだとまともに動かない。特にtfjsはaarch64のプリビルドパッケージがないため、自分でビルドしないとならないが、tfjs-nodeをビルドするために必要な libtensorflow をまずは作らないとならず、これが尋常じゃないほど大変。
というか、自分はまだ成功していない。
ということで、先人の力を借りて、とにかく最短で動くところまでの手順を紹介します。
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
$ python3 -m venv tf
$ . ~/tf/bin/activate
$ pip install --upgrade pip
$ pip install numpy==1.19.4
$ sudo apt-get install libhdf5-dev
$ pip install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v45 tensorflow
以下のように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
$ npm init
$ npm install @tensorflow/tfjs-node-gpu@3.3.0
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
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見つけたい。
久しぶりの投稿です。数年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"に書き換えると動くという情報があり、やってみたら無事に動いた!よかった。。。
sudo apt update
sudo apt install nvidia-jetpack
で入る。この方がアップデートもしやすい。
次やりたいのが、headless起動でもx11vnc使って1920x1080リアルフレームバッファのリモートデスクトップ環境が作れないかと。edid読むようにカーネルビルドしただけではだめっぽい。やってる人いたら教えてほしいです。
$ xrandr --fb 1920x1080
で普通にできた!ポイントは、x11vnc経由でちゃんとログインすること。その後ならxrandrが使える。ディスプレイ出力しないので、fb解像度だけ設定すれば良い。~/.xsessionrcの最後に書いておけばログインしたときに自動的に拡張される。