HiFive Unlearshed (RISC-V)でスパースモデリング

HiFive Unlearshed (RISC-V)でスパースモデリング

こんにちは.昨年の11月からハカルスのインターンに参加している川野と申します.普段は大学院で昆虫の行動解析の研究をやっています(一応情報系の人間です).ハカルスではFPGA系のプロジェクトに参加しています.唐突ですが,最近RISC-Vという言葉が耳に入っていることが多くなっていないでしょうか?今回はRISC-Vプロセッサを搭載しているHiFive UnlearshedというハードウェアにDebianを入れてみてスパースモデリングを動作させてみました.

1 はじめに

まず,RISC-Vって最近よく聞くけどこれってなんぞや?という話ですね.最近では日本でも盛り上がりを見せていますが,先に簡単な概要だけ説明します.

RISC-VというのはUC Berkeleyが開発したISA(Instruction Set Architecture)です.ISAの有名どころだとIntelのx86やARMがあります.しかし,これらのISAを利用するには高額なライセンス料を支払う必要があり,CPUの開発をする場合に非常に高いコストがかかってしまいます.これに対し,RISC-VのISAはライセンス料不要であり,オープンソースで公開されているため,誰でもRISC-VのISAを使ったハードウェア開発が可能です.これで何が嬉しいかというと,誰でもISAの設計が可能になるんですよね.RISC-VのアーキテクチャをFPGAに実装することも可能ですし,RISC-VベースのAIで必要な処理に特化したものやIoTやインフラ向けのチップなんかも作ることが出来るわけです.ここ10年間くらいだと1,2を争うムーブメントと言えるのではないでしょうか.

2 HiFive Unleashed Development kitについて

世界中で大きなブームとなっているRISC-Vですが,ハカルスもこのビッグウェーブに乗るしかない!ということで社長からHiFive Unleashed Development kitを渡され,試しに動かしてみるかというノリでやってみることになりました.

HiFive Unleashed Development kitというのは,SiFive社が提供しているRISC-VのSoCが乗ったボードのことです.このSiFive社というのはRISC-Vを開発したUC-Berkeleyの研究者達を中心として設立された会社で,ここ数年のRISC-Vブームの先駆者でもあります.このDevelopment kitはRISC-Vが載っているボードでLinuxが動くことに加えて,RISC-Vの中では最速のSoC(Freedom U540)を積んでいます(2019年5月16日現在).またメモリも8GB積んでいるので,基本的人権もしっかり保証されています.SoCも1.5GHz駆動のマルチプロセッサなので試しで触るには十分すぎる環境ですね.

3 RISC-VにDebian環境を構築する

3.1 導入環境

  • ホストPC : Mac book Pro 13インチ(2017モデル)
  • CPU : core i7
  • メモリ : 16GB
  • 仮想環境 : Ubuntu 18.04 LTS
  • 使用したボード : HiFive Unleashed Development kit
  • SoC :
  • Memory DDR4 8GB
  • micro-SDカード 16GB

HifiveのボードにOSを入れる際には仮想環境を使用しています.またこれらの環境以外として,有線のネットワーク環境が必要です.

3.2 HifiveのHelloWorld

このボード,ラズパイと同じようにSDカード上でLinuxを動かす仕組みとなっており,購入時に付属しているSDカードにLinuxが付いています.この辺はスタートアップガイドを読んでもらえたら出来ると思います.無事にLinuxが立ち上がったら最低限のコマンドは叩けますが,叩けるコマンドが少なすぎて実質何も出来ないです.なので他のLinuxOSを入れる必要があります

3.3 RISC-Vに公式が配布しているLinuxをインストールしてみる

Debianをインストールする前に,こちらのスタートアップガイドの手順で公式のLinuxの書き込み手順を進めることを推奨します.こちらは,スタートアップガイドの手順通りで大丈夫です.手順は基本的には変わらないかと思いますが,2019年5月時点では1点変更があります.それは,書き込み時にHiFive Unleashed Development kit本体のDIPスイッチのMSEL2(下図の右から2番目のスイッチ)を0にする必要があります.freedom-u-sdkがアップデートされたことによってこの作業が必要となりました.freedom-u-sdk関連の情報はgithubの情報が最新でありそうなので,インストール時には一度チェックする必要があるかと思います.このスタートアップガイドで行なっていることは

  • freedom-u-sdkのダウンロード及びインストール
  • linux(buildroot)のインストール

