(続き)UGREEN DXP6800 Pro で Ollama を動かす — CUDAエラー地獄と、Zed からのローカルコーディング接続まで
- ccf代表
- 19 時間前
- 読了時間: 7分
はじめに
前回、UGREEN DXP6800 Pro に eGPU 経由で RTX 2000 Ada を載せ、Docker から --gpus all でGPUを叩けるところまで持っていきました。今回はその続きで、本来の目的だった ローカルLLMをコーディングに使うところまでの記録です。
ゴールはこんな感じ:
NAS本体で Ollama を常時稼働させる
ブラウザからは Open WebUI で叩く
エディタ Zed からも繋いで、コーディング補助に使う
……が、これがまた一筋縄ではいかず、CUDAエラーで全モデルが起動しないという壁にぶつかりました。結論から言うと、原因は「Ollamaが新しすぎたこと」でした。同じ構成でハマっている人の役に立てば嬉しいです。
最終的に安定した構成はこちら:
UGREEN DXP6800 Pro
└ NVIDIA Driver 535.261.03 (CUDA 12.2)
└ RTX 2000 Ada (VRAM 16GB)
└ Docker
├ ollama … ollama/ollama:0.24.0 ← ここがキモ
└ open-webui … ghcr.io/open-webui/open-webui:main
└ Zed (別PC) → http://<NASのIP>:11434
つまずき①:Open WebUI から叩くと全モデルが落ちる
Ollama と Open WebUI のコンテナを立てて、いざモデルを動かそうとしたら、チャット画面にこのエラーが出ました。
llama-server process has terminated: CUDA error
CUDA error: device kernel image is invalid: CUDA error
CUDA error: device kernel image is invalid
nvidia-smi は通るし、GPUもちゃんと認識している。なのにモデルを載せた瞬間に落ちる。qwen3:14b でも qwen3-coder:30b でもダメ。
nvidia-smi を見ると、GPUは完全にアイドルで No running processes found。つまりGPUメモリを確保する前に弾かれている = 容量オーバーではなく、CUDAカーネルそのものが噛み合っていない、という症状でした。
原因:Ollama v0.30 系の「llama.cpp ネイティブ化」と、ドライバー535の相性
調べていくと、Ollama公式リポジトリにドンピシャの報告がありました。
Ollama v0.30.0 で内部エンジンが GGML から llama.cpp ネイティブに切り替わった。その結果、ドライバー535 / CUDA 12.2 環境ではプリビルドのCUDAカーネルが合わず、モデルが起動しなくなった。v0.24.0以前は同じハードで正常だった。
エラーに出ていた llama-server が、まさにこの新エンジンの正体です。
前回あえて「安定重視で535を選んだ」のが、ここで裏目に出ました。535(CUDA 12.2)に対して、ollama:latest の新エンジンが要求するCUDAが新しすぎたわけです。前に llama3.2:3b だけは動いたように見えたのは、おそらくCPUにフォールバックしていただけでした。
選択肢は2つ:
ドライバーを570系に上げる(latestのまま使える。ただし前回の悪夢再び=ブートが飛ぶリスク)
Ollamaを旧エンジン版に固定する(ドライバーに触らない。低リスク)
前回さんざんブートを飛ばした身としては、迷わず②を選びました。
解決:Ollama を v0.24.0 に固定する
ダウンロード済みモデルはボリュームに残るので消えません。バージョンを明示してコンテナを作り直します。
docker network create ai 2>/dev/null
docker rm -f ollama
docker run -d \
--gpus all \
--network ai \
-p 11434:11434 \
-v ollama:/root/.ollama \
--name ollama --restart unless-stopped \
ollama/ollama:0.24.0
動作確認:
docker exec -it ollama ollama --version # 0.24.0
docker exec -it ollama ollama run qwen3:14b "こんにちは"
docker exec -it ollama ollama ps
ollama ps の結果がこれ。
NAME SIZE PROCESSOR CONTEXT UNTIL
qwen3:14b 16 GB 100% GPU 40960 Forever
100% GPU。通った瞬間、また小さくガッツポーズしました。535のまま、旧エンジンでGPU推論が動く状態にやっとたどり着けました。
ポイント:ollama/ollama:latest は中身が動くので、docker run でバージョンを明示的にピン留めしておくのが安全です。再起動のたびに勝手に新エンジンに上がって、また同じ地獄を見ることになります。
つまずき②:Open WebUI が Ollama に繋がらない
Ollamaが動いても、Open WebUI側のログにこれが出ました。
Cannot connect to host ollama:11434 [Name or service not known]
ollama という名前を解決できていません。原因は、2つのコンテナが同じユーザー定義ネットワークに乗っていなかったこと。Dockerのデフォルトbridgeはコンテナ名でのDNS解決ができません。
両方を同じネットワーク ai に繋いで解決:
docker network connect ai ollama 2>/dev/null
docker network connect ai open-webui 2>/dev/null
docker restart open-webui
確認:
docker exec open-webui getent hosts ollama # 行が返ればOK
Open WebUI 側の Ollama API URL は http://ollama:11434 を指定。これでモデル一覧が出るようになりました。
ちなみにこの過程で一度、Open WebUI のコンテナを作り直してログインできなくなりました。Open WebUIは初回が「ログイン」ではなく「サインアップ(新規登録)」で、最初に作ったアカウントが管理者になります。データを残したいときは -v open-webui:/app/backend/data のように名前付きボリュームを必ず付けること。
Zed から繋ぐ
ここまで来れば、エディタからも使えます。Zed はOllamaにネイティブ対応しているので、settings.json に接続先を書くだけ。ポートは Ollama 標準の 11434 です。
{
"language_models": {
"ollama": {
"api_url": "http://<NASのIP>:11434"
}
}
}
Zedが別PCで動くなら、localhostではなくNASのIPを指定(hostname -I で確認)
疎通確認は curl http://<NASのIP>:11434/api/tags でモデル一覧JSONが返ればOK
モデル選択に qwen3:14b などが出てくれば成功です。
つまずき③:30Bモデルがメモリ不足で載らない
調子に乗って、コーディング用に qwen3-coder:30b(MoE・アクティブ3.3B)を Zed から呼んだら、今度はこれ。
500 Internal Server Error
model requires more system memory (27.6 GiB) than is available (14.6 GiB)
27.6 GiB 必要 = 重み約18GB + 大きなコンテキスト用のKVキャッシュ
14.6 GiB しかない = NAS本体の空きRAM
ここで大事な切り分け。ollama ps で qwen3:14b は 100% GPU で動いている = GPU自体は正常。問題は本体のRAMが足りないことでした。
そして勘違いしていたのが、「eGPUは外付けだからメモリ増設できないのでは?」という点。これは別物でした。
種類 | 場所 | 増設 |
VRAM 16GB | 外付けeGPU内の RTX 2000 Ada | ❌ 固定(GPU交換しかない) |
システムRAM | NAS本体のSODIMMスロット | ✅ 可能 |
調べると UGREEN DXP6800 Pro は DDR5 SODIMM × 2スロット、最大64GB。eGPUが外付けかどうかとは無関係に、本体RAMは増やせます。
つまり今の構成では:
16GB VRAM にフル搭載できる 14Bクラスが、GPU完結で快適に動く上限
30Bクラスは、RAMを増やしてGPU+RAMオフロードで動かす(MoEなのでアクティブ3.3B、実用速度は出やすい)
ということで、64GB(32GB×2)のRAMを発注することにしました。SODIMM・DDR5-4800・Non-ECC・Unbuffered のキットを、ペアでデュアルチャネルに。
今回のキモになったポイント
ollama:latest は535には新しすぎる。 v0.30系のllama.cpp化で device kernel image is invalid が出るなら、迷わず ollama/ollama:0.24.0 にピン留め。ドライバーを上げるより安全。
GPUが効いているかは ollama ps で確認。 100% GPU でなければ、それはCPUで動いているだけ。
コンテナ間通信はユーザー定義ネットワークで。 デフォルトbridgeはコンテナ名解決ができない。docker network connect で揃える。
Zed接続はポート11434 + api_url にNASのIP。 localhostではない。
VRAMとシステムRAMは別物。 16GB VRAMは固定、本体RAMは最大64GBまで増設可能。14Bは今すぐGPUで快適、30Bはメモリ増設後の宿題。
おわりに
前回はGPUを認識させるだけで心が折れかけましたが、今回は「Ollamaが新しすぎる」という、ある意味あっけない原因でした。とはいえ、535を維持したまま、旧エンジン版にピン留めしてGPU推論を通すという落とし所に気づくまでが長かったです。
現状、qwen3:14b が Zed からGPUで快適に動く、十分実用的な環境になりました。次回は 64GBへのメモリ増設後に、qwen3-coder:30b をどこまで実用的に回せるかを試してみます。
NAS一台で、ストレージもローカルLLMもコーディング補助も完結する——やっぱり夢がありますね。続きはまた別の記事で。
最後まで読んでいただき、ありがとうございました。
追伸)
qwen3:14bをZedでつないで、以下のプロンプトを投げました。
まぁそれっぽいです。将来的にはメモリを増設する予定なので、その影響を定量的に測定したいですね。
このアプリ全体の解析をお願いしたいです。**プロジェクトの概要**
- **目的**: XXXの**機能を維持しながら不具合を修正し**、さらに**UIの刷新**を行う。
- **開発フロー**:
- **1 PR = 1 Issue** の原則を採用
- **Codexレビュー(AIによるコードレビュー)** の実施
- **GitHub Actions** を用いた CI/CD
- **Azure** 上でのデプロイ(リソースグループ `mgh-althea-2026`)
・
・
・
🐳 **技術スタックの概要**
- **言語**: Java, RPG, CL, VB(現行システム)→ 後継はおそらく TypeScript/JavaScript(`services/todo` が Azure で稼働中)
- **フレームワーク**: Prisma(SQL Server 採用)
- **DB**: SQL Server
- **CI/CD**: GitHub Actions(Trivy によるスキャン、gitleaks 検出、PR本文Lint)
- **インフラ**: Azure(リソースグループ `xxx`)
・
・
・
🛡️ **セキュリティと品質管理**
- **gitleaks**: シークレット漏洩の検出(`.gitleaks.toml` 設定)
- **Trivy**: ソースコードの脆弱性スキャン(`tools/` 配下のスクリプトも対象)
- **Codex レビュー**: AIによるコード品質の確認(移行起因バグや権限漏れの検出)



コメント