Movidius NCSをTinker Boardから使う

Movidius NCSはRaspberry Pi (以下、RasPi)にも対応しています。RasPiのアーキテクチャはarmhf、OSはDebianベースのRaspbianです。どこかに似たような環境がありませんでしたか? そう、ASUS Tinker Boardです。Tinker Boardもarmhfアーキテクチャ、DebianベースのTinker OSで動作します。これはTinker Boardで動かしてみる価値がありそうです。

ということで試行錯誤してみた結果、動作させることができましたので情報を整理しておきます。キーポイントは

  • TinkerOSのPython3.5.3は互換性がなくNG
  • python3-setuptools, python3-wheelを事前に手動インストール
  • armhf向けの再配布用debパッケージを手動インストール

あたりです。

※注) 以下の方法はTinker Board上でMovidius NCSが安定して動作することを保証するものではありませんのでご注意下さい。

Tinker Boardはセットアップ済みとします。まずはapt lineを編集してベースをStretch (stable)からBuster (testing)へ変更し、システムを更新します。

$ sudo vi /etc/apt/sources.list
deb http://http.debian.net/debian/ testing main contrib non-free
#deb-src http://http.debian.net/debian/ stretch main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free
#deb-src http://security.debian.org/ stretch/updates main contrib non-free
deb http://http.debian.net/debian/ buster-updates main contrib non-free
#deb-src http://http.debian.net/debian/ stretch-updates main contrib non-free

$ sudo apt update
$ sudo apt upgrade
$ sudo apt clean

src行もコメントアウトしてあります。おそらくaptコマンドで -t オプション指定してpython3だけtestingにすれば問題はないと思いますが、私は普段使いの環境もtestingなのでここではシステム全体をtestingにしています。この後に、

$ sudo apt install python3-setuptools python3-wheel

しておきます。この二つがインストールされていないと、SDKのインストール時にエラーになったりします (wheelの方はインストールしなくても大丈夫なようですが念の為)。

システムの更新が済んだら、SDKをインストールしていきます。まずはToolkitから。こちらはUbuntu環境と同様に展開してbin/setup.shを実行すればOKですが、だいぶ時間が掛かります。CPUをぶん回すためか、Tinker Boardもだいぶ熱くなりますのでご注意を。

次にAPIのインストールですが、その前にarmhf向けの再配布用debパッケージをインストールします。APIのtar.gzを展開したncapi/redist直下にもdebパッケージファイルがありますが、ここではさらにその下のpi_jessieディレクトリ以下にあるdebパッケージをインストールします。

