Intel NUCのGPUを使ってローカル LLMがあまりにも、期待を裏切る、やってもできない子だったので、純粋にIntel CPU(ESXを動かしていたようなクソサーバ)で、LLMを立ててみる。
環境
物理、仮想(しなくていいけど)問わず、Ubuntu Server 24.04 最新でDocker CEがインストールされている環境。ちなみにWindowsやMACのDockerでもできると思うが、それだったらLM Studioを使ったほうがいい。
メモリは、少なくとも16GB(ギリギリ)、あればあるほどいい。例えば64GBなど。メモリも少なくともDDR4以上。
作成
以下を実行するだけ。結構簡単。
cat <<EOF > compose.yml
services:
ollama:
image: ollama/ollama
container_name: ollama
ports:
- 11434:11434
volumes:
- ./ollama/.ollama:/root/.ollama
restart: always
openwebui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- OPENAI_API_KEY=sk-local
ports:
- 3000:8080
depends_on:
- ollama
volumes:
- ./open-webui/data:/app/backend/data
restart: always
EOF
docker compose up -d
docker run --rm --volume /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once open-webui
# Llama 3 8B
docker exec -it ollama ollama pull llama3:8b-instruct-q4_K_M
# Mistral 7B
docker exec -it ollama ollama pull mistral:7b-instruct-q4_K_M
# GPT-OSS 20B
docker exec -it ollama ollama pull gpt-oss:20b
docker exec -it ollama ollama list
動作確認
1. ollama runでシンプルに試す
# Llama3-8B (Q4_K_M)
docker exec -it ollama ollama run llama3:8b-instruct-q4_K_M
# Mistral-7B (Q4_K_M)
docker exec -it ollama ollama run mistral:7b-instruct-q4_K_M
# GPT-OSS-20B
docker exec -it ollama ollama run gpt-oss:20b
→ 対話モードが立ち上がり、すぐ動作確認できる。/byeで終了できる。
2. curl で API 経由テスト
Ollama は OpenAI API 互換のエンドポイントを提供している。
モデル一覧確認
curl -s http://127.0.0.1:11434/api/tags | jq .
3つのモデルが表示されればOK
実行例(Llama3-8B)
# Llama3-8B
curl -s http://127.0.0.1:11434/v1/chat/completions \
-H "Content-Type: application/json” \
-d ‘{
"model":"llama3:8b-instruct-q4_K_M”,
"messages":[{"role":"user","content":"Say hello in one word.”}],
"max_tokens": 100
}' | jq -r '.choices[0].message.content’
実行例(Mistral-7B)
# Mistral-7B
curl -s http://127.0.0.1:11434/v1/chat/completions \
-H "Content-Type: application/json” \
-d ‘{
"model":"mistral:7b-instruct-q4_K_M”,
"messages":[{"role":"user","content":"Say hello in one word.”}],
"max_tokens": 100
}' | jq -r '.choices[0].message.content’
実行例(gpt-oss-20b)
# GPT-OSS-20B
curl -s http://127.0.0.1:11434/v1/chat/completions \
-H "Content-Type: application/json” \
-d ‘{
"model":"gpt-oss:20b”,
"messages":[{"role":"user","content":"Say hello in one word.”}],
"max_tokens": 100
}' | jq -r '.choices[0].message.content’
Open-WebUI
http://<IPアドレス> :3000
ユーザを登録
画面にアクセス。
3つのモデルが選択できるようになっているはず。
まぁ、インフラクソサーバでもどうにかLLMを動かしたいということが実現できた。でも、やっぱり遅いので、コードから呼ぶときはタイムアウトを余計に設定しておいたほうがいいと思う。