Open1

ローカルLLM構築

カイリーーカイリーー

Docker環境を構築し、Ollama + Open WebUIのソフトでローカルLLMを動かす

本記事は以下の記事を参考にしています。
https://zenn.dev/karaage0703/articles/c271ca65b91bdb

Ollamaとは

Ollamaとはローカル環境で大規模言語モデル(LLM)を簡単に実行、管理するためのツールです。
Ollamaを使用すると、自分のPC上でLLMを実行できます。

Ollama 環境の構築

以下コマンドでOllamaのDocker環境を構築します。

docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
-v ollama:/root/.ollama

上記はホスト側のollamaという名前のディレクトリをコンテナ内の/root/.ollamaディレクトリにマウントしています。
これより、コンテナ内のデータをホスト側に永続化することで、コンテナ内で作成されたデータが失われないようにすることが目的です。

-p 11434:11434

ポートをマッピングします。ホスト側の11434ポートとコンテナ側の11434ポートをマッピングします。
これにより、ホストマシンからlocalhost:11434でOllamaにアクセスできます。

ollama/ollama

ollama/ollamaで使用するDockerイメージを指定します。
ollama/ollamaというイメージを使用してコンテナを起動します。

上記コマンドを実行することでollama/ollamaのDockerイメージをDockerHubからPullしてきて、コンテナを起動します。

Open WebUI 環境の構築

以下コマンドでOpen WebUIというGUIアプリケーションのDocker環境を構築します。

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
--add-host=host.docker.internal:host-gateway

コンテナ内の/etc/hostsにファイルにエントリを追加します。
ここではhost.docker.internalというホスト名をホストマシンのIPアドレス(host-gateway)に解決するようにしています。

--restart always

コンテナが停止した場合に自動的に再起動するように設定します。
alwaysを指定するとDockerデーモンが起動している限りコンテナが常に実行されます。

docker container ls
CONTAINER ID   IMAGE                                COMMAND                   CREATED             STATUS                             PORTS                      NAMES
f403a3471810   ghcr.io/open-webui/open-webui:main   "bash start.sh"           59 seconds ago      Up 45 seconds (health: starting)   0.0.0.0:3000->8080/tcp     open-webui
57dce65e698a   ollama/ollama                        "/bin/ollama serve"       10 minutes ago      Up 10 minutes                      0.0.0.0:11434->11434/tcp   ollama

docker container lsコマンドでコンテナが起動しているかを確認します。
ollama/ollamaのイメージとghcr.io/open-webui/open-webui:mainのイメージのSTATUSがUpになっていれば無事に起動しています。

ただし、Up 19 minutes (unhealthy)となっている場合、ヘルスチェックに失敗している可能性があります。
私の場合しばらく待機してから再度docker container lsコマンドでStatusの確認をしたところ、healthyに変わりました。
おそらくこれは、Open WebUIの初期化処理(データベースのマイグレーション処理)に時間がかかっているため初期化が完了するまでヘルスチェックが失敗していた可能性があります。
試しにdocker logs open-webuiコマンドを実行し、ログを確認してみたところ確かにマイグレーション処理が走っているログがありました。

Creating knowledge table
Migrating data from document table to knowledge table
Converting 'chat' column to JSON
Renaming 'chat' column to 'old_chat'
Adding new 'chat' column of type JSON
Dropping 'old_chat' column
Primary Key: {'name': None, 'constrained_columns': []}
Unique Constraints: [{'name': 'uq_id_user_id', 'column_names': ['id', 'user_id']}]
Indexes: [{'name': 'tag_id', 'column_names': ['id'], 'unique': 1, 'dialect_options': {}}]
Creating new primary key with 'id' and 'user_id'.
Dropping unique constraint: uq_id_user_id
Dropping unique index: tag_id

 ██████╗ ██████╗ ███████╗███╗   ██╗    ██╗    ██╗███████╗██████╗ ██╗   ██╗██╗
██╔═══██╗██╔══██╗██╔════╝████╗  ██║    ██║    ██║██╔════╝██╔══██╗██║   ██║██║
██║   ██║██████╔╝█████╗  ██╔██╗ ██║    ██║ █╗ ██║█████╗  ██████╔╝██║   ██║██║
██║   ██║██╔═══╝ ██╔══╝  ██║╚██╗██║    ██║███╗██║██╔══╝  ██╔══██╗██║   ██║██║
╚██████╔╝██║     ███████╗██║ ╚████║    ╚███╔███╔╝███████╗██████╔╝╚██████╔╝██║
 ╚═════╝ ╚═╝     ╚══════╝╚═╝  ╚═══╝     ╚══╝╚══╝ ╚══════╝╚═════╝  ╚═════╝ ╚═╝


v0.5.20 - building the best open-source AI user interface.

https://github.com/open-webui/open-webui

unhealthyだった理由はおそらくこのマイグレーション処理に時間がかかっていたものと思われます。

ここまで実行できたら以下でアクセスしてみます。

http://localhost:3000/



無事にWebUI画面が表示されました。
アカウント作成画面からアカウントの作成を行います。
ローカル環境での登録になるため、どこかのDBに登録されているとかはありません。

これだけでは、まだOpenWebUIを使用することはできません。
使用するLLMを設定する必要があるため、Ollamaにモデルを追加する必要があります。
以下コマンドで、Ollamaに使用するモデルを追加します。

docker exec ollama ollama pull 7shi/tanuki-dpo-v1.0:8b-q6_K