1 of 6

Rustでモバイル開発したい話

~ ML x Android編 ~

2 of 6

なぜRustでモバイル開発したいか

  • 機械学習のアルゴリズム開発(Python)→ デプロイ(C/C++) がつらい
    • マルチプラットフォームのライブラリとしてコアを作ろうとするとC/C++
    • ただC/C++は使いこなせる人でないと厳しい
    • できる限り抽象度高く書き、かつ性能も出したい
    • 流行りDeep Learningだけじゃないこともやりたい(複雑)
  • そこで、コアロジックをRustで書くのはどう?
    • C/C++の既存のライブラリの呼び出しもできる
    • 開発時はPythonでwrapしてテストするなどサーバーサイドとの連携もやりやすい
    • Cargoの便利さにつきる
  • やってみる
    • 機械学習のモバイルアプリケーションをRustで実現してみる(途中)
    • 開発そのものと直感的な性能は良さそう。厳密なベンチマークはしてない。

3 of 6

今回の方針(今回はAndroidのみ)

Flutter (Dart)

wrapper (Kotlin)

“jni” (Rust)

main logic (Rust)

“tvm-frontend” (Rust)

libtvm_runtime.so (C/C++)

UI。カメラのストリームをwrapperに投げ、結果を描画する

UI周りはiOSもAndroidも対応できる。流行ってたので。

Dartから呼ぶためのwrapper

ここでJNI経由でRustのAPIをコール

jni-rsで簡単につくれた

https://docs.rs/jni/0.12.3/jni/

モデルの初期化や推論のAPIをつくる

https://github.com/dmlc/tvm/tree/master/rust/frontend

DeepLearningのフレームワークのようなもの

パフォーマンスを気にするとC/C++の既存の資産に頼らざるを得ない。しかもARMとかだと選択肢が少なく。

別手段だとtfliteとか、armccをbindingするとか?

言語が増えてかえって辛い感じもある。

個人的には楽しいんですがどうでしょうか?

4 of 6

AndroidからRustを呼ぶ(1/2)

Javaのパッケージ jp.tkato.demo みたいな雰囲気

詳細省きます。

ちょっとめんどいけどJavaから呼べて嬉しいですね、位に思ってください

ちなみにAndroid用のクロスコンパイラは以下。加えてAndroid NDK必要

> rustup target add aarch64-linux-android

macbookで開発してるけどLinux相当の環境構築めんどいのでDocker使ってますが、RustのOfficial Imageあるので便利

C APIを作るときと同じ

stateを持つためには、ヒープに置いたデータのポインタを

ハンドルとして呼び出し側に返して使ってもらう

ハンドルはjfloatにキャストする(とりあえずの64bit型)

5 of 6

AndroidからRustを呼ぶ(2/2)

jlongからハンドルに戻してメソッドを呼ぶ

ByteBufferを使うと、JavaのメモリにRustから

直接アクセスできるので、画像とか機械学習だと便利

6 of 6

まとめと今後

  • C/C++、Javaなどと連携できるので、実アプリ作る上でもなんとかなる
  • wrapperをたくさん書くけど、コアをRustで書けるようにしておくと嬉しい
    • Rustのハイレベルなライブラリの利用や、安全性の恩恵を受けられる
    • Rustを書くために既存のライブラリに対する綺麗なC APIを書く羽目になっているけど
  • 完成したら公開したい。iOSもやってみる。