Gemini NanoをAndroid端末で動かすメモ

オンデバイスAIだとプライバシーとか、APIキーをアプリ内に置けない問題とか、コストの問題とか色々が解決するので魅力的ですよね？気軽にLLMを使いたいです。

2024/10/12の時点でのメモとして残しておきます。Gemini NanoもそのうちStableになることで、tester登録が要らなくなったり、簡単になるかもしれないです。

基本的には以下に従うだけです。

https://developer.android.com/ai/gemini-nano/experimental

サンプルアプリが公開されています。

https://github.com/android/ai-samples


が、ちゃんと手順を見ずにcloneしてAndroid Studioで起動するだけだと以下のようなエラーが出ます

```kotlin
Failed to check model availability.
com.google.ai.edge.aicore.UnknownException: AICore failed with error type 2-INFERENCE_ERROR and error code 8-NOT_AVAILABLE: Required LLM feature not found
	at com.google.ai.edge.aicore.GenerativeAIException$Companion.from$java_com_google_android_apps_aicore_client_client(com.google.ai.edge.aicore:aicore@@0.0.1-exp01:7)
	at com.google.ai.edge.aicore.GenerativeModel$prepareInferenceEngine$2.invokeSuspend(com.google.ai.edge.aicore:aicore@@0.0.1-exp01:9)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
	at java.lang.Thread.run(Thread.java:1012)
Caused by: com.google.ai.edge.aicore.InferenceException: AICore failed with error type 2-INFERENCE_ERROR and error code 8-NOT_AVAILABLE: Required LLM feature not found
	at com.google.ai.edge.aicore.GenerativeAIException$Companion.from$java_com_google_android_apps_aicore_client_client(com.google.ai.edge.aicore:aicore@@0.0.1-exp01:4)
	at com.google.ai.edge.aicore.GenerativeModel.getAiFeature(com.google.ai.edge.aicore:aicore@@0.0.1-exp01:9)
	at com.google.ai.edge.aicore.GenerativeModel.access$getAiFeature(com.google.ai.edge.aicore:aicore@@0.0.1-exp01:1)
	at com.google.ai.edge.aicore.GenerativeModel$getAiFeature$1.invokeSuspend(Unknown Source:14)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) 
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) 
	at java.lang.Thread.run(Thread.java:1012) 

```




# 事前準備

* 対応端末を用意する。(このためにPixel 9買ってきました。)

> To experiment with Gemini Nano, you'll need a Pixel 9 series device.


* Google groupに参加する (https://developer.android.com/ai/gemini-nano/experimental にあります)
* tester programに参加する
* Google Playでそのtester programに参加したアカウントからAICoreのアプリを開いてアップデートする
別のアカウントでAICoreのアプリを入れてしまうとひも付いてしまうようで、そのアカウントでtester programに参加しないといけないかもです。(別のアカウントに紐づけし直しみたいなのはちょっとやり方分からなかった)
* あと大きいモデルをダウンロードするので、WiFiも繋いどいたほうがいいかもしれないです。

# アプリ起動

ここまでやってからcloneしてAndroid Studioで開いて、アプリを起動します。

---

いくつかKotlinのバージョンでエラーなどが出たら以下を参考に直してみてください。公式の方にプルリクエストが出ているので、そのうちビルド環境は直りそうです。

https://github.com/takahirom/ai-samples/commit/1bf01e286faf201a40b764b21add799996187d06

---

起動したら以下のようなエラーがLogcatに表示されました。

```
 AICore failed with error type 4-CONNECTION_ERROR and error code 601-BINDING_FAILURE: AiCore service failed to bind.
 ```

 と言われました。
またとりあえず端末を再起動してみたのですが、以下を言われました。

```
 AICore failed with error type 1-DOWNLOAD_ERROR and error code 0-UNKNOWN: Feature is unavailable.
```

で、次のアプリの起動でやっときました。
大きさは、2.8GBっぽいですね。

```
2024-10-11 11:12:53.665 16306-16306 EntryChoiceActivity     com.google.ai.edge.aicore.demo       D  Downloading model: 3063135863 bytes
2024-10-11 11:12:54.728 16306-16306 EntryChoiceActivity     com.google.ai.edge.aicore.demo       D  Downloaded 132720 bytes
2024-10-11 11:12:55.903 16306-16306 EntryChoiceActivity     com.google.ai.edge.aicore.demo       D  Downloaded 2090361 bytes
2024-10-11 11:12:55.912 16306-16306 EntryChoiceActivity     com.google.ai.edge.aicore.demo       D  Downloaded 2090645 bytes
...
2024-10-12 20:31:35.546  4606-4606  EntryChoiceActivity     com.google.ai.edge.aicore.demo       D  Downloaded 4358020858 bytes
2024-10-12 20:31:35.975  4606-4606  EntryChoiceActivity     com.google.ai.edge.aicore.demo       D  Download completed.
```

動きました！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/0c0f1700-75c6-22b0-895d-406935174366.png" width="300" />

いい感じで、可能性を感じることができました。

もう少し深堀りしていきます。