🦙

WSL+DockerでOllamaを構築しはじめて推論を実行する

に公開
  • WSL上でOllamaによる推論を実行するための手順を備忘録的に残しておく。

目的

  • WSL上でOllamaのDockerコンテナを立ち上げ、ローカルLLMモデルに推論を実行させる。

手順

NVIDIA Container Toolkitをインストール

コンテナ上でGPUを使用するためにNVIDIA Container Toolkitをインストールする必要がある。
これが何をしているかというと、WSLからマシンのGPUを使用可能にすると理解しておいてよいと思う。(参考:https://qiita.com/tkusumi/items/f275f0737fb5b261a868)

  • まずGPUドライバを最新にしておく。
WindowsでNvidia appを起動し、ドライバーを最新化

Toolkitをインストールする

Nvidiaの公式ページを参考にインストールをする

$ nvidia-container-cli info を実行しWSL上で認識されていることを確認

$ nvidia-container-cli info
NVRM version:   591.59
CUDA version:   13.1

Device Index:   0
Device Minor:   0
Model:          NVIDIA GeForce RTX 3060
Brand:          GeForce
GPU UUID:       GPU-06a0b789-30c4-13a3-eb27-5399408071ad
Bus Location:   00000000:01:00.0
Architecture:   8.6

Docker上から参照できるか確認する

nvidia/cudaのDocker imageが必要。
run時に--gpus allオプションを指定することで、マシンのGPUリソースをすべて使用可能にする。

$ docker run --rm --gpus all nvidia/cuda:13.1.0-base-ubuntu22.04 nvidia-smi
Sun Dec 21 07:43:47 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 590.48.01              Driver Version: 591.59         CUDA Version: 13.1     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 3060        On  |   00000000:01:00.0  On |                  N/A |
|  0%   55C    P8             19W /  170W |     951MiB /  12288MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A              33      G   /Xwayland                             N/A      |
+-----------------------------------------------------------------------------------------+

Ollamaを起動する

Dockerイメージをpullしてコンテナ立ち上げ

# imageをpull
$ docker pull ollama/ollama

# pullできたことを確認
$ docker image ls
REPOSITORY        TAG                       IMAGE ID       CREATED       SIZE
ollama/ollama     latest                    0cab1dbf8bb2   2 days ago    3.96GB

# コンテナ立ち上げ
$ docker run -d --gpus=all -v $(pwd)/ollama_data:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

# コンテナに入ってollamaを動かしてみる
$ docker exec -it ollama /bin/bash
root@5e5286076854:/ ollama --version
ollama version is 0.13.5

モデル選択

google作成の軽量オープンモデルであり、日本語にも対応しているgemma3を選択する。(モデルの比較についてはこちらの記事が参考になるかもしれない:https://tech-lab.sios.jp/archives/50797#Gemma_3Google_DeepMind)

# コンテナ内で実行
$ ollama run gemma3:4b
pulling manifest
pulling aeda25e63ebd: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 3.3 GB
pulling e0a42594d802: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  358 B
pulling dd084c7d92a3: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 8.4 KB
pulling 3116c5225075: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   77 B
pulling b6ae5839783f: 100% ▕█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  489 B
verifying sha256 digest
writing manifest
success
# ↑こんな感じでモデルをダウンロードする

推論を実行

# >>> と表示された後にプロンプトを入力すると推論を実行する
>>> こんにちは
こんにちは!何かお手伝いできることはありますか? 😊

>>> あなたは何者ですか?
私は、Googleによってトレーニングされた、大規模言語モデルです。

簡単に言うと、人間が書いた文章を大量に読んで学んだことによって、質問に答えたり、文章を作成したり、様々なタスクを実行したりすることができます。

私はまだ学習中であり、完璧ではありませんが、あなたの質問に答えるために最善を尽くします。

**重要なこと:** 私は「意識」を持っているわけではありません。ただ、大量のデータを基に、パターンを認識し、それに基づいて応答を生成しているだけです。

# 詩を作らせることも可能
>>> 140字程度の詩的な文章を作成してください
夕闇が忍び寄る、茜色の空。
風は静かに語りかけ、草の葉を揺らす。
遠くの山並みはシルエットとなり、
時を刻むかのように、深まっていく。

心は静寂に包まれ、
過ぎ去りし日々の記憶を辿る。
明日への希望を胸に、
夜の帳が降りるのを待つ。

# 変なことも言う
>>> 太宰治の小説「走れメロス」でメロスは何をしましたか?
太宰治の小説「走れメロス」でメロスは、王の命令に背いて、国を滅ぼしたとされる羊飼い「羊飼い」の死を信じようと奔走しました。

具体的には、以下のことを行います。

*   **羊飼い「羊飼い」を信じる:** 羊飼いは、自分が王の命に背いたと主張しています。メロスは、羊飼いの言葉を鵜呑みにして、それが事実であると信じ込みます。
*   **王の命令に反論する:** 羊飼いの死を否定し、王の命令を信じようとするメロスは、王との間で激しく対立します。
*   **自分の信念を貫く:** どんなに周囲が反対しても、羊飼い「羊飼い」を信じるという自分の信念を曲げないため、苦難の道を歩みます。

この行動が、国家や社会の規範に反し、最終的にはメロスを破滅へと導きます。

# セッションを保存する
>>> /save first_session
Created new model 'first_session'

推論中にGPUのステータスをモニタリングしていると、使用率90%ほどまでいくこともありました。ちゃんとWSL+Docker上からGPUを使用していることが確認できます。

まとめ

  • Dockerを使用することで簡単にOllamaでモデル選択と推論が可能になる。
  • Nvidia Container Toolkitによって、WSL・DockerコンテナからGPUを使用して推論が可能になる。

Discussion