2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Androidで利用できるGoogleのLLMライブラリを比較する

Posted at

Androidで使えるGoogleのLLMのソリューションが何個あると思いますか?

調べてみると実は5つもあるようです。どう違って、どう選んでいったらいいでしょうか?

  • Gemini Nano with the Google AI Edge SDK
  • MediaPipe Tasks Inference API
  • LiteRT
  • Vertex AI in Firebase
  • Google AI client SDK

それぞれのライブラリの使い方は大体同じ

ここでは2つ目のMediaPipe Tasksを例としてあげてみます。
基本的にはプロンプトといくつかのパラメーター(例えばTemperature)を渡して、結果が返ってくるという感じです。

MediaPipe Tasks Inference API

val options = LlmInferenceOptions.builder()
        .setModelPATH("/data/local/.../")
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .build()

llmInference = LlmInference.createFromOptions(context, options)
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."
val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

LLMを使うときに利用するパラメーターのうち、 Temperature , TopK , TopP は、前回以下で紹介しました。
LLMを使いこなすためにLLMで指定する Temperature , TopK , TopP を理解する

で、どう違うのか?

同じようなコードで同じようなパラメーターが使えるなら、これらのライブラリは何が違うのでしょうか?

これらのAIは On Device AI と Cloud AI の大きく2つに分けることができます。On Device AI はAndroid端末などデバイス上で実行されるAIで、Cloud AI はサーバー上で実行されます。

説明 ライブラリ
On Device AI :iphone: Android端末などデバイス上で実行される * Gemini Nano with the Google AI Edge SDK
* MediaPipe Tasks Inference API
* LiteRT
Cloud AI :cloud: サーバー上で実行される * Vertex AI in Firebase
* Google AI Client SDK

On Device AI と Cloud AI どっちがいいの?

On Device AIのメリットは、デバイス上で実行するため、サーバーにデータを送信しないためプライバシーに配慮できたり、即時に実行されて速い、オフライン、API利用料など追加コストが発生しない。ということがあります。

では全部On Device AIでいいのでは?となると思うのですが、クラウドベースのほうが大きい計算リソースを使えてより高性能なモデルが使えるメリットがあったり、On Device AIは現状は対応している機能が少なかったり、使える端末が少なかったり、まだ発展途上であるというデメリットがあります。

説明 メリット
On Device AI :iphone: Android端末などデバイス上で実行される サーバーにデータを送信しないためプライバシーに配慮できる
即時に実行されて速くなりえる
オフラインで動く
API利用料など追加コストが発生しない
Cloud AI :cloud: サーバー上で実行される 大きい計算リソースを使えてより高性能なモデルが使える
対応している機能が多い
あらゆる端末で使える
比較的成熟している

On Device AI と Could AIの違いは分かったけど、それぞれのライブラリでどう違うの?

まずは一個ずつ特徴を見ていきましょう。

Gemini Nano with the Google AI Edge SDK

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

2024/11/10時点
全体ステータス
On Device か Cloud か: On Device
ライブラリのステータス: experimental。使うユーザーがexperimental accessの明示的な合意が必要。
使えるモデル: Gemini Nano
使えるモーダリティ: Text to Text(Gemini Nano 2自体はマルチモーダルをサポートしているのでもう少しかも。)
その他の機能: AndroidのOSに統合されていることにより、モデルの管理によるダウンロードやモデルの管理を気にしなくて良い。
使える端末: Pixel9。Webサイトにはいろんな端末で使えると書いてあるが、GitHubにはPixel 9の実機が必要と書いてあり、使えない報告あり。

まだExperimental(実験的)なものとなります。また利用するのにユーザーの合意が必要になるので、まだ実用するのは難しいです。
Gemini Nano with the Google AI Edge SDK の特徴は、On Device AI であることの他に、その仕組みがOSに載っているというところにあります。Googleなので、Android OSとしてAIのサポート(AICore)を入れており、そこで動作させることになります。そして、そのAICoreにアクセスできるライブラリが、Google AI Edge SDK になります。つまり、モデルのダウンロードや管理をOSに任せられます。という話ではあるのですが、今のところダウンロードするコードなどを呼び出してから使う必要があります。

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

Gemini Nano with the Google AI Edge SDK

val generationConfig = generationConfig {
  context = ApplicationProvider.getApplicationContext() // required
  temperature = 0.2f
  topK = 16
  maxOutputTokens = 256
}
scope.launch {
  // Single string input prompt
  val input = "I want you to act as an English proofreader. I will provide you
    texts, and I would like you to review them for any spelling, grammar, or
    punctuation errors. Once you have finished reviewing the text, provide me
    with any necessary corrections or suggestions for improving the text: These
    arent the droids your looking for."
  val response = generativeModel.generateContent(input)
  print(response.t ext)
}

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

