mediapipe
mediapipe copied to clipboard
Crash when running the llm inference on android
Description
When running the app with a gemma 2b model, it crashes randomly after a few messages with error java.util.ConcurrentModificationException.
I don't have much context on jetpack compose but it looks like a ui state issue.
Device Details
Model: gemma-2b-it-cpu-int4.bin (downloaded from kaggle) Pixel 6
Crash log
2024-04-22 01:57:41.765 15456-15456 InsetsController com...diapipe.examples.llminference D show(ime(), fromIme=false)
2024-04-22 01:57:41.766 15456-15456 InputMethodManager com...diapipe.examples.llminference D showSoftInput() view=androidx.compose.ui.platform.AndroidComposeView{b68342a VFED..... .F....ID 0,0-1080,2209 aid=1073741824} flags=0 reason=SHOW_SOFT_INPUT_BY_INSETS_API
2024-04-22 01:57:41.883 15456-15456 InsetsController com...diapipe.examples.llminference D show(ime(), fromIme=true)
2024-04-22 01:57:49.772 15456-15456 AndroidRuntime com...diapipe.examples.llminference E FATAL EXCEPTION: main
Process: com.google.mediapipe.examples.llminference, PID: 15456
java.util.ConcurrentModificationException
at androidx.compose.runtime.snapshots.StateListIterator.validateModification(SnapshotStateList.kt:320)
at androidx.compose.runtime.snapshots.StateListIterator.next(SnapshotStateList.kt:296)
at com.google.mediapipe.examples.llminference.GemmaUiState.getMessages(ChatUiState.kt:127)
at com.google.mediapipe.examples.llminference.ChatScreenKt$ChatScreen$1$1.invoke(ChatScreen.kt:77)
at com.google.mediapipe.examples.llminference.ChatScreenKt$ChatScreen$1$1.invoke(ChatScreen.kt:70)
at androidx.compose.foundation.lazy.LazyListIntervalContent.<init>(LazyListIntervalContent.kt:34)
at androidx.compose.foundation.lazy.LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$intervalContentState$1.invoke(LazyListItemProvider.kt:49)
at androidx.compose.foundation.lazy.LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$intervalContentState$1.invoke(LazyListItemProvider.kt:48)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.DerivedSnapshotState.currentRecord(DerivedState.kt:200)
at androidx.compose.runtime.DerivedSnapshotState.current(DerivedState.kt:167)
at androidx.compose.runtime.DerivedSnapshotState$ResultRecord.readableHash(DerivedState.kt:142)
at androidx.compose.runtime.DerivedSnapshotState$ResultRecord.isValid(DerivedState.kt:114)
at androidx.compose.runtime.DerivedSnapshotState.currentRecord(DerivedState.kt:175)
at androidx.compose.runtime.DerivedSnapshotState.getCurrentRecord(DerivedState.kt:274)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.recordInvalidation(SnapshotStateObserver.kt:595)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.drainChanges(SnapshotStateObserver.kt:69)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.access$drainChanges(SnapshotStateObserver.kt:41)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$applyObserver$1.invoke(SnapshotStateObserver.kt:48)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$applyObserver$1.invoke(SnapshotStateObserver.kt:46)
at androidx.compose.runtime.snapshots.SnapshotKt.advanceGlobalSnapshot(Snapshot.kt:1815)
at androidx.compose.runtime.snapshots.SnapshotKt.advanceGlobalSnapshot(Snapshot.kt:1830)
at androidx.compose.runtime.snapshots.SnapshotKt.access$advanceGlobalSnapshot(Snapshot.kt:1)
at androidx.compose.runtime.snapshots.Snapshot$Companion.sendApplyNotifications(Snapshot.kt:583)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:561)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:551)
at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1229)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
at android.view.Choreographer.doCallbacks(Choreographer.java:899)
at android.view.Choreographer.doFrame(Choreographer.java:827)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7918)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
2024-04-22 01:57:49.773 15456-15456 AndroidRuntime com...diapipe.examples.llminference E at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@15910fd, androidx.compose.ui.platform.MotionDurationScaleImpl@6c781f2, StandaloneCoroutine{Cancelling}@fb64043, AndroidUiDispatcher@efff6c0]