LLM推論マシンの環境構築メモ(ollama open-webui ubuntu2204)

ChatGPTのようなユーザーインターフェースでLLMを使う。

テスト環境（ubuntu2204 RTX3060 12G）

docker-compose.yamlの下に、二つのdockerfile(ollama,open-webui)を配置して二つのコンテナが起動するタイプ。
稼働時は、docker-composeをupして、外部のブラウザからアクセスする。

## フォルダ構造
```
project/
├── docker-compose.yaml
├── ollama/
│   └── Dockerfile
└── open-webui/
    └── Dockerfile

```

## 1. 各サービス用の Dockerfile
【ollama/Dockerfile】
```dockerfile

# ollama/Dockerfile
FROM ollama/ollama
# コンテナ起動時のデータ永続化用ボリューム
VOLUME /root/.ollama
# ポート11434を公開
EXPOSE 11434

# ※ GPUを使用する場合、docker-compose側で runtime や device_requests の設定を追加してください。

```

【open-webui/Dockerfile】
```dockerfile

# open-webui/Dockerfile
FROM ghcr.io/open-webui/open-webui:main
# データ永続化用ボリュームの指定
VOLUME /app/backend/data
# コンテナ内でバックエンドがリッスンするポートを公開
EXPOSE 8080
```

## 2. docker-compose.yaml
以下の docker-compose.yaml では、各サービスを起動する設定と、ボリューム、ポート、環境変数などを指定しています。

```yaml
version: "3.8"

services:
  ollama:
    # 既存イメージを利用する場合は image を使用できます。
    # カスタムビルドする場合は、以下の build オプションのコメントを解除してください。
    # build: ./ollama
    image: ollama/ollama
    container_name: ollama
    volumes:
      - ollama_data:/root/.ollama
    ports:
      - "11434:11434"
    # NVIDIA GPUを利用する場合は、以下のオプションを有効にしてください（Docker環境に依存します）。
    # runtime: nvidia
    # または device_requests を利用する場合（Docker Compose v2.4以降）
    # deploy:
    #   resources:
    #     reservations:
    #       devices:
    #         - driver: nvidia
    #           count: all
    #           capabilities: [gpu]

  open-webui:
    # カスタムビルドする場合は、以下の build オプションのコメントを解除してください。
    # build: ./open-webui
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: always
    environment:
      - WEBUI_AUTH=False  # 新規ユーザー登録画面をスキップ
    volumes:
      - open_webui_data:/app/backend/data
    ports:
      - "3000:8080"
    extra_hosts:
      - "host.docker.internal:host-gateway"

volumes:
  ollama_data:
  open_webui_data:
```
## コンテナの構築
vs-codeでプロジェクトフォルダを開く。docker関係の拡張をインストール。
docker-compose.yamlを右クリックして、upを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/2cbcd25d-f529-b515-320a-acef5c2ec2e0.png)

コンテナが起動したら、http://localhost:3000/にアクセスするととりあえず、チャットできる画面になる。

## モデルのダウンロード
この段階では、使えるLLMがダウンロードされていないので、ollamaコンテナの中でダウンロードを実施する。
vs-codeなら以下の図のように、コンテナ内のターミナルを起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/3240735b-97f4-67ac-ec3f-d9507e22e768.png)

ollama pullコマンドを使って、例えば以下のようにモデルをダウンロードする。GPUメモリ１２Gでも以下のものは動きました。
```
ollama pull deepseek-r1
#サイズ指定ないものは７ｂ
ollama pull deepseek-r1:32b
ollama pull hf.co/mmnga/cyberagent-DeepSeek-R1-Distill-Qwen-32B-Japanese-gguf
```
ダウンロードされる様子。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/526c5af3-66b2-e438-daea-52d78a498050.png)

## ブラウザでアクセスしてチャットする
再度、http://localhost:3000/にアクセス　以下のような画面で操作できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/04dc20f6-eb72-841a-bc0a-206fa3a95963.png)



## 利用可能モデル
ollama公式一覧
https://github.com/ollama/ollama?tab=readme-ov-file#model-library
https://ollama.com/library?sort=popular

huggingface gguf形式とjapanでフィルターするなど。gguf形式だと変換せずに利用可能。
https://huggingface.co/mmnga/cyberagent-DeepSeek-R1-Distill-Qwen-32B-Japanese-gguf
https://huggingface.co/models?library=gguf&sort=trending&search=japan

## 参考ページ

https://zenn.dev/karaage0703/articles/c271ca65b91bdb
https://zenn.dev/laniakea/articles/63531b0f8d4d32
https://github.com/ollama/ollama
https://github.com/open-webui/open-webui