Rustでモバイル開発したい話
~ ML x Android編 ~
なぜRustでモバイル開発したいか
今回の方針(今回は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をコール
モデルの初期化や推論のAPIをつくる
https://github.com/dmlc/tvm/tree/master/rust/frontend
DeepLearningのフレームワークのようなもの
パフォーマンスを気にするとC/C++の既存の資産に頼らざるを得ない。しかもARMとかだと選択肢が少なく。
別手段だとtfliteとか、armccをbindingするとか?
言語が増えてかえって辛い感じもある。
個人的には楽しいんですがどうでしょうか?
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型)
AndroidからRustを呼ぶ(2/2)
jlongからハンドルに戻してメソッドを呼ぶ
ByteBufferを使うと、JavaのメモリにRustから
直接アクセスできるので、画像とか機械学習だと便利
まとめと今後