今回はこちらのpytorch_mobileのandroidデモを動かしてみたので,備忘録として実行方法を載せておく.基本はREADMEを読んで,その通りに実行すれば良いのだが,コードの変更や,環境の依存性があるため,誰かの役に立つ可能性があると思われるため,メモを残す.
実行端末情報
- Xiaomi 11T Pro
- MIUI バージョン 14.04
- Android 13 TKQ 1.220829
gradleビルドパッケージについて
gradleで指定したパッケージを更新したいが,jcenter()が閉鎖済みであり,これの変更が必要.
jcenterをmavenに変更.あまり最新版のgradleにしすぎるとエラーを吐くようになるため適当に更新.今回は,ビルドツールの4.2.0あたりが最善だった.
gradleのパッケージの対応バージョンは下記で閲覧することができる.mavenの公式だと思うが,非常に助かる.
https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google
- build.gradle(HelloWorldApp)
buildscript {
repositories {
google()
//jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.0'
// classpath 'com.android.tools.build:gradle:8.1.1'
// classpath 'com.android.tools.build:gradle:3.5.0'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
gradle自身もアップデートする
gradleが古いと下記のようなエラーを吐くことがある.
Minimum supported Gradle version is 8.0. Current version is 5.6.4.
更新はgradle-wrapper.propatiesを書き換え
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
# distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
端末環境の依存性について
実行端末情報に記載の通り,今回はandroid 12以上のものを対象にする.
構成を変更しているうちに,手元の環境のbuildToolsVersion
が破損したのか,バージョン29.0.2
では,環境が壊れています
といった旨のエラーで動かなかったため,30.02
にアップデートしておいた.
android_pytorchについては,mavenのページからバージョンを参照して適当なバージョンをダウンロードする.
android_torchvisionについては,バージョン10あたり(?)からtorchvision_liteにしなければ,duplicate_class
エラーで失敗する.後のyoloのtorchscriptの実行環境とandroid_pytorchの依存性ははっきり言ってわからない.どこかにバージョン対応のリストがあるのだろうか.
- build.gradle(App)
apply plugin: 'com.android.application'
android {
// compileSdkVersion 28
compileSdkVersion 31
// buildToolsVersion "29.0.2"
buildToolsVersion '30.0.2'
defaultConfig {
applicationId "org.pytorch.helloworld"
// minSdkVersion 21
minSdkVersion 26
// targetSdkVersion 28
targetSdkVersion 31
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
}
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
// implementation 'org.pytorch:pytorch_android_lite:1.9.0'
implementation 'org.pytorch:pytorch_android_lite:1.11'
// implementation 'org.pytorch:pytorch_android_torchvision:1.9.0'
implementation 'org.pytorch:pytorch_android_torchvision_lite:1.11'
}
android上のexportエラーについて
android 12周辺からexportを明言するように要求された.
AndroidMainifest.xml
にのactivityに1行を足すことでこれを解決した.
- AndroidMainifest.xml
<activity
android:name=".MainActivity"
android:exported = "true" # ここを追加
>
<in...
ptファイルの作成について
trace_model.pyの実行のために,python環境を用意する.環境は,手元にあった
pytorch/pytorch:1.9.1-cuda11.1-cudnn8-devel
を使用してビルドした(GPUは使用しない).docker上でpip listしたtorch関連の主なライブラリのバージョンは以下の通り.
torch 1.10.0
torchelastic 0.2.0
torchtext 0.11.0
torchvision 0.11.1
ビルドに成功すると,下記のような画像と,分析結果が表示される
仕組み
モバイルデバイスでの実行は,モデルをファイルにしてそれをデバイス側に読み込ませて推論を実行する.
今回は拡張子pt(ptl)で出力しており,その保存はsave_for_lite_interpreter()で保存している.通常のsaveではなく,軽量化が実行されていることがミソである.その後にandroid側のModuleクラスに読み込ませることで,デバイス上で推論が可能になるようだ.
疑問
ptlファイル側とandroid側ライブラリのバージョンの依存性について有るのか無いのかイマイチわからない.このあたりの依存性について調べてみたが,有益な対照表は見つからなかった.
参考情報として,他のサンプルプロジェクトには依存関係が書いてある(Object Ditection等)
PyTorch 1.10.0 および torchvision 0.11.1 (オプション)
Python 3.8 (オプション)
Android Pytorch ライブラリ pytorch_android_lite:1.10.0、pytorch_android_torchvision_lite:1.10.0
Android Studio 4.0.1以降