🦙

WSL2+Docker+Ollama+Open-WebUIによるローカルLLM環境構築

2025/03/02に公開

本記事の概要

本記事では、Windows 11環境においてWSL2、Docker、Ollama、Open-WebUIを組み合わせたローカルLLM環境の構築方法を解説します。この構成によりインターネット接続なしの自前ハードウェア上でLLMを動かせるようになります。

前提とする環境

  • OS: Windows 11
    • バージョン: 23H2
    • 64ビットオペレーティングシステム、x64ベースプロセッサ
    • NVIDIA GeForce RTX 4060 Laptop GPU / VRAM(専用GPUメモリ): 8.0GB
  • WSL2: Ubuntu 24.04.1 LTS

WSL2のインストール手順は次の記事で解説しています。
https://zenn.dev/enlog/articles/3df7bd9b2fe9df

NVIDIAドライバ、Docker、NVIDIA Container Toolkitのインストール手順は次の記事で解説しています。
https://zenn.dev/enlog/articles/d61f0c285c5c81

docker-compose.ymlを定義

docker-compose.ymlを次のように定義します。

docker-compose.yml
version: '3.8'

services:
  # OpenWebUIを起動するサービス
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: openwebui

    # ホスト側の8080番ポートをコンテナ側の8080番ポートに割り当て
    ports:
      - "8080:8080"

    # host.docker.internalを利用可能にする設定
    # (WSL2などでホストと通信したい時に利用)
    extra_hosts:
      - "host.docker.internal:host-gateway"

    environment:
      # 今回は検証目的のため、認証を無効化
      WEBUI_AUTH: "False"

    # データ永続化設定
    volumes:
      - ./openwebui:/app/data
      - ./models:/models

    # コンテナ停止時の動作指定
    restart: unless-stopped

    # ollamaコンテナが先に起動してからopen-webuiを起動する依存関係を宣言
    depends_on:
      - ollama

  # Ollamaを起動するサービス
  ollama:
    # ollamaの安定版イメージを指定
    image: ollama/ollama:latest

    # コンテナ名を指定
    container_name: ollama

    # ホスト側の11434番ポートをコンテナ側の11434番ポートに割り当て
    ports:
      - "11434:11434"

    # GPUリソース設定
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]

    # データ永続化設定
    volumes:
      - ./ollama:/root/.ollama
      - ./models:/models

    # コンテナ停止時の動作指定
    restart: unless-stopped

volumes:
  openwebui:
  ollama:

VSCodeで操作する場合はdevcontainer.jsonを次のように定義します。

devcontainer.json
{
    "name": "OpenWebUI+Ollama",
    "dockerComposeFile": "../docker-compose.yml",
    "service": "open-webui",
    "workspaceFolder": "/app",
    "customizations": {
        "vscode": {
            "extensions": [
                "ms-azuretools.vscode-docker"
            ]
        }
    },
    "remoteUser": "root",
    "shutdownAction": "stopCompose"
}

コンテナの起動

Ubuntuのターミナルを起動して次のコマンドでdocker-compose.ymlが配置されているディレクトリに移動します。

cd {ディレクトリパス}

続けて、次のコマンドを実行してコンテナを起動します。

docker compose up -d

モデルのダウンロード

この時点でOllama+open-webuiによる環境構築はできていますが、利用できるモデルが存在しないため、モデルをダウンロードします。
ダウンロードには次のコマンドを実行します。

docker compose exec ollama ollama pull {モデル名}

Microsoft社が開発したphi3を使用する場合、次のようにします。

docker compose exec ollama ollama pull phi3:3.8b-mini-4k-instruct-q6_K

Ollamaがそのモデルをサポートしているかどうかは次のページで検索することで確認できます。
https://ollama.com/search

.ggufファイルが手元にある場合

.ggufファイルが手元にある場合は、以下のコマンドを順番に実行していくことでモデルを利用できるようになります。

HugginFace上のモデルをダウンロードして、.gguf形式に変換する手順は次の記事を参考にしてください。
https://zenn.dev/enlog/articles/9e38d6a862c64f

今回はSB Intuitions社がMITライセンスで公開しているsarashina2.2-3b-instruct-v0.1の.ggufファイルが手元にある想定とします。

# ルートディレクトリに移動する
cd {ディレクトリパス}

# modelsディレクトリを作成
mkdir -p models

# Windows側から.ggufファイルをコピー
sudo cp /mnt/c/{Path}/sarashina2.2-3b-instruct-v0.1.gguf ./models/

# Modelfileを作成して書き込む
sudo sh -c 'echo "FROM /models/sarashina2.2-3b-instruct-v0.1.gguf" > ./models/Modelfile.sarashina2.2-3b-instruct-v0.1'

# docker composeの起動
docker compose up -d

# モデルをロードする
docker exec -it ollama ollama create sarashina2.2-3b-instruct-v0.1 -f /models/Modelfile.sarashina2.2-3b-instruct-v0.1

# モデル一覧を確認
docker exec -it ollama ollama list

次回からはmkdirは不要なので以下のコマンドで新しいモデルを追加できます。

# ルートディレクトリに移動する
cd {ディレクトリパス}

# 新しいモデルファイルをコピー
sudo cp /mnt/c/{Path}/{モデル名}.gguf ./models/

# 新しいモデル用のModelfileを作成
sudo sh -c 'echo "FROM /models/{モデル名}.gguf" > ./models/Modelfile.{モデル名}'

# docker composeの起動
docker compose up -d

# モデルをロードする
docker exec -it ollama ollama create {モデル名} -f /models/Modelfile.{モデル名}

# モデル一覧を確認
docker exec -it ollama ollama list

Ollamaでロードしたモデルを削除したい場合は次のコマンドを実行します。

docker exec -it ollama ollama rm {モデル名}

Open-WebUIに接続

ここまでの手順で既にブラウザを経由してローカルLLMモデルを利用できるようになっています。
ブラウザに http://localhost:8080 を打ち込むとChatGPTに似たUIが立ち上がります。

コンテナの終了

コンテナを終了させるには次のコマンドを実行します。

docker compose down

モデルの選択ポイント

ローカルLLMとして使用するモデルを選択する際は、主に以下のポイントを確認します。

モデル名

Llama、Mistral、Phi3、ELYZAなどのモデル名のことで、開発元やモデルの特徴を判断します。

パラメータ数

パラメータ数はモデルの規模を示し、多いほど性能が高い傾向になりますが、必要なハードウェアリソースも増加します。
Llama-3-ELYZA-JP-8B-q4_k_mの「8B」部分が80億パラメータを表しています。

量子化ビット数

「量子化」とはモデルのサイズを圧縮する手法で、この「量子化のビット数」が小さいほどファイルサイズが小さくなりますが、伴って精度も低下する傾向にあります。
Llama-3-ELYZA-JP-8B-q4_k_mの「q4_k_m」部分が4-bit量子化を表しています。

ライセンス

モデルが商用利用可能であるかを確認します。

まとめ

本記事では、Windows 11環境でのローカルLLM環境構築について解説しました。WSL2とDockerを活用し、OllamaとOpen-WebUIを導入することで、手軽にローカル環境でLLMを利用できるようになります。

参考記事

https://zenn.dev/firstautomation/articles/0b7a4b1bb2daf0

Discussion