🤗
Gemma3をローカル環境のDockerで動かす(Ollama+OpenWebUI)
OllamaとOpenWebUIを使い、ローカル環境でGemma3を動かしてみました。4b以上のモデルであれば、次のように画像の入力もできます!
前提条件
OllamaおよびOpenWebUIを使うために、今回はDockerを使いました。
ローカル環境のスペック
私のローカル環境はこんな感じのスペックです。2019年春に購入したものなので古く、メモリは多いですがGPU性能はあまりよくありません。なお、1bであればConoHa VPS 2GBのGPUなし環境でも動きましたので、軽さに感動しました。
CPU: Intel Core i9-9900K @ 3.60GHz
Memory: 64GB
GPU: NVIDIA GeForce GTX 1060 6GB
OS: Windows 11 Pro
環境構築
-
open-web-ui
というディレクトリに次のcompose.ymlを作成しました。なお、Gemma3を動かすにはOllamaのバージョン0.6以上が必要ですが、2025年3月15日時点ではollama/ollama:latest
だと過去のコンテナイメージとなってしまったため、0.6.1
を明示的に指定して実行しました。
compose.yml
version: '3.8'
services:
ollama:
image: ollama/ollama:0.6.1
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
restart: unless-stopped
# GPUを使用する場合
deploy:
resources:
reservations:
devices:
- capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "3000:8080"
volumes:
- open_webui_data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
- ollama
restart: always
volumes:
ollama_data:
open_webui_data:
-
open-web-ui
ディレクトリ内で次コマンドを実行し、Dockerコンテナを起動しました。
docker-compose up
- 利用するモデルを指定し、ollamaにpullします。gemma3は1b,4b,12b,27bがありますが、とりあえず4bをダウンロードしました。
docker exec -it ollama ollama pull gemma3:4b
-
http://localhost:3000
にアクセスすると、次のようなOpenWebUIが起動します。
※初回アクセス時は上記画像とやや異なり、アカウント作成画面となります。
- ユーザー登録をすると使えるようになります。
ちゃんとGPUが使われて推論されてます!!
モデルごとの回答を比べてみる
次のようにパラメータ数の異なる複数モデルをpullすることで、モデルの切替ができるようになります。
docker exec -it ollama ollama pull gemma3:1b
docker exec -it ollama ollama pull gemma3:4b
docker exec -it ollama ollama pull gemma3:12b
鶴亀算
鶴と亀が合わせて10匹います。足は36本です。亀は何匹いますか?
途中式も書いてください。
Gemma3:1b
**解法**
1. **全体の動物の数を求める:**
* 鶴と亀の合計は10匹です。
2. **足の数を求める:**
* 鶴と亀の足の合計は36本です。
3. **亀の数を求める:**
* 鶴と亀の合計数を、足の数で割ることで、亀の数を求めることができます。
* 亀の数 = 全体の動物の数 / 足の数
* 亀の数 = 10匹 / 36本 = 1/3 匹
* しかし、これは不正確な解法です。
4. **正確な解法:**
* 鶴と亀の合計は10匹です。
* 鶴と亀の足の合計は36本です。
* 鶴と亀の数をxとすると、鶴の数 + 亀の数 = x
* 鶴と亀の足の合計は36本なので、鶴の数 * 2 + 亀の数 * 2 = 36
* 鶴の数 * 2 = 36 - 2 * 亀の数
* 鶴の数 = (36 - 2 * 亀の数) / 2
* 鶴の数 = 18 -亀の数
* 亀の数は、鶴の数で埋めることで、鶴と亀の合計が10匹になることを確認できます。
* 鶴の数 + 亀の数 = 10
* 鶴の数 = 10 - 亀の数
* 亀の数 = 10 -鶴の数
* 亀の数 = 10 - (10 - 亀の数)
* 亀の数 = 10 - 10 + 亀の数
* 亀の数 = 亀の数
**答え:** 亀は 1匹です。
ダメですね
Gemma3:4b
はい、鶴と亀の数を求める問題ですね。
**考え方**
鶴は2本の足、亀は4本の足を持つという特徴を利用します。
**解き方**
1. 鶴の数をx、亀の数をyとします。
2. 合計の匹数は10匹なので、次の式が成り立ちます。
x + y = 10
3. 足の数の合計は36本なので、次の式が成り立ちます。
2x + 4y = 36
4. 上記の連立方程式を解きます。
まず、1つ目の式から x = 10 - y を求めます。
この式を2x + 4y = 36 に代入すると、
2(10 - y) + 4y = 36
20 - 2y + 4y = 36
2y = 16
y = 8
5. したがって、亀は8匹です。
**答え:** 8匹
正解しました!
Gemma3:12b
鶴の数をx、亀の数をyとします。
鶴と亀の合計が10匹なので、
x + y = 10 …①
鶴は足が2本、亀は足が4本なので、足の合計は36本なので、
2x + 4y = 36 …②
①より、x = 10 - y
これを②に代入すると、
2(10 - y) + 4y = 36
20 - 2y + 4y = 36
2y = 16
y = 8
したがって、亀は8匹です。
**答え:亀は8匹**
鶴亀蟻算
普通の鶴亀算は4bも12bもできたので、ちょっと形を変えて鶴亀に蟻を加えてみます。
鶴と亀と蟻が合わせて10匹いて、足が合計36本あります。亀が4匹の時、鶴と亀と蟻は何匹ずつの場合が考えられますか?考えられる全ての組合せを答えてください。
Gemma3:1b
鶴、亀、蟻の数を求める問題ですね。
まず、鶴、亀、蟻の合計数を計算します。
鶴: 10匹
亀: 4匹
蟻: 10匹
合計: 10 + 4 + 10 = 24匹
足の数は36本なので、足の数は24匹の合計で、足の数は36本なので、足の数は36本です。
足の数を計算するには、鶴、亀、蟻の数を掛け合わせます。
足の数 = (鶴の数) * (亀の数) * (蟻の数)
足の数 = 10 * 4 * 10 = 400本
しかし、足の数は36本なので、足の数に足りない部分を計算する必要があります。
足の数 = 36本
鶴、亀、蟻の数を求める問題は、鶴、亀、蟻の数をそれぞれ計算し、それらを足して、足の数と一致するかどうかを比較する問題です。
鶴の数: 10 - 4 = 6匹
亀の数: 4 - 0 = 4匹
蟻の数: 10 - 0 = 10匹
合計: 6 + 4 + 10 = 20匹
足の数: 20匹
足の数と足の数の差は、20 - 36 = -16匹
足の数と足の数の差は、足の数 - 足の数 = 4匹
足の数 = 36本
ループに陥ってしまいました。
Gemma:4b
鶴と亀と蟻の組み合わせを考えます。
まず、鶴と亀と蟻の数をそれぞれx, y, zとします。
合計の匹数は10匹なので、
x + y + z = 10 … (1)
鶴の足は2本、亀の足は4本、蟻の足は6本です。足の合計が36本なので、
2x + 4y + 6z = 36 … (2)
(2)を2で割ると、
x + 2y + 3z = 18 … (3)
(1)と(3)を引くと、
(x + 2y + 3z) - (x + y + z) = 18 - 10
y + 2z = 8 … (4)
yは0以上の整数なので、y = 8 - 2z を満たす必要があります。
また、x, y, zはすべて0以上の整数であり、x + y + z = 10であるため、以下の条件を満たす必要があります。
* y = 8 - 2z ≥ 0 => 2z ≤ 8 => z ≤ 4
* z ≤ 4
* x = 10 - y - z = 10 - (8 - 2z) - z = 10 - 8 + 2z - z = 2z + 2
zの値と、それに対応するx, yの値を以下に示します。
| z | y = 8 - 2z | x = 2z + 2 |
|---|---|---|
| 0 | 8 | 2 |
| 1 | 6 | 4 |
| 2 | 4 | 6 |
| 3 | 2 | 8 |
| 4 | 0 | 10 |
したがって、考えられる組み合わせは以下の5通りです。
1. 鶴: 2, 亀: 8, 蟻: 0
2. 鶴: 4, 亀: 6, 蟻: 0
3. 鶴: 6, 亀: 4, 蟻: 0
4. 鶴: 8, 亀: 2, 蟻: 0
5. 鶴: 10, 亀: 0, 蟻: 0
なんか変ですね。
Gemma:12b
鶴の数をx、亀の数をy、蟻の数をzとします。
問題文から、以下の2つの式が成り立ちます。
* x + y + z = 10 (合計10匹)
* 2x + 4y + 6z = 36 (足の合計が36本)
また、鶴、亀、蟻の数はそれぞれ0以上の整数である必要があります。
問題文に「亀が4匹の時」とあるので、y = 4 とします。
このとき、上記の式は以下のようになります。
* x + 4 + z = 10 => x + z = 6
* 2x + 4(4) + 6z = 36 => 2x + 6z = 20 => x + 3z = 10
x + z = 6 と x + 3z = 10 を連立方程式として解きます。
x = 6 - z を x + 3z = 10 に代入すると、
6 - z + 3z = 10
2z = 4
z = 2
z = 2 を x + z = 6 に代入すると、
x + 2 = 6
x = 4
したがって、鶴が4匹、亀が4匹、蟻が2匹の場合が考えられます。
**答え:**
* 鶴: 4匹
* 亀: 4匹
* 蟻: 2匹
お見事!!
GPUメモリ/Shared GPU メモリ消費量
Gemma3:1b
GPUメモリの消費は2GBほどに収まっているようです。
Gemma3:4b
GPUメモリの消費は4GBほどに収まっているようです。
Gemma3:12b
GPUメモリにのりきらなかったため、GPUメモリ6GB+Shared GPUメモリ 18.4GB を消費してしまいました。
Discussion
サーバーでインストールされた、CPUが100%以上に動なくになりました。。。
メモリ2GBのサーバーとかだとメモリが足りないので、Swap領域を追加してあげると動きました!とはいえかなり重くなります🫠
サーバーOS:Ubuntu 22.04 LTS
ハードウェア:Intel Xeon Silver 4210(10コア/20スレッド)
メモリ:4GB DDR4
DeepSeek R1バージョン:v1.2.0
大体これほどのVPSね