になります.

3.4 導入編 : Debianのインストール

RISC-Vにインストール可能なディストリビューションは幾らかあるのですが,今回はDebianを選びました.何故Debianを使用したかというと,DebianパッケージのRISC-Vへの移植プロジェクトが活発に動いており,既存のソフトウェア資産を使いやすい環境である事が主な理由です

3.5 RISC-VにDebianをインストールする

基本的にDebianのインストールまでは,freedom-u-sdkのスタートアップガイドの手順と似ています.Debian環境の構築に関しては,以下の記事を参考にしています.

まず初めにmicro-SDカードのフォーマットをしておきましょう.この記事では,Ubuntu上でmicro-SDカードをフォーマットしています.アプリケーションから「disk」というファイルを用いてパーティションごとフォーマットしてください.またフォーマットする際は「ext4」でフォーマットしてます.micro-SDカードのフォーマットが終われば,次にこのコマンドでmicro-SDカードにdebianを書き込みます.このとき,micro-SDカードはホストPC側に刺しておく必要があります.最新のfreedom-u-sdkだと,format-demo-imageというイメージが入っており,これを指定して書き込むだけでDebianのインストールが可能になります.xxxにはsdaとかsdbといったものが入ります.個人の環境に合わせて設定してみてください.また,上記のコマンドを入れてエラーが発生した場合は

  • もう一度同じコマンドを叩く
  • DIPスイッチの設定を見直す

を試してみてください.✴︎1


    sudo make DISK=/dev/xxx format-demo-image

makeが終了したら以下の作業を行なってください.

  • freedom-u-sdk直下に新しく作成されたtmp-mntというファイルを削除
  • micro-SDカードをHiFive Unleashed Development kitに刺す

次にchrootに入る手順は下の通りです.


  mount /dev/mmcblk0p2 /mnt
  mount -t proc /proc /mnt/proc
  cp /etc/resolv.conf /mnt/etc/resolv.conf
  chroot /mnt/ /bin/bash

これでDebianの方に入る事が出来ます.Debianに入る事が出来れば,以下のコマンドを叩いていきます.


  ntpdate ntp.nict.jp
  export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
  export LC_ALL=C LANGUAGE=C LANG=C
  dpkg --configure -a
  echo  nameserver 8.8.8.8 >> /etc/resolv.conf
  apt update
  apt upgrade

(dkpgまでのコマンドはbashrcに入れてしまっても良いかと思います.)

4 Python環境を整える

Debianの環境が整ったので,次にPythonの環境を整えていきます.
今回使用するPythonのVerは3.7.3です.

4.1 pyenv環境の構築

まず,pyenvをインストールしていきます.pyenvをインストールするためにまず以下のパッケージをインストールしていきます.

apt -y install make build-essential libssl-dev zlib1g-dev libbz2-dev libfreetype6-dev \ libreadline-dev libsqlite3-dev wget curl libncurses5-dev libncursesw5-dev \ xz-utils tk-dev libffi-dev liblzma-dev

次にpyenvを落としてきます.


  git clone git://github.com/yyuu/pyenv.git ~/.pyenv

次に~/.bashrcに


  export PYENV_ROOT="$HOME/.pyenv"
  export PATH="$PYENV_ROOT/bin:$PATH"
  eval "$(pyenv init -)"

を追加します.これでpyenvが動くはずです.

4.2 Python3.7.3のインストール

pyenvがインストールされている事が確認出来れば次にPythonのインストールに入ります.


  pyenv install 3.7.3

でpythonをインストールします.この時ネットワーク環境にもよりますが,インストールには1時間ほど時間がかかります.気長に待ちましょう.インストールが終われば,pythonを3.7.3に切り替え,正しくインストールされているか確認します.


  pyenv global 3.7.3
  python -V