$ sudo dpkg -i ncapi/redist/pi_jessie/*_armhf.deb

なお、ncapi/redist直下のpython3-mvncパッケージはpython3.5用、pi_jessie以下にある同名のパッケージはpython3.4用のようです。TinkerOSはpython3.5なので、pi_jessie以下のパッケージはインストールする必要はありません (all = 全アーキテクチャ向けなので前者で問題ありません)。

一旦ターミナルを開き直してToolkitが設定した環境変数を反映させてからAPIをインストールします。debパッケージをインストールしたら、ncapi/setup.shでAPIをインストールします。caffeモデルのDLにはしばらく時間が掛かりますが、その後のコンパイルはすぐ済みます。

最後にbin/data/dlnets.shを実行してcaffeのネットワークモデルをDLしたら、さっそくMovidius NCSをTinker Boardに挿してみましょう。OSの再起動は不要でした。

$ sudo dmesg | grep MA2X5X
[...] usb 1-1.4: Product: Movidius MA2X5X

OSから認識されているようですので、example00〜03を実行してみましょう。

$ cd ~/workspace/mvncsdk/bin/
$ make example00
$ make example01
$ make example02
$ make example03

エラー等も発生せず、問題なく実行できるかと思います。

ASUS Tinker Boardをセットアップする

Raspberry Pi 3より高性能であることがウリのシングルボードコンピュータ、ASUS Tinker Boardが販売されています。発売直後は入荷数が少なくて入手が難しい状況でしたが、米Amazon.comからも技適マーク有りの購入できることもあり、今は国内代理店にも常時在庫があるような状況です。

具体的なスペックはTinker Boardのサイトにお任せするとして、個人的にはGbEに対応していることが嬉しいです。

セットアップ方法ですが、基本的にはサイトにあるGetting Startedの通りに作業すればOKですが、Linux上でセットアップする際に実行するよう指定されているFlashUSB.shというスクリプトがどこにあるのか分かりませんので、いつものようにコマンドラインから

$ sudo dd if=output.img of=/dev/sdb seek=0 bs=16M conv=notrunc

(microSDが/dev/sdbの場合) のように直接実行すればOKです。私は慣れているDebianベースのTinkerOSをインストールしました。中身はほとんどDebianそのものです。デフォルトではXの解像度が低めに設定されているようです。

インストール後はlinaro/linaroでログインして、

$ sudo apt update
$ sudo apt upgrade

で環境を最新にします。必要に応じてlvやtmux等をインストールして下さい。ifconfigでIPアドレスを確認すれば、以降はSSHでリモートログインして作業できるようになります。時刻がズレている時は

$ sudo dpkg-reconfigure tzdata

でAsia/Tokyoを選択しましょう。その他、必要に応じてLANGやEDITOR, PAGER等の環境変数を設定しておきましょう。

GitBucketをDockerで動かす

DockerDocker Composeをインストールしましたので、試しに何か動かしてみましょう。まずは基本のhello worldから。

$ docker run --rm hello-world

Hello from Docker!
...

メッセージが表示されました。問題なく動作するようです。ここでpermission云々言われる場合は、ユーザをdockerグループに追加するかsudoを付けて実行して下さい。

さて、今回はGitサーバの一実装であるGitBucketをDockerで動作させたいと思います。GitBucketは開発者がdocker imageを公開しているので、コマンドライン一発で使えます。ここでは少しオプションを変えて実行します。

$ docker run --rm -p 8080:8080 takezoe/gitbucket
...

これだけで、HTTP 8080番ポートから利用できるようになります。インストール直後のユーザ名/パスワードは root/root です。しかしこのままではコンテナを止めるとファイルも消えてしまいますので、永続化させましょう。ついでにSSHでもアクセスできるようにします。Ctrl+Cで実行中のコンテナを止めて、

$ mkdir gitbucket
$ docker run --rm -p 8080:8080 -p 29418:29418 -v ./gitbucket:/gitbucket takezoe/gitbucket
...

これで、SSHでもアクセスできるようになり、コンテナを止めてもファイルが永続化されるようになります (SSHアクセスのためにはGitBucket側の設定も必要です)。このタイミングでrootユーザのパスワードをデフォルトのものから変更しておきましょう。

“GitBucketをDockerで動かす” の続きを読む

Docker Composeをインストールする

引き続き環境設定です。

Dockerをインストールしたことでサービスをコンテナ上のプロセスとして起動できるようになりましたが、先の記事にも書いたようにマイクロサービスアーキテクチャ的なアプローチでは複数のプロセス(サービス)を立ち上げる必要があります。しかし素のdockerコマンドは複数のコンテナを立ち上げるには少々不便です。そこで複数のコンテナを一つの設定ファイルで管理すべくDocker Composeを導入します。

Debian Stretch (testing)にはdocker-composeパッケージが提供されていますが、バージョンが少々古め(記事執筆時点で1.8.0)です。なるべく新しめのバージョンを利用したいので、ここではgithubからバイナリを取得、インストールしてみたいと思います。これまたインストール方法の詳細はDocker Composeのサイトに記述のある通りですが、インストール先をホームディレクトリの下の ~/bin に変えてみます。

$ mkdir ~/bin
$ curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o ~/bin/docker-compose
$ chmod +x ~/bin/docker-compose
$ vi ~/.bash_profile
...
export PATH=$PATH:~/bin
...
$ . ~/.bash_profile

既に~/binにPATHが通っている場合は適宜読み飛ばして下さい。また、システム全体でdocker-composeコマンドを使えるようにしたい場合はサイトに記載されている通り、/usr/local/binにインストールするのが無難かも知れません。

なお、多少バージョンが古くてもよい場合は sudo apt-get install docker-compose でもOKです。Docker Composeのサイトには pip install する方法も記載されていますが、個人的にはpipはvirtualenv環境下でしか使いたくないのでスルーしています。

Dockerをインストールする

Intel JouleJetson TX1のようなエッジ機器だけあってもIoTは成り立ちません。エッジから押し上げられるデータを受け止めるサーバ/クラウドサイドの仕組みも必要です。単純には、Linux等でサーバを立ち上げて、その上にエッジからのデータを受け取る機能と保存する機能、保存したデータを利用する機能を実現することになります。

従来のシステム開発ではこれらの機能をモノリシックなウェブサービスとして構築してきましたが、今時は単機能なマイクロサービスを(オープンな)プロトコルで疎に結合するアーキテクチャが流行りです。これを実現するために、Dockerコンテナを利用しましょう。

Dockerコンテナの技術的な説明は他の情報源に譲ります。

“Dockerをインストールする” の続きを読む