Ollama + Open WebUI を NVIDIA GPU + プロキシ環境下で動かす手順まとめ（Ubuntu 22.04）

# Ollama + Open WebUI を NVIDIA GPU + プロキシ環境下で動かす手順まとめ（Ubuntu 22.04）

## 概要

NVIDIA GPU 環境で、Ollama および Open WebUI を Docker 上で動作させ、ローカル LLM による GPU 推論を高速に行うための手順メモです。

---

## 1. Features（機能）

* Ollama と Open WebUI を Docker で構築
* NVIDIA Container Toolkit による GPU 対応
* ベンチマークスクリプトによるトークン生成速度測定
* プロキシ対応構成済み

## 2. 動作確認済み構成

| 項目     |                                     |
| ------ | ----------------------------------- |
| OS     | Ubuntu 22.04.4 LTS                  |
| GPU    | NVIDIA RTX 6000 Ada 48GB + T400 4GB |
| CUDA   | 12.2                                |
| ドライバ   | NVIDIA-SMI 535.104.05               |
| Python | 3.10.12                             |
| Docker | docker-ce 24.0.5 など（APT経由）          |
| WebUI  | open-webui v0.6.10                  |

---

## 3. セットアップ手順

### 3.1 OSとドライバ確認

```bash
lsb_release -a
nvidia-smi
```

### 3.2 プロキシ設定

`.bashrc` に以下を追加:

```bash
export http_proxy="http://<YOUR_PROXY>:8080"
export https_proxy="http://<YOUR_PROXY>:8080"
export ftp_proxy="http://<YOUR_PROXY>:8080"
export no_proxy="localhost,127.0.0.1,::1"
```

APTにも設定:

```bash
sudo nano /etc/apt/apt.conf.d/95proxies
Acquire::http::Proxy "http://<YOUR_PROXY>:8080";
Acquire::https::Proxy "http://<YOUR_PROXY>:8080";
```

### 3.3 Dockerインストール

```bash
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

sudo usermod -aG docker $USER
newgrp docker
```

### 3.4 Dockerのプロキシ設定

```bash
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
```

以下を記載：

```
[Service]
Environment="HTTP_PROXY=http://<YOUR_PROXY>:8080"
Environment="HTTPS_PROXY=http://<YOUR_PROXY>:8080"
Environment="NO_PROXY=localhost,127.0.0.1"
```

再起動。

```
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker
```

---

## 4. NVIDIA Container Toolkit 設定

```bash
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | \
  sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null

sudo apt update
sudo apt install -y nvidia-container-toolkit

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker
```

### 4.1 動作確認

```bash
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
```

---

## 5. Ollama + Open WebUI の起動

### 5.1 Docker Compose ファイル（例）

`docker-compose.yml`

```yaml
version: "3.9"

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    restart: unless-stopped
    ports:
      - "11434:11434"
    volumes:
      - ollama-data:/root/.ollama
    environment:
      # 以下は必要に応じて設定（プロキシ利用者向け）
      # HTTP_PROXY: http://<YOUR_PROXY>:8080
      # HTTPS_PROXY: http://<YOUR_PROXY>:8080
      # http_proxy: http://<YOUR_PROXY>:8080
      # https_proxy: http://<YOUR_PROXY>:8080
      # NO_PROXY: localhost,127.0.0.1
      # no_proxy: localhost,127.0.0.1
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped
    ports:
      - "3000:8080"
    volumes:
      - open-webui-data:/app/backend/data
    environment:
      WEBUI_AUTH: "false"
      WEBUI_EMBEDDING_DISABLED: "true"
      # 以下は必要に応じて設定（プロキシ利用者向け）
      # HTTP_PROXY: http://<YOUR_PROXY>:8080
      # HTTPS_PROXY: http://<YOUR_PROXY>:8080
      # http_proxy: http://<YOUR_PROXY>:8080
      # https_proxy: http://<YOUR_PROXY>:8080
      # NO_PROXY: localhost,127.0.0.1
      # no_proxy: localhost,127.0.0.1
      OLLAMA_BASE_URL: http://<HOST_IP>:11434
    extra_hosts:
      - "host.docker.internal:host-gateway"
    healthcheck:
      disable: true

volumes:
  ollama-data:
  open-webui-data:
```

```bash
docker compose up -d
```

### 5.2 モデルの取得と確認

```bash
curl -X POST http://127.0.0.1:11434/api/pull -d '{ "name": "phi4:latest" }'
curl http://127.0.0.1:11434/api/tags
```

---

## 6. Usage（使い方）

### 6.1 起動

```bash
docker compose up -d
```

### 6.2 モデルの取得（API）

```bash
curl -X POST http://127.0.0.1:11434/api/pull -d '{ "name": "phi4:latest" }'
```

### 6.3 推論（API）

```bash
curl http://127.0.0.1:11434/api/generate -d '{
  "model": "phi4:latest",
  "prompt": "Hello! Please introduce yourself!",
  "stream": false
}'
```

### 6.4 推論（WEB UI）

ブラウザで [http://127.0.0.1:3000/](http://127.0.0.1:3000/) にアクセス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/5bb65288-6b2f-4e62-8b18-81bd13a11e95.png)

### 6.5 推論（Cline）

VSCodeにCline拡張機能をインストールし、設定パネルにて `OLLAMA_BASE_URL` を指定。

---

## 7. Benchmark（ベンチマーク）

ベンチマークスクリプト: `util/benchmark.py`
```Python
import time
import requests

data = {
    "model": "phi4:14b",
    "prompt": "Explain general relativity in simple terms.",
    "stream": False
}

start = time.time()
response = requests.post("http://localhost:11434/api/generate", json=data)
elapsed = time.time() - start

text = response.json()["response"]
token_count = len(text.split())  # Approximate

print(f"Time: {elapsed:.2f} seconds")
print(f"Tokens: {token_count}")
print(f"Tokens/sec: {token_count / elapsed:.2f}")
```

ベンチマーク例：
```bash
$ python3 util/benchmark.py
Time: 9.61 seconds
Tokens: 433
Tokens/sec: 45.06 
```

---

## 8. Troubleshooting（よくあるトラブルと対策）

| 現象            | 対策                             |
| ------------- | ------------------------------ |
| モデルがUIに表示されない | `OLLAMA_BASE_URL` にホスト実IPを指定   |
| モデル数が0と表示される  | `docker logs open-webui` でログ確認 |
| モデル再DLされる     | `ollama_data` ボリュームが維持されているか   |

---

## Appendix（補足情報）

* `nvidia-smi` 結果：RTX 6000 Ada (48GB), CUDA 12.2
* WebUI アクセス: `http://localhost:3000`
* Ollama API: `http://localhost:11434`
* モデル格納パス: `/var/lib/docker/volumes/ollama-stack_ollama-data/_data/models`

---

## おわりに

本記事では、Ollama + Open WebUI を NVIDIA GPU + プロキシ環境下で効率よく構築し、高速推論を実現する方法をまとめました。業務利用や高速なローカルLLM実験の出発点として活用してください。