MediaPipe Tasks Inference API

https://ai.google.dev/edge/mediapipe/solutions/genai/llm_inference

2024/11/10時点
On Device か Cloud か: On Device
ステータス: experimental and under active development
使えるモデル: オープンモデル(Gemma, Llamaなど)
使えるモーダリティ: Text to Text, Text to Image (他にも顔認識などがある。)
その他の機能: オープンモデルが選択可能。LoRA support。
使える端末: minSdkVersion 24(Android 7.0以上)、8 GB 以上の RAM を搭載したデバイスでテストすることもおすすめします。 という文言が、codelabに存在する。

こちらもExperimental(実験的)なものとなりますが、MediaPipe Tasksは物体検出や顔のランドマーク検出など、一般的なユースケースに対応した事前トレーニング済みのモデルを提供しています。そのMediaPipe TasksにInference APIとしてLLMも利用できる機能が追加されました。オープンモデルを指定して利用します。Gemini Nanoは利用することができないです。現状のGemini Nanoと比べると、端末の制限が明示的には設定されていないため、さまざまな端末で動かしてみることができそうです。

MediaPipe Tasks

val options = LlmInferenceOptions.builder()
        .setModelPATH("/data/local/.../")
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .build()

llmInference = LlmInference.createFromOptions(context, options)
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."
val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

ai.google.dev/edge/mediapipe/solutions/genai/llm_inference/android

LiteRT (元TensorFlow Lite)

https://ai.google.dev/edge/litert?hl=ja

2024/11/10時点
On Device か Cloud か: On Device
ステータス: LLMに関するステータスが見つからず。
使えるモデル: オープンモデル(Gemma, Llamaなど)
使えるモーダリティ: Text to Textなど (他にも顔認識などがある。)
その他の機能: オープンモデルが選択可能。
使える端末: 不明

LiteRTは元々TensorFlow Liteという名前で、最近名前が変わりました。機械学習をモバイル端末上で行うライブラリです。現状はLLMとして使えそうなAPIはあるものの、GemmaやLlamaなどのモダンなLLMを、TensorFlow LiteやLiteRTと使っている例は探してみましたが見つからなかったです。そのため、今回は大きく取り上げない形にしようと思っています。最近名前が変わったりして変更を入れていこうとしているように見えるため、これから変わっていく可能性はあると思っています。
おそらくInferenceのAPIはあるのでモデルを変換して読み込ませれば使えそうということはわかっており、このGoogle colabを実行すればいいのですが、動かしてみたのですが動かず。調べたところ100GB以上のメモリが必要そうというところで断念しました。

Google AI client SDK

https://developer.android.com/ai/google-ai-client-sdk

2024/11/10時点
On Device か Cloud か: Cloud
ステータス: APIキーを載せる必要があって使われてしまうため。プロトタイプのみ The Google AI SDK for Android is recommended for prototyping only
使えるモデル: Geminiモデル
使えるモーダリティ: Text to Text, Image & Text to Text
その他の機能: Json schema、Function Callingなど
使える端末: ほぼ何でも利用可。(minSdk = 21)

GeminiのAPIをSDKとしてラップしたものです。大きな問題点としてアプリ上でGeminiのAPIキーが必要になるということです。そうなるとAPIキーの盗難のリスクが有るため、かなり使うのが難しくなってしまいます。そのためプロトタイプとしてのみ利用できるという形になります。

val model = GenerativeModel(
  model = "gemini-1.5-flash-001",
  apiKey = BuildConfig.apikey,
  generationConfig = generationConfig {
    temperature = 0.15f
    topK = 32
    topP = 1f
    maxOutputTokens = 4096
  },
  safetySettings = listOf(
...
  )
)
scope.launch {
  val response = model.generateContent("Write a story about a green robot.")
}

Vertex AI in Firebase

https://firebase.google.com/docs/vertex-ai?hl=ja

2024/11/10時点
On Device か Cloud か: Cloud
ステータス: Generally Available(利用可能)
使えるモデル: Geminiモデル
使えるモーダリティ: Text to Text, Image & Text to Text (これまでで最もいろんなものが使える)
その他の機能: Json schema、Function Callingなど
使える端末: ほぼ何でも利用可。Firebase App Checkといっしょに使うことが推奨されている。

Vertex AIというのはGoogle Could Platformで使えるAIのサービスの名前で、それをFirebaseから使えるよということです。FirebaseでGeminiなどが呼び出せるという認識で問題ないと思います。こちらはGoogle AI client SDKと違って、直接GeminiのAPIキーなどを持つ形ではないため、比較的セキュリティリスクが低いです。セキュリティの面からFirebase App Checkと一緒に使うことが推奨されています。

