動機
ローカルLLMを使用したい人の中には、ネットワークから完全に切り離された環境で使いたいという人もいるだろうなと思ったので。
前提条件
- オンライン環境で稼働しているdocker環境
事前準備
作業用Linux環境でいろいろと必要なファイルを作ったりダウンロードしたりする。
docker pull
で各イメージを入手
$ docker pull ollama/ollama:latest
$ docker pull ghcr.io/open-webui/open-webui:main
入手したイメージをdocker save
でファイルに保存する
$ docker save ollama/ollama:latest | gzip > ollama.tar.gz
$ docker save ghcr.io/open-webui/open-webui:main | gzip > open-webui.tar.gz
dockerの実行ファイルを入手する
以下のURLから最新のdocker-x.x.x.tgz
をダウンロードする
https://download.docker.com/linux/static/stable/x86_64/
docker-composeの実行ファイルを入手する
以下のURL(GitHub)から実行ファイルをダウンロードする
https://github.com/docker/compose/releases
Ollamaで稼働させたいModelをダウンロードする
稼働させたいGGUFをダウンロードする
※今回はELYZAを使用しました。
https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF/tree/main
ダウンロードしたファイルに合わせてModelfileを作成し、GGUFと同じ場所に置く
Modelfile
FROM ./Llama-3-ELYZA-JP-8B-q4_k_m.gguf
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
{{ .Response }}<|eot_id|>"""
PARAMETER stop "<|start_header_id|>"
PARAMETER stop "<|end_header_id|>"
PARAMETER stop "<|eot_id|>"
PARAMETER stop "<|reserved_special_token"
インストール
以下手順を展開先の実機で作業する。
iptablesのインストール(debianのセットアップDVDに含まれている)
# apt install iptables
dockerグループを追加し、作業ユーザを参加させる
# groupadd docker
# usermod -aG docker $USER
docker本体のインストール
# tar xzvf docker-x.x.x.tgz
# cp docker/* /usr/bin/
docker本体とdockerのLinuxソケットをsystemdに登録
/usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
/usr/lib/systemd/system/docker.socket
[Unit]
Description=Docker Socket for the API
[Socket]
ListenStream=/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
dockerを起動し、自動起動するよう設定する
# systemctl daemon-reload
# systemctl start docker.service
# systemctl enable docker.service
dockerイメージをインポートする
# docker load < ollama.tar.gz
# docker load < open-webui.tar.gz
docker-composeのインストール
この時点でコンテナを立ち上げる準備は完了しているが、管理を楽にするために
docker-composeをセットアップしておく。
# cp docker-compose /usr/local/bin/
# chmod +x /usr/local/bin/docker-compose
docker-composeで管理する用のフォルダを作成する
まあ、どこでもいいです。
# mkdir /opt/ollama
# cd /opt/ollama
docker-compose.ymlを作成する
/opt/ollama/docker-compose.yml
services:
ollama:
image: ollama/ollama
container_name: ollama
volumes:
- ollama:/root/.ollama
- ./model:/root/model
ports:
- "11434:11434"
restart: unless-stopped
# GPUを利用する場合、ここのコメントを外す
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# capabilities: ["gpu"]
# count: all
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "3000:8080"
volumes:
- open-webui:/app/backend/data
extra_hosts:
- "host.docker.internal:host-gateway"
restart: always
volumes:
ollama:
open-webui:
コンテナを起動する
# docker-compose up -d
OllamaコンテナにModelファイルをインポートする
docker-compose.ymlのあるフォルダにmodel
フォルダができているので、そこにGGUFとModelfileを格納する。
/opt/ollama/model/
# ls
Llama-3-ELYZA-JP-8B-q4_k_m.gguf Modelfile
コンテナの中に入る
# docker-compose exec ollama bash
#
GGUFをインポートする
# cd ~/model
# ollama create elyza:jp8b -f ModelFile
コンテナから出る
# exit
以上でセットアップは終了。
動作確認
http://localhost:3000
でOpen-WebUIにアクセスできる。
おまけ
一連のファイルをISOファイルにしておくとVMに入れるときとかに便利です。
# mkisofs -r -J -V ollama -allow-limited-size -o ollama-standalone.iso ollama