ローカルLLM構築
Docker環境を構築し、Ollama + Open WebUIのソフトでローカルLLMを動かす
本記事は以下の記事を参考にしています。
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