Zenn
🤗

Gemma3をローカル環境のDockerで動かす(Ollama+OpenWebUI)

2025/03/15に公開3
10

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

環境構築

  1. 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:
  1. open-web-uiディレクトリ内で次コマンドを実行し、Dockerコンテナを起動しました。
docker-compose up
  1. 利用するモデルを指定し、ollamaにpullします。gemma3は1b,4b,12b,27bがありますが、とりあえず4bをダウンロードしました。
docker exec -it ollama ollama pull gemma3:4b
  1. http://localhost:3000にアクセスすると、次のようなOpenWebUIが起動します。

※初回アクセス時は上記画像とやや異なり、アカウント作成画面となります。

  1. ユーザー登録をすると使えるようになります。

ちゃんと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 を消費してしまいました。

10

Discussion

金田 るい子金田 るい子

サーバーでインストールされた、CPUが100%以上に動なくになりました。。。

たこやきたこやき

メモリ2GBのサーバーとかだとメモリが足りないので、Swap領域を追加してあげると動きました!とはいえかなり重くなります🫠

金田 るい子金田 るい子

サーバーOS:Ubuntu 22.04 LTS
ハードウェア:Intel Xeon Silver 4210(10コア/20スレッド)
メモリ:4GB DDR4
DeepSeek R1バージョン:v1.2.0
大体これほどのVPSね

ログインするとコメントできます