この時,python 3.7.3が見えていれば大丈夫です.また,pipのインストールも出来ているのでここでpipのアップデートをしておきます.

4.3 scikit-learn環境の構築

次にscikit-learnの環境を構築していきます.このボード上ではPython3系だとCPU依存のエラーや一部依存環境のインストールが出来ないといった問題が発生します.なので,このエントリではエラーを回避するために最新版ではない scikit-learnをインストールしていきます.また,依存関係としてLAPACとgfortranのインストールも行います.

4.4 LAPACKとgfortranのインストール


  apt install gfortran
  apt -yV install liblapack-dev
  apt -yV install liblapack-doc
  apt -yV install liblapack-pic
  apt -yV install liblapack-test
  apt -yV install liblapack3gf

この2つのコマンドを叩くだけでOKです.所要時間は大体1時間ほど.

4.5 Numpy, scipy, scikit-learnのインストール

これもまたインストールする時間が長いので,適当にスクリプトでも書くなどをして一気にインストールする方が楽です.scipyのインストールだけで3時間以上かかります笑 3つ全部インストールした時の所用時間は6時間は超えます.鳴かぬなら鳴くまで待とう何とやらです.前述したとおり,エラーが発生しなかったscikit-learnおよび依存ライブラリのバージョンは以下の通りです.


  pip install numpy==1.16.3
  pip install scipy==1.2.1
  pip install scikit-learn==0.20.3
  pip install matplotlib== 2.2.4

これでインストールは完了です.


  python
  import sklearn
  print(sklearn.__version__)

でscikit-learnがインストールされているか確認してみましょう.

5 サンプルの取得,jupyter notebookへのアクセス

ようやく表題の内容の部分まで来ました.使用するのはHacarusのgithubに公開されているspm-imageというスパースモデリングのサンプルを使用します.

README通りに進めても大丈夫ですが,virtual env環境の構築に時間をかけたく無い場合は直にpyenv環境に環境を構築していただいて大丈夫です.また,virtual envに環境を構築するときは,scikit-learn,numpy,scipyのverはpyenvの構築時と同じバージョンに合わせてください.jupyter notebookを起動しますが,今回はssh経由でホストマシンからjupyter notebookにアクセスできるようにするため,次のような手順を踏んでいきます.まず,RISC-V側でjupyter notebookを立ち上げます.今回はポートを指定してroot権限を渡してアクセスします.


    jupyter notebook --no-browser --ip="0.0.0.0"  --allow-root
  

これでRISC-V上でjuypter notebookが立ち上がります.この時,URLのトークンがターミナル上に表示されるので,そちらをメモしておきます.後は簡単,メモしたURLにアクセスするだけです.

juypter notebookが立ち上がっていたら成功です.

6 spm-imageのサンプルを動かしてみる

juypter notebookが立ち上がったら,exampleのフォルダにアクセスして適当にサンプルを動かしてみましょう.今回はlasso_admmを動かしてみます.lasso_admm.ipynbを開いて動かしてみると,例えばLasso_ADMMの場合は次のような結果が出力されます.

まだ実行速度が14.7sと遅いですが,scikit-learnが動いたことやRISC-V環境で簡単なソフトウェアが走ることが分かったというのは大きな収穫であると考えられます.また,CPU依存の問題はまだまだ残っており,実用向けにはまだ時間がかかると思いますが,数年以内には「RISC-Vで〇〇やってみた」というエンジニアが増えてくるのでは無いでしょうか.

7 まとめ

今回はRISC-Vチップが載ったHiFive UnleashedというモジュールにDebianをインストールし,その環境でJupyter notebookを動かしてみました.RISC-V向けのソフトウェア開発が盛り上がるにはもう少し時間がかかるものだと思われますが,今後発展する分野であることは間違い無いので,積極的にキャッチアップしていきたい所ですね.

✴︎1 何故か最初にmakeした時はmakeに失敗する事が多いです.数回makeすると上手くいく事が多いです

ニュースレター購読Newsletter

登録はこちら