diff --git a/Android/src/app/src/main/java/com/google/ai/edge/gallery/MainActivity.kt b/Android/src/app/src/main/java/com/google/ai/edge/gallery/MainActivity.kt index 68893f56c..c8c425ae6 100644 --- a/Android/src/app/src/main/java/com/google/ai/edge/gallery/MainActivity.kt +++ b/Android/src/app/src/main/java/com/google/ai/edge/gallery/MainActivity.kt @@ -180,6 +180,10 @@ class MainActivity : ComponentActivity() { } // Keep the screen on while the app is running for better demo experience. window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + // Optimize for consistent peak frequencies by requesting sustained performance mode. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + window.setSustainedPerformanceMode(true) + } } override fun onNewIntent(intent: Intent) { diff --git a/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/benchmark/BenchmarkViewModel.kt b/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/benchmark/BenchmarkViewModel.kt index b79913439..029a4e255 100644 --- a/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/benchmark/BenchmarkViewModel.kt +++ b/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/benchmark/BenchmarkViewModel.kt @@ -29,7 +29,9 @@ import com.google.ai.edge.gallery.proto.LlmBenchmarkStats import com.google.ai.edge.gallery.proto.ValueSeries import com.google.ai.edge.litertlm.Backend import com.google.ai.edge.litertlm.ExperimentalApi +import com.google.ai.edge.litertlm.PerformanceMode import com.google.ai.edge.litertlm.benchmark +import com.google.ai.edge.litertlm.setPerformanceMode import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import java.io.File @@ -140,30 +142,41 @@ constructor( else -> Backend.CPU() } val modelPath = model.getPath(context = appContext) - for (i in 0 until runCount) { - Log.d(TAG, "Start running #$i...") - val benchmarkInfo = - benchmark( - modelPath = modelPath, - backend = backend, - prefillTokens = prefillTokens, - decodeTokens = decodeTokens, - cacheDir = cacheDirPath, - ) - Log.d(TAG, "Done #$i") - val initTimeMs = benchmarkInfo.initTimeInSecond * 1000.0 - if (i == 0) { - firstInitTime = initTimeMs - } else { - nonFirstInitTimes.add(initTimeMs) - } - prefillSpeeds.add(benchmarkInfo.lastPrefillTokensPerSecond) - decodeSpeeds.add(benchmarkInfo.lastDecodeTokensPerSecond) - timesToFirstToken.add(benchmarkInfo.timeToFirstTokenInSecond) + try { + setPerformanceMode(PerformanceMode.SUSTAINED_PERFORMANCE) + for (i in 0 until runCount) { + Log.d(TAG, "Start running #$i...") + val runStartTimeNanos = System.nanoTime() + + val benchmarkInfo = + benchmark( + modelPath = modelPath, + backend = backend, + prefillTokens = prefillTokens, + decodeTokens = decodeTokens, + cacheDir = cacheDirPath, + ) + + val executionDurationNanos = System.nanoTime() - runStartTimeNanos + Log.d(TAG, "Done #$i (duration: ${executionDurationNanos / 1_000_000L}ms)") - // Mark finish for this run. - setRunProgress(completedRunCount = i + 1) + val initTimeMs = benchmarkInfo.initTimeInSecond * 1000.0 + if (i == 0) { + firstInitTime = initTimeMs + } else { + nonFirstInitTimes.add(initTimeMs) + } + prefillSpeeds.add(benchmarkInfo.lastPrefillTokensPerSecond) + decodeSpeeds.add(benchmarkInfo.lastDecodeTokensPerSecond) + timesToFirstToken.add(benchmarkInfo.timeToFirstTokenInSecond) + + // Mark finish for this run. + setRunProgress(completedRunCount = i + 1) + } + } finally { + setPerformanceMode(PerformanceMode.BALANCED) + Log.d(TAG, "Restored performance mode to original state.") } val endMs = System.currentTimeMillis() if (needCleanUpCacheDir) {