Arm Mobile StudioのPerformance AdvisorをCIで使いたい
動機
ゲーム向けにAndroidのパフォーマンス測定をCIに組み込めたら良いなと思って色々調べていたところ、Arm Mobile Studio
というのが使えそうだったので試してみました。
今回はGPUのパフォーマンス測定を目的としています。
目標
Unity公式のBoatAttackのプロファイル結果をhtml形式で可視化する所までを目標とします。
アプリ起動~計測~終了までをコマンドラインで完結するようにしたいと思います。
Arm Mobile Studioについて
Arm Mobile Studioについてはこちらの動画が参考になります。
動画内でコマンドラインツールは有料といわれていますが、少し前に無料化されたようです。
今回はその無料化されたコマンドラインツールを使用していく形になります。
Streamline
とPerformance Advisor
を使用します。
また、Performance AdvisorはStreamlineに統合されており、streamline-cli.exe -pa
のように指定することで以前と似た形で利用できます。
環境
Google Pixel 6a(Google Tensor, Mali-G78)
Arm Mobile Studio 2023.1
Python 3.11.3(3.6以上)
ADB 1.0.41
事前準備
Arm アカウントを取得
Arm Mobile Studioのインストーラーをダウンロードするには、Arm アカウントが必要です。
Arm Developerの右上のアイコンからRegister
を選択して登録します。
Arm Mobile Studioをインストール
Streamlineを使用するためには、Arm Mobile Studioというツールセットをインストールする必要があります。
製品ページのDownload Arm Mobile Studio
をクリック後、ログインを行うとダウンロードページへ遷移します。(2段階認証が必要です)
インストーラーをダウンロードできたら実行し、指示に従ってインストールを行います。
デフォルトではC:\Program Files\Arm\Arm Mobile Studio 2023.1
へインストールされます。
コマンドプロンプトからStreamlineの実行ファイルにパスが通っていることを確認します。
> streamline-cli.exe --version
Arm Mobile Studio
Streamline 8.5 (ビルド 8.5.0.v20230412_1650)
Copyright (c) 2010-2023 by ARM Limited
All rights reserved worldwide.
Androidアプリケーションの作成
Streamlineでの計測を行うには、デバッグ可能なアプリケーションが必要です。
今回はUnity2019
でARM64
向けにDevelopment Build
で作成したAPKを使用しました。
端末にインストールした状態にしておきます。
キャプチャ設定ファイルの生成
キャプチャに使用する設定ファイルを事前に作成しておきます。
Streamline-gui.exe
を起動してSelect application
セクションで対象のアプリを選択すると、Configure counters
ボタンが有効になるのでクリックします。
筆者はGoogle Pixel 6a
に搭載されているMali-G78
向けのプロファイルを選択してエクスポートしました。
Mali-G78のプロファイルを選択
エクスポート
LWI(LightWeight Interceptor)経由でキャプチャ用ランタイムを起動
lwi_me.pyを使用して、キャプチャ用ランタイムを起動します。
pushd "C:\Program Files\Arm\Arm Mobile Studio 2023.1\streamline\bin\android"
python -X utf8 lwi_me.py ^
--daemon arm64/gatord ^
--lwi-mode screenshots ^
--lwi-api vulkan ^
--lwi-fps-threshold 60 ^
--lwi-frame-gap 200 ^
--lwi-out-dir D:\Streamline\LWICap ^
--headless D:\Streamline\Capture.apc ^
--config D:\Streamline\configuration.xml ^
--package com.Unity3d.BoatAttackDay ^
--overwrite
popd
lwi_me.pyのオプションの内容については、ヘルプコマンドで確認できます。
pushd "C:\Program Files\Arm\Arm Mobile Studio 2023.1\streamline\bin\android"
python -X utf8 lwi_me.py --help
popd
pause
主要な引数についての説明は以下の通りです。
オプション | 説明 |
---|---|
--daemon |
gatord バイナリのパスを指定します。ARM64向けなら arm64/gatord になります。 |
--lwi-mode | lwiの実行モードを指定します。 今回はスクリーンショットを利用したいので screenshots を指定します。 |
--lwi-api | グラフィックスAPIを指定します。 測定対象のパッケージと合わせる必要があります。 |
--lwi-fps-threshold | FPSが指定した値を下回るとキャプチャを行います。 |
--lwi-frame-gap | キャプチャ間の最小フレーム数を指定します。 |
--lwi-out-dir | キャプチャデータを指定の場所へ保存します。 このフォルダはPerformance Advisorの --frame-capture で同じ場所を指定する必要があります。 |
--headless | ヘッドレスモード(手動操作が不要)で実行します。 パフォーマンスキャプチャを指定のフォルダに保存します。(ZIPファイルもOK) このフォルダはPerformance Advisorで同じ場所を指定する必要があります。 |
--config | パフォーマンスキャプチャの設定ファイルを指定します。 ヘッドレスモードでは必須です。 |
--package | パフォーマンスキャプチャを行うパッケージを指定します。 ヘッドレスモードでは必須です。 |
アプリケーションを実行
アプリケーションを実行した後、60秒後に停止スクリプトを作成します。
adb shell am start -n com.Unity3d.BoatAttackDay/com.unity3d.player.UnityPlayerActivity
powershell sleep 60
adb shell am force-stop com.Unity3d.BoatAttackDay
Performance Advisorでレポートを作成
pushd D:\Streamline
rem Performance Advisorを使用してレポートを作成
streamline-cli.exe -pa Capture.apc ^
--frame-capture=LWICap ^
--application-name="BoatAttack" ^
--build-name="BoatAttack" ^
--device-name="Google Pixel 6a (Mali G78)" ^
--build-timestamp="2023/05/07 18:37:00" ^
--directory=Reports
popd
Performance Advisor
のヘルプコマンドは以下です。
streamline-cli.exe -pa --help
実行が終了すると、下図のようなレポートが作成されます。
レポートサンプル
最終的な実行スクリプトは以下のになります。
@echo off
pushd "C:\Program Files\Arm\Arm Mobile Studio 2023.1\streamline\bin\android"
rem LightWeight-Interseptor経由でStreamlineキャプチャを起動
start /b python -X utf8 lwi_me.py ^
--daemon arm64/gatord ^
--lwi-mode screenshots ^
--lwi-api vulkan ^
--lwi-fps-threshold 60 ^
--lwi-frame-gap 200 ^
--lwi-out-dir D:\Streamline\LWICap ^
--headless D:\Streamline\Capture.apc ^
--config D:\Streamline\configuration.xml ^
--package com.Unity3d.BoatAttackDay ^
--overwrite
rem 60秒待つ
powershell sleep 60
rem パッケージ起動
start /b adb shell am start -n com.Unity3d.BoatAttackDay/com.unity3d.player.UnityPlayerActivity
rem 60秒待つ
powershell sleep 60
adb shell am force-stop com.Unity3d.BoatAttackDay
rem 60秒待つ
powershell sleep 60
pushd D:\Streamline
rem Performance Advisorを使用してレポートを作成
streamline-cli.exe -pa Capture.apc ^
--frame-capture=LWICap ^
--application-name="BoatAttack" ^
--build-name="BoatAttack" ^
--device-name="Google Pixel 6a (Mali G78)" ^
--build-timestamp="2023/05/07 18:37:00" ^
--directory=Reports
popd
popd
おわりに
事前準備さえしてしまえば、自動でパフォーマンス計測~レポート作成までできて、CIにも組み込めそうです。
計測用に端末が必要なこととサポート端末が限られているのがネックですが、予算が許せばCIに組み込む価値はありそうです。
以上です。
ありがとうございました。
参考
Discussion