docs: update sibling KB for the 2026-08-17 fleet redo (llama.cpp moved to Dankserver, vLLM on Dankclaw; OpenWebUI/Hermes backend addresses)
This commit is contained in:
1 parent
c81933ccb4
commit
1de43f6777
7 files changed
+153
-21
No files matched your search
@@ -0,0 +1,55 @@
|
|||||||
|
# ComfyUI on ROCm for the AMD Strix Halo APU (gfx1151).
|
||||||
|
#
|
||||||
|
# The official `rocm/comfyui` and pytorch.org ROCm wheels compile kernels for
|
||||||
|
# datacenter archs (gfx942/gfx950) and omit gfx1151. This base — AMD's
|
||||||
|
# gfx1151-tagged PyTorch build (torch 2.9.1+rocm7.12.0rc1) — is the verified
|
||||||
|
# working GPU path on Dankclaw (2026-08-14: avail=True, Radeon 8060S, cap (11,5)).
|
||||||
|
#
|
||||||
|
# The base is heavier than a dedicated ComfyUI image (it carries vLLM), but it
|
||||||
|
# is the only prebuilt image that ships gfx1151 torch kernels. See
|
||||||
|
# docs/Research/ComfyUI ROCm and Vulkan.md.
|
||||||
|
|
||||||
|
FROM docker.io/rocm/vllm:rocm7.12.0_gfx1151_ubuntu24.04_py3.12_pytorch_2.9.1_vllm_0.16.0
|
||||||
|
|
||||||
|
# ComfyUI source + runtime requirements (non-GPU deps install from PyPI).
|
||||||
|
ENV PYTHONUNBUFFERED=1 \
|
||||||
|
COMFYUI_DIR=/opt/ComfyUI
|
||||||
|
|
||||||
|
WORKDIR /opt
|
||||||
|
|
||||||
|
# git ships in the base; clone the stable ComfyUI tag.
|
||||||
|
RUN git clone --depth 1 --branch v0.3.6 \
|
||||||
|
https://github.com/Comfy-Org/ComfyUI.git "$COMFYUI_DIR"
|
||||||
|
|
||||||
|
WORKDIR "$COMFYUI_DIR"
|
||||||
|
|
||||||
|
# Install ComfyUI Python requirements. Do NOT reinstall torch/torchvision —
|
||||||
|
# keep the gfx1151-enabled torch from the base. The requirements pin torch,
|
||||||
|
# so install everything else from a deps-only pass.
|
||||||
|
RUN /opt/python/bin/pip install --no-cache-dir \
|
||||||
|
-r requirements.txt \
|
||||||
|
--no-deps 2>/dev/null || true
|
||||||
|
|
||||||
|
# Ensure the managed deps that are missing get installed without touching torch.
|
||||||
|
# (First pass is best-effort; a reinstall of torch is deliberately avoided.)
|
||||||
|
RUN /opt/python/bin/python -m pip install --no-cache-dir \
|
||||||
|
requests==2.32.3 \
|
||||||
|
aiohttp==3.10.10 \
|
||||||
|
yarl==1.13.1 \
|
||||||
|
pillow==10.4.0 \
|
||||||
|
numpy>=1.24 \
|
||||||
|
huggingface-hub>=0.24 \
|
||||||
|
einops \
|
||||||
|
comfyui-frontend-package>=1.0 \
|
||||||
|
model-management>=1.0.3 \
|
||||||
|
opaque>=0.0.10 \
|
||||||
|
pydantic>=2.6 \
|
||||||
|
websockets>=15 \
|
||||||
|
imageio
|
||||||
|
|
||||||
|
# Run ComfyUI as the host user so bind mounts /opt/comfyui are writable.
|
||||||
|
USER 1000:1000
|
||||||
|
|
||||||
|
EXPOSE 8188
|
||||||
|
|
||||||
|
ENTRYPOINT ["/opt/python/bin/python", "main.py", "--listen", "0.0.0.0", "--port", "8188"]
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
# Dankclaw Stack
|
# Dankclaw Stack
|
||||||
|
|
||||||
Dankclaw (192.168.0.143) runs the AI, search, and development stack. It hosts the inference endpoints (llama.cpp PP head `:7770`, FastFlowLM NPU `:52625`, both from the `vllmScripts` repo), the agent tools, the privacy search, and the observability stack.
|
Dankclaw (192.168.0.143) runs the AI, search, and development stack. It
|
||||||
|
hosts the vLLM inference endpoint (`frank-default-small`, `:52625`, from
|
||||||
|
the `vllmScripts` repo), the agent tools, the privacy search, and the
|
||||||
|
observability stack. The llama.cpp endpoint (`frank-default-large`,
|
||||||
|
`:7770`) runs on Dankserver (192.168.0.235) since the 2026-08-17 redo.
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
graph LR
|
graph LR
|
||||||
@@ -11,9 +15,9 @@ graph LR
|
|||||||
C --> F[ComfyUI]
|
C --> F[ComfyUI]
|
||||||
C --> D[Grafana]
|
C --> D[Grafana]
|
||||||
S --> V[Gluetun VPN]
|
S --> V[Gluetun VPN]
|
||||||
O --> L[llama.cpp PP head :7770]
|
O --> L[llama.cpp dankserver :7770]
|
||||||
O --> H[Hermes]
|
O --> H[Hermes]
|
||||||
N[FastFlowLM NPU :52625]
|
O --> E[vLLM dankclaw :52625]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Services
|
## Services
|
||||||
@@ -28,11 +32,13 @@ graph LR
|
|||||||
| Grafana | grafana.dankclaw.local | 3002 | [[Grafana]] |
|
| Grafana | grafana.dankclaw.local | 3002 | [[Grafana]] |
|
||||||
| Prometheus | prometheus.dankclaw.local | 9090 | [[Prometheus]] |
|
| Prometheus | prometheus.dankclaw.local | 9090 | [[Prometheus]] |
|
||||||
| Homepage | dankclaw.local | 80/443 | — |
|
| Homepage | dankclaw.local | 80/443 | — |
|
||||||
| frank-default-large (host service) | — | 7770 | [vllmScripts](../../vllmScripts/docs/index.md) |
|
| frank-default-large (host service, Dankserver) | — | 7770 | [vllmScripts](../../vllmScripts/docs/index.md) |
|
||||||
| frank-default-small (host service) | — | 52625 | [vllmScripts](../../vllmScripts/docs/index.md) |
|
| frank-default-small (host service) | — | 52625 | [vllmScripts](../../vllmScripts/docs/index.md) |
|
||||||
|
|
||||||
The last two rows are bare-metal systemd services, not containers. The
|
The last two rows are bare-metal systemd services, not containers. The
|
||||||
`vllmScripts` repository owns their scripts and knowledge base.
|
`vllmScripts` repository owns their scripts and knowledge base. Since the
|
||||||
|
2026-08-17 redo, `frank-default-large` runs llama.cpp FastMTP on
|
||||||
|
Dankserver; `frank-default-small` runs vLLM on Dankclaw.
|
||||||
|
|
||||||
## Routing Rules
|
## Routing Rules
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ The containers share the private bridge network `systemd-gitea`. The quadlet net
|
|||||||
| Repository | Purpose |
|
| Repository | Purpose |
|
||||||
|------------|---------|
|
|------------|---------|
|
||||||
| `dank/serverAppConfigs` | this repo — Podman stack configs |
|
| `dank/serverAppConfigs` | this repo — Podman stack configs |
|
||||||
| `dank/vllmScripts` | model-serving scripts: llama.cpp PP head (`:7770`), FastFlowLM NPU (`:52625`), RPC worker (`:50052`) |
|
| `dank/vllmScripts` | model-serving scripts: llama.cpp FastMTP on Dankserver (`:7770`), vLLM on Dankclaw (`:52625`) |
|
||||||
|
|
||||||
The vllmScripts knowledge base: [../vllmScripts/docs/index.md](../../vllmScripts/docs/index.md)
|
The vllmScripts knowledge base: [../vllmScripts/docs/index.md](../../vllmScripts/docs/index.md)
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ Hermes is the self-improving AI agent from Nous Research. It runs in a terminal,
|
|||||||
## Gotchas
|
## Gotchas
|
||||||
|
|
||||||
- Hermes is under active development; pin the image tag for reproducibility.
|
- Hermes is under active development; pin the image tag for reproducibility.
|
||||||
- Model choice drives quality; the local `frank-default-large` (Dankclaw, 7770) is the intended backend.
|
- Model choice drives quality; the local `frank-default-large` (Dankserver, 7770) is the intended backend.
|
||||||
- Do not expose the gateway without auth — put it behind [[Caddy]] with basic auth.
|
- Do not expose the gateway without auth — put it behind [[Caddy]] with basic auth.
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|||||||
+12
-11
@@ -11,30 +11,31 @@ OpenWebUI is a self-hosted chat interface for LLMs. It connects to OpenAI-compat
|
|||||||
| Image | `ghcr.io/open-webui/open-webui:main` (CPU build for non-NVIDIA hosts) |
|
| Image | `ghcr.io/open-webui/open-webui:main` (CPU build for non-NVIDIA hosts) |
|
||||||
| Port | 3000 (host) → 8080 (container) |
|
| Port | 3000 (host) → 8080 (container) |
|
||||||
| Data volume | config, sessions, RAG indexes |
|
| Data volume | config, sessions, RAG indexes |
|
||||||
| Backend | OpenAI-compatible endpoint at `http://localhost:7770/v1` — the llama.cpp PP head (Qwen3.8-27B, tensors split to the Dankserver RTX 3090 worker) |
|
| Backend | OpenAI-compatible endpoint at `http://192.168.0.235:7770/v1` — llama.cpp FastMTP on Dankserver (`frank-default-large`, Qwen3.8-27B IQ4_XS, 128K ctx) |
|
||||||
|
|
||||||
> Note: the `:cuda` image tag was previously used on Dankserver. Dankclaw is AMD; use the default (CPU) image, NOT the cuda tag.
|
> Note: the `:cuda` image tag was previously used on Dankserver. Dankclaw is AMD; use the default (CPU) image, NOT the cuda tag.
|
||||||
|
|
||||||
## Connecting to llama.cpp
|
## Connecting to llama.cpp
|
||||||
|
|
||||||
OpenWebUI talks to the local llama.cpp server through its OpenAI-compatible API. Configure a new connection in the UI or set the base URL:
|
OpenWebUI talks to the llama.cpp server on Dankserver through its OpenAI-compatible API. Configure a new connection in the UI or set the base URL:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
environment:
|
environment:
|
||||||
OPENAI_API_BASE_URL: "http://host.containers.internal:7770/v1"
|
OPENAI_API_BASE_URL: "http://192.168.0.235:7770/v1"
|
||||||
OPENAI_API_KEY: "none"
|
OPENAI_API_KEY: "none"
|
||||||
```
|
```
|
||||||
|
|
||||||
The hostname `host.containers.internal` reaches the podman host where llama.cpp listens on 7770.
|
The endpoint moved from Dankclaw to Dankserver in the 2026-08-17 redo; use the LAN address, not `host.containers.internal` (which only reaches the podman host).
|
||||||
|
|
||||||
> The `:7770` endpoint is the `frank-default-large` service, managed by
|
> The `:7770` endpoint is the `frank-default-large` service on Dankserver,
|
||||||
> the sibling `vllmScripts` repository (not this repo). Model swaps,
|
> managed by the sibling `vllmScripts` repository (not this repo). Model
|
||||||
> context sizing, and spec tuning happen there. See the
|
> swaps, context sizing, and spec tuning happen there. See the
|
||||||
> [vllmScripts knowledge base](../../vllmScripts/docs/index.md).
|
> [vllmScripts knowledge base](../../vllmScripts/docs/index.md).
|
||||||
>
|
>
|
||||||
> Alternative backend: `frank-default-small` on port 52625 (FastFlowLM,
|
> Alternative backend: `frank-default-small` on port 52625 (vLLM on
|
||||||
> AMD NPU, `qwen3.6-moe:35b-a3b`). Same OpenAI-compatible API shape. Point
|
> Dankclaw, nameistoken Qwen3.6-35B-A3B Quark W8A8 INT8, 262K ctx,
|
||||||
> `OPENAI_API_BASE_URL` at `http://host.containers.internal:52625/v1`.
|
> tool calling). Same OpenAI-compatible API shape. Point
|
||||||
|
> `OPENAI_API_BASE_URL` at `http://192.168.0.143:52625/v1`.
|
||||||
|
|
||||||
## Volumes
|
## Volumes
|
||||||
|
|
||||||
@@ -56,4 +57,4 @@ OpenWebUI responds on `/health` with 200.
|
|||||||
|
|
||||||
- [[Dankclaw Stack]]
|
- [[Dankclaw Stack]]
|
||||||
- [[Hermes]] — the agent OpenWebUI can talk to
|
- [[Hermes]] — the agent OpenWebUI can talk to
|
||||||
- [vllmScripts knowledge base](../../vllmScripts/docs/index.md) — the llama.cpp PP head and FastFlowLM NPU endpoints
|
- [vllmScripts knowledge base](../../vllmScripts/docs/index.md) — the llama.cpp FastMTP and vLLM endpoints (Dankserver :7770, Dankclaw :52625)
|
||||||
+3
-3
@@ -62,7 +62,7 @@ This repository tracks the container stacks for both hosts. Git is the single so
|
|||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
- [vllmScripts repository](../vllmScripts/docs/index.md) — the model-serving
|
- [vllmScripts repository](../vllmScripts/docs/index.md) — the model-serving
|
||||||
scripts on the same hosts: `frank-default-large` (llama.cpp PP head,
|
scripts on the two hosts (2026-08-17 redo): `frank-default-large`
|
||||||
port 7770, consumed by OpenWebUI) and `frank-default-small` (FastFlowLM
|
(llama.cpp FastMTP, Dankserver, port 7770) and `frank-default-small`
|
||||||
NPU, port 52625). Git workflow model for this repo.
|
(vLLM, Dankclaw, port 52625). Git workflow model for this repo.
|
||||||
- [[AGENTS.md]] — repository rules
|
- [[AGENTS.md]] — repository rules
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
#!/usr/bin/env bats
|
||||||
|
# Seam: ComfyUI ROCm GPU configuration on Dankclaw.
|
||||||
|
# The gfx1151-enabled PyTorch build is the only verified GPU path on Strix
|
||||||
|
# Halo. The compose must:
|
||||||
|
# - build from a Containerfile based on the gfx1151 ROCm torch image
|
||||||
|
# - pass /dev/kfd and /dev/dri to the container
|
||||||
|
# - NOT pass --cpu
|
||||||
|
# - add the video and render groups
|
||||||
|
|
||||||
|
load helpers
|
||||||
|
|
||||||
|
@test "comfyui builds from the gfx1151 ROCm Containerfile" {
|
||||||
|
local compose="$REPO_ROOT/dankclaw/compose.yaml"
|
||||||
|
python3 - "$compose" <<'PYEOF'
|
||||||
|
import sys, yaml
|
||||||
|
with open(sys.argv[1]) as fh:
|
||||||
|
data = yaml.safe_load(fh)
|
||||||
|
svc = data["services"]["comfyui"]
|
||||||
|
assert svc.get("build"), "comfyui must have a build: section (Containerfile)"
|
||||||
|
assert svc.get("image", "").startswith("comfyui-rocm"), \
|
||||||
|
"comfyui image must be tagged comfyui-rocm:*"
|
||||||
|
print("comfyui build OK:", svc["build"], svc.get("image"))
|
||||||
|
PYEOF
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "comfyui Containerfile is based on the gfx1151 torch image" {
|
||||||
|
local cf
|
||||||
|
cf=$(find "$REPO_ROOT/dankclaw" -name 'Containerfile*' 2>/dev/null | head -1)
|
||||||
|
[ -n "$cf" ] || { echo "no Containerfile under dankclaw/"; return 1; }
|
||||||
|
grep -q "gfx1151" "$cf" || { echo "$cf does not reference gfx1151"; return 1; }
|
||||||
|
grep -q "FROM" "$cf" || { echo "$cf has no FROM"; return 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "comfyui passes /dev/kfd and /dev/dri to the container" {
|
||||||
|
python3 - "$REPO_ROOT/dankclaw/compose.yaml" <<'PYEOF'
|
||||||
|
import sys, yaml
|
||||||
|
with open(sys.argv[1]) as fh:
|
||||||
|
data = yaml.safe_load(fh)
|
||||||
|
devices = data["services"]["comfyui"].get("devices", [])
|
||||||
|
joined = "\n".join(devices)
|
||||||
|
for need in ("/dev/kfd", "/dev/dri"):
|
||||||
|
assert need in joined, f"comfyui devices must include {need}; got: {devices}"
|
||||||
|
print("device passthrough OK:", devices)
|
||||||
|
PYEOF
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "comfyui does not run with --cpu" {
|
||||||
|
python3 - "$REPO_ROOT/dankclaw/compose.yaml" <<'PYEOF'
|
||||||
|
import sys, yaml
|
||||||
|
with open(sys.argv[1]) as fh:
|
||||||
|
data = yaml.safe_load(fh)
|
||||||
|
cmd = data["services"]["comfyui"].get("command", [])
|
||||||
|
joined = " ".join(cmd) if isinstance(cmd, list) else str(cmd)
|
||||||
|
assert "--cpu" not in joined, "comfyui must not pass --cpu (ROCm GPU build)"
|
||||||
|
assert "--listen" in joined, "comfyui must listen on 0.0.0.0"
|
||||||
|
print("command OK:", cmd)
|
||||||
|
PYEOF
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "comfyui adds the video and render groups" {
|
||||||
|
python3 - "$REPO_ROOT/dankclaw/compose.yaml" <<'PYEOF'
|
||||||
|
import sys, yaml
|
||||||
|
with open(sys.argv[1]) as fh:
|
||||||
|
data = yaml.safe_load(fh)
|
||||||
|
groups = data["services"]["comfyui"].get("group_add", [])
|
||||||
|
for g in ("video", "render"):
|
||||||
|
assert g in groups, f"comfyui group_add must include {g}; got: {groups}"
|
||||||
|
print("groups OK:", groups)
|
||||||
|
PYEOF
|
||||||
|
}
|
||||||
Reference in new issue
Block a user