はじめに
Google の 最新オープンモデル Gemma 3がリリースされました。
特徴として以下が挙げられています。
-
最先端のパフォーマンス
- LMArena のリーダーボードでLlama-405B、DeepSeek-V3、o3-miniを上回る
-
多言語対応
- 140以上の言語をサポート
-
マルチモーダル
- テキスト、画像、動画の入力
-
拡大されたコンテキストウィンドウ
- 128Kトークン
- Function Calling
- 量子化による高速化
最新のGemma 3をGoogle Cloud のCloud RunのGPU上で動作させてみたいと思います。
マルチモーダル対応したとのことなので、画像入力も試してみます。
方法
Cloud Run上でGPUを使用できるようにリクエストする
現在プレビュー機能となっているので、割り当てをリクエストしておきます。
Dockerイメージの作成
Ollamaで提供されているので、モデル名を指定してDockerイメージを作成します。
FROM ollama/ollama:latest
# Listen on all interfaces, port 8080
ENV OLLAMA_HOST 0.0.0.0:8080
# Store model weight files in /models
ENV OLLAMA_MODELS /models
# Reduce logging verbosity
ENV OLLAMA_DEBUG false
# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE -1
# Store the model weights in the container image
ENV MODEL gemma3:4b
RUN ollama serve & sleep 5 && ollama pull $MODEL
# Start Ollama
ENTRYPOINT ["ollama", "serve"]
Dockerイメージをビルドして、Artifact RegistryにPushします。
Cloud Runにデプロイ
Artifact RegistryにPushしたイメージを指定して、GPUを使用するようにデプロイします。
テスト
Cloud Run プロキシを使用して、アクセスできるようにします。
gcloud run services proxy {サービス名} --port=9090
テキスト
リクエストをしてみます。
curl http://localhost:9090/api/generate -d '{
"model": "gemma3:4b",
"stream": false,
"prompt":"日本一高い山の名前とその標高は?"
}'
回答
"response":"日本一高い山は**富士山**です。\n\n* **標高:** 3,776.24m"
標高の小数点以下は少し間違えていますが、概ね合っています!
テキスト+画像
以下の画像を入力にしてみます。
Pythonのollamaからリクエストをしてみます。
from ollama import Client
client = Client(host='http://localhost:9090')
response1 = client.chat(
model = "gemma3:4b",
messages = [{
"role": "user",
"content": "画像を説明して",
"images": ["/path/image.png"],
}],
)
print(response1["message"]["content"])
回答
この画像は、雪が降る中、日本の繁華街の交差点で、柴犬と猫が一緒に立っている様子を捉えたものです。
**主なポイント:**
* **雪景色:** 背景には雪が降っていることがわかります。街並みは雪に覆われ、白銀の世界となっています。
* **柴犬:** 躍動感のあるポーズで、飛び跳ねている柴犬が写っています。
* **猫:** 柴犬の横に立っている白い猫は、赤い帽子をかぶっており、可愛らしい印象です。
* **背景:** 背景には、高層ビルや看板、多くの人々が歩いている様子が写っており、活気のある日本の街並みが広がっています。
* **交差点:** 柴犬と猫は、白線が描かれた交差点に立っており、周囲には多くの歩行者がいます。
全体的に、この写真は、雪景色の中で、犬と猫が一緒に楽しんでいる様子を捉えた、可愛らしい写真です。
画像の内容を詳細に説明してくれました!
次にOCRを試してみます。
以下のダミーの請求書に対して、JSONで出力してくださいと指示してみます。
回答
[
{
"品名": "りんご",
"数量": 3,
"単価": 200,
"合計": 600
},
{
"品名": "布団",
"数量": 1,
"単価": 33000,
"合計": 33000
},
{
"品名": "Orange",
"数量": 4,
"単価": 150,
"合計": 600
}
]
ちゃんと項目を抽出してくれました!
おわりに
Googleの Gemma 3を試してみました。
モデルサイズが小さいながらも、他のLLMをも凌駕するパフォーマンスであったり、多言語対応やマルチモーダル対応したことによって、より使用用途が広がったと思います。
Gemmaに限らず、他のオープンモデルも続々と公開されているので、競争がもっと激化しそうな予感がしました。
Function Callingの機能も今度試してみたい。
参考
過去にも同様にCloud Run上に別のLLMをデプロイしているので、そちらを参考にしてもらえたらと思います。