Vertex AI in Firebase

val generativeModel = Firebase.vertexAI.generativeModel(
    modelName = "gemini-1.5-flash-preview-0514",
    generationConfig = generationConfig {
        temperature = 0.7f
        topK = 40
    }
)
val prompt = "Write a story about a magic backpack."

val response = generativeModel.generateContent(prompt)
print(response.text)

比較表(2024/11/12 時点)

項目 Gemini Nano with Google AI Edge SDK MediaPipe Tasks Inference API LiteRT (旧TensorFlow Lite) Google AI Client SDK Vertex AI in Firebase
AIタイプ オンデバイス :iphone: オンデバイス :iphone: オンデバイス :iphone: クラウド :cloud: クラウド :cloud:
ステータス Experimental(実験的)、ユーザーの合意が必要。 Experimental(実験的)、開発中 最近名前が変わったが昔からある。LLM対応の事例が少ない。 プロトタイプのみ利用可能 Generally Available(利用可能)
モデル Gemini Nano オープンモデル(Gemma, Llamaなど) オープンモデル Geminiモデル Geminiモデル
モーダリティ Text to Text Text to Text、Text to Imageなど Text to Textなど Text to Text、Image & Text to Text Text to Text、Image & Text to Text
その他の機能 OS管理でモデルのダウンロード/管理が簡単、ローカルで高速に動き得る LoRAサポート、モデルパス設定可能、ローカルで高速に動き得る、(顔認識などその他の機械学習機能) モデルの最適化・変換対応、ローカルで高速に動き得る、(顔認識などその他の機械学習機能) JSON出力サポート、APIキー必要 JSON出力サポート
対応デバイス Pixel 9のみ対応 minSdkVersion 24(Android 7.0以上)、8GB以上のRAM推奨 不明 ほぼ全デバイス ほぼ全デバイス
プライバシーとセキュリティ オンデバイス処理によるプライバシー保護 オンデバイス処理によるプライバシー保護 オンデバイス処理によるプライバシー保護 APIキー盗難、悪用リスクあり Firebase利用でセキュア(Firebase App Checkとの併用が推奨されている)
API利用料 なし なし なし あり あり

で、どう選ぶとよいの?

オンデバイスかクラウドか

現時点ではオンデバイスAIは高性能なデバイスに依存しているため、一般ユーザーの幅広い利用には制約があります。そのため、オンデバイスAIは選択肢にはなかなか入らないのかなと思いました。 ただ、プライバシー保護や低遅延といった強みがあるので、オンデバイスは考慮しておきたいです。

そのため将来的にオンデバイスに切り替えできるようにする(例えば以下のように抽象化を入れておく)アプローチがあるかもしれません。

interface AIService {
    fun generateResponse(prompt: String): String
}

class CloudAIService : AIService {
    override fun generateResponse(prompt: String): String {
        // クラウドAPIへのリクエスト処理を実装
        // 例: Firebaseを使用してGeminiモデルを呼び出す
    }
}

class OnDeviceAIService : AIService {
    override fun generateResponse(prompt: String): String {
        // オンデバイスモデルへの処理を実装
        // 例: Google AI Edge SDKを使用してGemini Nanoを呼び出す
    }
}

Vertex AI in Firebaseか自社サーバーか

クラウドでは、GoogleのLLMのライブラリでは、ほぼVertex AI in Firebaseが唯一の選択肢となると考えられます。
Firebaseを使わない場合は、自分でサーバーを用意する形になります。 自分でサーバーを用意する場合は自分でGeminiなどのLLMのAPIを呼び出す処理を書いてアプリにjsonなどで返す処理を実装する形になります。自分でサーバーを用意する場合は初期のセットアップと継続的なメンテナンスが必要ですが、自由度が高くOpenAIなどの別のAIを呼び出したりすることも可能になります。 最近はOpenAIのAPIのインターフェースでGeminiのAPIが叩けるようにもなったので、OpenAIのAPIベースでサーバーを作るのも一つの手なのかなと思います。

まとめると?

以下の3つの観点から選ぶことになります。

  • クラウドサーバー
    自由度が高くOpenAIなどの別のAIを呼び出したり、カスタマイズが可能。
  • Firebase
    初期のセットアップ、継続的なメンテナンスが少なくて済む。
    自動でスケールしてくれる。

そして選んでから、その処理をするときにオンデバイスに置き換えられるようにするというのが現状では良いアプローチになるのかなと思いました。

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?