コンテンツにスキップするには Enter キーを押してください

Menohをmrubyから呼ぶ

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

動機

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

方法

ひたすらCのバインディングを写経のごとく作りました
C APIのドキュメントがあるので、それらを見ながら写経写経でした。

書いてて思ったのが、別に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も一応できたんですが、まだサンプルを動かした程度の域を出ないので、今後もっとパラメーターなどが複雑なモデルにも挑戦したいです。

それでは良いお年を。

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

コメントする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です