pytorch mobileのHelloWorldサンプルを動かす

今回は[こちら](https://github.com/pytorch/android-demo-app)の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)
``` build.gradle
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を書き換え
```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)
```build.gradle
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
```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
```



ビルドに成功すると，下記のような画像と，分析結果が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574694/d77a5e1a-1bfc-4d84-b493-d09ac0d1c74c.png)

## 仕組み
モバイルデバイスでの実行は，モデルをファイルにしてそれをデバイス側に読み込ませて推論を実行する．
今回は拡張子pt(ptl)で出力しており，その保存はsave_for_lite_interpreter()で保存している．通常のsaveではなく，軽量化が実行されていることがミソである．その後にandroid側のModuleクラスに読み込ませることで，デバイス上で推論が可能になるようだ．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574694/e71c59b8-afbe-ae03-08dd-21e45667129f.png)


## 疑問
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以降
```


NEXT: [pytorch mobileのObject Ditectionサンプルを動かす](https://qiita.com/sanjolin_chun/items/090ff55c748f003a54a7)