WSL2+Docker+Ollama+Open-WebUIによるローカルLLM環境構築
本記事の概要
本記事では、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のインストール手順は次の記事で解説しています。
NVIDIAドライバ、Docker、NVIDIA Container Toolkitのインストール手順は次の記事で解説しています。
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を次のように定義します。
{
"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がそのモデルをサポートしているかどうかは次のページで検索することで確認できます。
.ggufファイルが手元にある場合
.ggufファイルが手元にある場合は、以下のコマンドを順番に実行していくことでモデルを利用できるようになります。
HugginFace上のモデルをダウンロードして、.gguf形式に変換する手順は次の記事を参考にしてください。
今回は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を利用できるようになります。
参考記事
Discussion