Menohを使ってRubyでDeepLearningしてみた


ついにRubyでDeepLearningができる時代が来てしまいましたね。
SinatraとかRailsとかでサクッとDL入りWebサービスを作れるなんて。。。感動。。。

ちなみに[menoh](https://github.com/pfnet-research/menoh)はPFNが出した推論専用のライブラリで，いろいろな言語でDeepLearningの推論ができるそうです。


というわけで以下インストールに結構苦労したので、一応メモ書き。
ONNX？なにそれ？おいしいの？レベルの人なので、最初に速攻`gem install menoh`してインストールできないやんけ！！ってジタバタしてました。

## 環境

OS: Mac El Capitan(10.11.6)
Ruby: 2.5.1

## インストール

まずはmenoh本体(C++側)をインストールします。
その辺の依存しているライブラリをインストール。

```
brew install mkl-dnn eigen protobuf
```

あとはgithubに記載されているbuild手順通りに。

```
git clone https://github.com/pfnet-research/menoh.git
cd menoh
python retrieve_data.py
mkdir build && cd build
cmake ..
make
```

しかしmakeでコケる。

```
/Users/me/workspace/DL/menoh/menoh/menoh/menoh.cpp:23:9: error:
      thread-local storage is not supported for the current target
        thread_local fixed_array message = {'\0'};
        ^
/Users/me/workspace/DL/menoh/menoh/menoh/menoh.cpp:24:16: warning:
      reference to stack memory associated with local variable 'message'
      returned [-Wreturn-stack-address]
        return message;
               ^~~~~~~
1 warning and 1 error generated.
make[2]: *** [menoh/CMakeFiles/menoh.dir/menoh.cpp.o] Error 1
make[1]: *** [menoh/CMakeFiles/menoh.dir/all] Error 2
make: *** [all] Error 2
```

`thread-local storage is not supported for the current target`ってなんやねん

lvmmをbrew upgrade叩いたりしたけれど全く効果なし。<br>
調べるといろいろ出てきましたが、**結局Xcodeのバージョンを7.3から8.1にあげることで解決**しました。

Xcodeの容量が大きいのでアップデートするだけでも一苦労でした。
Xcodeアップデートってアプリ内で何かしらスクリプト叩いてるだけのような気もするので、terminal上で完結できるような方法をご存知のかたがいたら教えてください。。。

そしてmenoh-rubyをインストール。

```
My-MacBook-Air:build $ gem install menoh
Building native extensions.  This could take a while...
Successfully installed menoh-1.0.0
```
やったー🍺


## 試してみる


というわけで[menoh-ruby](https://github.com/pfnet-research/menoh-ruby)のexample、叩いてみました。
ありがちなimagenetの画像分類をやってくれる感じのスクリプトです。

とりあえずモンブランの写真を突っ込んでみる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/268599/df82c0fe-dc2a-21bd-0be4-bf98fcb35099.png" width=50%>




```
=== Result for ./data/img_6402.png ===
n07579787 plate : 0.26357507705688477
n07836838 chocolate sauce, chocolate syrup : 0.2326061874628067
n04476259 tray : 0.19548551738262177
n07920052 espresso : 0.12014696002006531
n07930864 cup : 0.06513626873493195
```
まぁたしかに、皿の写真ではあるので正解ってことでいいんですかね。

お次は本。



<img src="https://qiita-image-store.s3.amazonaws.com/0/268599/f52de0cc-01a1-e9d5-469b-58db3ef56ecb.jpeg" width=50%>




```
=== Result for ./data/IMG_3902.JPG ===
n03041632 cleaver, meat cleaver, chopper : 0.5683144330978394
n02840245 binder, ring-binder : 0.12066441029310226
n07248320 book jacket, dust cover, dust jacket, dust wrapper : 0.09724234789609909
n03291819 envelope : 0.06752058863639832
n04152593 screen, CRT screen : 0.03184862807393074
```
どの辺がmeat cleaverに見えたんだろう。。。


## 所感

推論くらいなら全然時間かからないですね。
結構大きなモデルなのに体感では読み込みめちゃ速い、すごい


というわけで、インストールさえ済めばRubyからも楽にDeepLearningで推論できることが分かりました。

最近はkerasばかり触っていたのですが、ONNXのモデルってkerasからだと出力できない感じなのですかね、、、
chainerから離れて久しいので、RubyでDeepLearningやりたいしchainerをもう一度学び直してみようかな、という気持ちです。
pytorchを新しく学ぶのもありかも。

次は自分で適当に作ったモデルをSinatraあたりに載せようかな。

## 追記
kerasでもchainerでも保存したモデルをONNX形式に変換ができる[MMdnn](https://github.com/Microsoft/MMdnn)というものがあるそうです。試してみたい。

## 参考サイト
[github: menoh-ruby](https://github.com/pfnet-research/menoh-ruby)
[github: menoh](https://github.com/pfnet-research/menoh)