Fusic Tech Blog

Fusion of Society, IT and Culture

Menohをmrubyから呼ぶ
2018/12/28

Menohをmrubyから呼ぶ

年の瀬にどうも。どうやらこの記事が、本ブログのトリみたいなので、最後まで楽しんで行ってください。

動機

一応、所属してるチームが機械学習に力を入れているチームなのですが、わたしがあんまりやっていなかったのでネタくらいやってみるかと思い、チョットデキル mruby でも menoh が動くか試したかったのだと思います。

方法

ひたすら C のバインディングを写経のごとく作りました
[C API のドキュメント](https://pfnet-research.github.io/menoh/group c api.html)があるので、それらを見ながら写経写経でした。

書いてて思ったのが、別に C++書けない人間でもないので、読み解くのがめんどくさい C API でなくてC++ APIでなくてもよかったのではとかありましたが、次の日が大掃除くらいしかない徹夜のテンションだったので忘れました。

それから、FFI という手もなくはなかったのかもしれないんですが、mruby の FFI はオブジェクトの破棄処理まわりが不十分だったので見送りました。
他のちゃんと FFI のある言語なら、FFI でちゃちゃっと済ませてさっさとテストを充実させるほうがいいと思います。

困ったこと

所謂ディープラーニングで扱うデータに全く慣れてないので、データの表現を普段のプログラムで使っているようなデータに戻すのに苦労しました。
ディープラーニングでは、なんでもテンソルというか多次元配列に入っているので、そういった前提知識がないとメモリバッファーがどれくらい必要かなどでとても苦労するというのが学びになりました。

C API という特性上ちゃんとメモリバッファーに必要な長さを意識しないと気軽に周辺メモリが破壊されるというのはなかなか恐怖です。
特にいつも扱っている文字列と比較して大きい画像なので、被害も甚大で普段の sanitizer などの挙動と違って慣れませんでした。

また、mruby で画像を扱うことを全く考えてなかったので、サンプルの OpenCV のコードをもとに画像読み込みの処理を書いたので、テストを動かすのにパッケージとしてかなり大きい OpenCV を入れないといけないのはつらいで。
今後は、mruby-gdがあるのでできればそれで代用したいなと思っています。

他に、leak sanitizer でメモリリークが検出されたのですが、偽陽性かバージョンが上げると直る気がするのでまたビルドすることがあれば原因を探してみようかと思います。

成果

リポジトリはtake-cheeze/mruby-menohです。
本家に VGG のサンプルがあるのでそれをもとに簡単なテストは動いたのでひとまずバッファー関係のつらい仕様さえ踏まなければ使えるかと思います。

終わりに

そんなこんなで、学習済みモデルを動かせる程度のことができるようになりました。
推論を CPU でするというのはONNXなどによって標準化が進んだそれほど難しくなく、実行時間も許容できるレベルだったので、画像認識をさせる心理的なハードルが下がってよかったです。

CI も一応できたんですが、まだサンプルを動かした程度の域を出ないので、今後もっとパラメーターなどが複雑なモデルにも挑戦したいです。

それでは良いお年を。

watanabe

watanabe

技術開発部門所属 一番好きな言語はC++です。