Asked whether Vulkan on both devices unlocks the split. It does not: the per-tensor design aborts byte-identically, because the gate is not the driver mix but `--override-tensor` — `has_tensor_overrides()` is a required term of the scheduler's `pipeline_parallel` flag (llama-context.cpp:433, the only place in the tree that reads it), and that flag sets `n_copies` in `ggml_backend_sched_new`. With `n_copies == 1` a pre-allocated weight on a non-primary device has no backend and the graph aborts. Chasing it exposed a harness artifact that invalidated the earlier conclusion: llama-bench splits a device LIST with `/` and SWEEP values with `,`, so `-dev CUDA0,Vulkan1` was two single-device runs all along (and `-ts 0.85,0.15` two sweep values, i.e. device 0 takes everything — which is where the bogus OOM came from). With the correct syntax two-device splits work in both flavours: pure Vulkan -dev Vulkan1/Vulkan0 -ts 0.85/0.15 -> 27.55 tok/s @64k (12.8 GiB on the 3090) cross-vendor -dev CUDA0/Vulkan1 -ts 0.15/0.85 -> 27.23 tok/s @64k, pp512 268.5 (15.0 GiB) iGPU alone 25.77 tok/s @64k, pp512 231.8 +7 % decode, +16 % prefill — real but not a regime change, and it costs the 3090 ~15 GiB, which this fleet spends on its only vision endpoint. The design's premise still fails: whole layers carry their experts (1.62 GiB each), the 12 attention layers are spread every 4th, and the 32.8 GiB PLE must stay on the main device, so KV cannot be consolidated on the 3090. Also records the evening's incident (a dead rootless podman pause process took all container management down; `podman system migrate` panics in 5.7.0; reboot repaired it) and the netavark host-address lesson from the hermes 502.
246 lines
13 KiB
Markdown
246 lines
13 KiB
Markdown
# Server App Configs
|
||
|
||
Podman deployment configuration for two homelab servers: Dankserver and Dankclaw.
|
||
|
||
This repository is the single source of truth for both hosts. It tracks the
|
||
container stacks and the LLM inference fleet. Edits flow through this repo,
|
||
then deploy to the targets with `scripts/deploy.sh` (one script per target
|
||
covers both workloads).
|
||
|
||
> 2026-08-22: the former `vllmScripts` repository (LLM fleet) is merged
|
||
> into this repo with its full git history. Its knowledge base now lives at
|
||
> [serverAppConfigs-docs/LLM/index.md](LLM/index.md).
|
||
|
||
## Hosts
|
||
|
||
| Host | IP | Role | OS |
|
||
|------|----|------|----|
|
||
| Dankserver | 192.168.0.235 | Media & library stack | Ubuntu 24.04 |
|
||
| Dankclaw | 192.168.0.143 | AI, search & development stack | Ubuntu 26.04 |
|
||
|
||
## Stacks
|
||
|
||
- [[Dankserver Stack]] — RomM, Copyparty, Calibre, Calibre-Web, Caddy
|
||
- [[Dankclaw Stack]] — SearXNG (via Gluetun), ComfyUI, OpenWebUI, Hermes, Gitea, Grafana, Prometheus, Caddy
|
||
|
||
## Architecture
|
||
|
||
- [[Network Architecture]] — Caddy reverse proxy, hostname routing, Gluetun VPN path
|
||
- [[Storage Policy]] — bind mounts, data locations, ownership
|
||
- [[Deployment Flow]] — service-scoped git deploy, target map, and health checks
|
||
- [[Testing Policy]] — the test seams and how to run them
|
||
- [[E2E Suite]] — the Playwright suite that drives the live guard chain
|
||
- [[Container Network Namespaces]] — which local services are addressable from each Podman network namespace on Dankclaw
|
||
|
||
## Dankserver Storage
|
||
|
||
- [[Entropy Volume]] — command-line unlock and mount helper
|
||
|
||
## Dankserver Services
|
||
|
||
- [[RomM]] — retro game manager
|
||
- [[RomM-Scraping]] — metadata providers, cover art, naming conventions
|
||
- [[Copyparty]] — file sharing and streaming
|
||
- [[Jellyfin]] — media server (movies, TV, music)
|
||
- [[Calibre]] — e-book library engine
|
||
- [[Calibre-Web]] — e-book web frontend
|
||
- [[ARR-Stack]] — automated media download overview
|
||
- [[sonarr]] — TV show management
|
||
- [[radarr]] — movie management
|
||
- [[lidarr]] — music management
|
||
- [[readarr]] — ebook/audiobook management
|
||
- [[prowlarr]] — indexer management
|
||
- [[qbittorrent]] — torrent download client
|
||
- [[Plex]] — media server on Dankserver (lscr.io/linuxserver/plex container via
|
||
quadlet; CPU decode only — no GPU passthrough)
|
||
- [[Tautulli]] — Plex statistics and notifications (v2.18.1-ls242, quadlet unit)
|
||
- [[mariadb]] — RomM database backend
|
||
- [[redis]] — RomM cache/queue backend
|
||
|
||
## Dankclaw Services
|
||
|
||
- [[SearXNG]] — privacy metasearch (VPN-routed)
|
||
- [[SearXNG Providers]] — unblocking Google & other upstream engines behind the VPN
|
||
- [[Gluetun]] — the VPN tunnel container
|
||
- [[Valkey]] — SearXNG cache and limiter store
|
||
- [[ComfyUI]] — node-based AI image generation (ROCm GPU, gfx1151 build)
|
||
- [[OpenWebUI]] — chat UI for local LLMs
|
||
- [[Hermes]] — the Nous Research agent
|
||
- [[Hermes-Dashboard]] — the Hermes web management UI (config, keys, sessions)
|
||
- [[Hermes-WebUI]] — the Hermex server (loopback API for the iPhone app, SSH-tunneled)
|
||
- [[Gitea]] — Git hosting (migrated)
|
||
- [[Postgres]] — Gitea database backend
|
||
- [[Seerr]] — unified *arr request manager (guard-chained; fronts FrankBook-Pro's stack)
|
||
- [[Marreta]] — content-cleaning proxy (guard-chained; shares SearXNG's Gluetun egress)
|
||
|
||
## Infrastructure
|
||
|
||
- [[LAN-DNS]] — name resolution, Pi-hole, router DNS hand-off
|
||
- [[Pi-hole]] — the LAN DNS server (quadlet, records, web UI)
|
||
- [[Caddy]] — reverse proxy and TLS
|
||
- [[Anubis]] — bot challenge proxy fronting the guarded vhosts (chain, policy, gotchas)
|
||
- [[Authentik]] — the homelab's SSO / OIDC provider (forward_auth)
|
||
- [[authentik-postgres]] — Authentik database service
|
||
- [[authentik-server]] — Authentik server + Caddy outpost service
|
||
- [[authentik-worker]] — Authentik background worker service
|
||
- [[Homepage]] — password-protected service index
|
||
- [[Homepage Design Grilling]] — homepage decision log and open questions
|
||
- [[Observability]] — Grafana, Prometheus, Loki, Alloy, node-exporter: the stack, its quadlet deployment, its exposure, and what is still missing (alert delivery)
|
||
- [[Grafana]] — dashboards (datasource and the LLM fleet dashboard provisioned as code since 2026-09-16)
|
||
- [[Prometheus]] — metrics collection (5 alert rules + 1 recording rule; evaluated but not delivered — no Alertmanager)
|
||
- [[Node-Exporter]] — host metrics
|
||
- [[Loki]] — log storage
|
||
- [[Alloy]] — log shipping (replaces Promtail)
|
||
- [[FrankBook-Pro]] — Mac mini *arr + qBittorrent inside podman machine (gluetun-gated)
|
||
|
||
## Research
|
||
|
||
- [[Service Research Brief]] — consolidated subagent research behind these pages
|
||
- [[ComfyUI ROCm and Vulkan]] — live-verified GPU path for ComfyUI on Strix Halo
|
||
- [[Lemonade and sd.cpp]] — the ggml-family image-generation alternative
|
||
- [[Llama Cpp Runtimes]] — mainline vs charlie12345/ROCmFPX vs ik_llama.cpp: quantization + server fit
|
||
- [[Llama Cpp Code Diff]] — code-level quantization diff of the three llama.cpp runtimes
|
||
- [[SGLang]] — the structured-generation serving engine (llama.cpp/vLLM comparison + our fit)
|
||
- [[Backblaze Integration]] — off-site backup plan (future)
|
||
- [[Jellyfin]] — media server research brief
|
||
- [[ARR-Stack]] — automated download stack research brief
|
||
|
||
## LLM Fleet
|
||
|
||
The LLM inference fleet on the two hosts. Full index:
|
||
[serverAppConfigs-docs/LLM/index.md](LLM/index.md).
|
||
|
||
### Deployment and Topology
|
||
|
||
- [[deployment]] — unified deploy and update process for both servers
|
||
- [[frank-redo-2026-08-17]] — the 2026-08-17 topology change
|
||
- [[frank-medium-llamacpp-dflash2]] — the ACTIVE frank-medium runbook since
|
||
2026-09-16: mainline llama.cpp (gfx1201 HIP build) serving
|
||
ajgazin/Swift-Qwen3.8-27B-Uncensored-Dynamic-MTP-GGUF at UD-Q8_K_XL with
|
||
the DFlash2 drafter (z-lab/Qwen3.8-27B-DFlash2-GGUF at Q8_0) on
|
||
Dankserver's 2x Radeon AI PRO R9700 as one layer-split process behind the
|
||
:7770 endpoint — no tensor parallelism, because the second card cannot
|
||
dispatch an RCCL collective
|
||
- [[frank-medium-radiance-mxfp4]] — RETIRED 2026-09-16: the vllm-radiance
|
||
MXFP4 stack serving just1moremodel/Qwen3.8-27B-Uncensored-MXFP4-awq on
|
||
Dankserver's 2x Radeon AI PRO R9700 as two single-GPU replicas behind a
|
||
round-robin proxy; kept as the record of the deployment
|
||
[[frank-medium-llamacpp-dflash2]] replaced, plus the PCIe-atomics evidence
|
||
that rules out TP=2 on this host (since 2026-09-15/16)
|
||
- [[Dual-R9700-Cooperation]] — why the two R9700s cannot run tensor-parallel
|
||
together: the PCIe-atomics gate quoted from ROCclr, the measured RCCL matrix
|
||
(collectives *and* P2P `send`/`recv` both fail on card #2, which rules out
|
||
pipeline parallelism too), what is closed and what is still open, and the two
|
||
hardware paths — a ~$30 M.2→PCIe x4 riser into the free, CPU-attached M.2_2
|
||
slot, or a board whose CPU x16 bifurcates to x8/x8
|
||
- [[frank-medium-rocmfpx]] — PRIOR frank-medium deployment (llama.cpp era):
|
||
charlie12345/ROCmFPX serving kingjones777/
|
||
Qwen3.8-27B-ROCmFPX-Q8_0-AGENT-GGUF; kept as the record of the runtime it
|
||
replaced
|
||
- [[freetoken-benchmark-sweep]] — KV pool vs decode speed sweep (bs1/bs3/bs4/bs6, 8k–700k KV) on the retired Dankserver RTX 3090
|
||
- [[kingjones-strix-mtp]] — the Qwen3.8-27B-Q6_0 ROCmFPX AGENT era with the
|
||
standalone MTP draft (Dankclaw, 2026-08-25 → 2026-08-29; historical)
|
||
- [[agentionai-fast-imatrix]] — the retired frank-large runbook:
|
||
agentionai/Qwen3.8-Flash-Next-ROCmFP4-FAST-imatrix (87.06 GiB,
|
||
Q4_0_ROCMFP4_FAST) + own MTP draft, build-qwen38 (retired 2026-08-30;
|
||
rollback record)
|
||
- [[halogen-flash-server]] — the ACTIVE frank-large runbook again since
|
||
2026-09-16 (rootless Quadlet, port 7770): peonist-ai/halogen-flash-server
|
||
0.5.8 serving peonist-ai/halogen-qwen3.8-flash-next (w4b `.hgn` + quality
|
||
overlay) on the gfx1151 iGPU — two 200k conversations over one
|
||
400,384-position pool, deployed flags, memory model, client contract
|
||
- [[frank-large-ik-uncensored]] — the RETIRED 2026-09-16 frank-large runbook
|
||
and rollback target (2026-09-15 → 09-16): ik_llama.cpp serving
|
||
mradermacher/Qwen3.8-Flash-Next-Uncensored-i1-Q4_K_M on the RTX 3090 +
|
||
Strix Halo hybrid — its measured envelope is why the fleet went back
|
||
- [[dankclaw-iommu-translation-off]] — why Dankclaw boots with
|
||
`amd_iommu=off` since 2026-09-11 (13-16 % prefill), what it cost
|
||
(the NPU endpoint), and how to revert
|
||
- [[kingjones-strix-rocmfp4]] — the PRIOR frank-large runbook
|
||
(2026-08-30 → 2026-09-11) and the rollback target:
|
||
kingjones777/Qwen3.8-Flash-Next-ROCmFP4-STRIX-GGUF on the card's
|
||
pinned kingjones30/ROCmFPX build
|
||
- [[kingjones-q8agent-rocmfpx]] — the retired Q8_0-AGENT investigation and `set_rows` failure
|
||
- [[eemin-rocmi4-mtp]] — the former caf-eemin Qwen3.8-27B ROCmI4 embedded-MTP model on Dankclaw
|
||
- [[ciru-activefpx-promptforge]] — the RETIRED v3 CIRU PromptForge runtime on Dankclaw (superseded 2026-08-24)
|
||
- [[kingjones-strix-mtp]] — the kingjones Qwen3.8-27B ROCmFP4 STRIX MTP model on Dankclaw (active)
|
||
- [[dealign-ornith-crack]] — the retired Ornith-1.5-35B-A3B CRACK model on Dankserver (retired 2026-09-02)
|
||
- [[frank-small-qwen38-gsq-rco]] — the ACTIVE frank-small runbook since
|
||
2026-09-16: mainline llama.cpp serving ISTA-DASLab/Qwen3.8-27B-GSQ-RCO-
|
||
GGUF at IQ3_S (own MTP head + BF16 vision projector) on Dankclaw's
|
||
RTX 3090, port 7771 — the 3090 freed when halogen took the iGPU back for
|
||
frank-large
|
||
- [[ikllama-ornith-dankserver]] — the retired ik_llama.cpp runtime for the old frank-small (q8_0 + Hadamard KV cache, split-mode none; 2026-08-26)
|
||
- [[freetoken-frank-small]] — RETIRED 2026-09-15: the FreeToken/CUDA frank-small runbook, retired with the RTX 3090
|
||
- [[kairic-edge]] — the retired Kairic Edge IU4 experiment (2026-08-22)
|
||
- [[dflash2-large-vulkan]] — the retired DFlash2 Vulkan deployment (2026-08-21)
|
||
- [[Dankserver System Specs]] — the 2x R9700 box hardware (frank-medium)
|
||
- [[Dankclaw System Specs]] — the Strix Halo gfx1151 box (frank-large)
|
||
- [[Dankclaw Improvements]] — host-level changes on the Strix Halo box
|
||
- [[Swap Configuration]] — the 64 GiB `/swap.img` host swapfile (raised from
|
||
8 GiB 2026-09-12): fstab-driven `swap.img.swap` unit, the safe resize
|
||
ordering that drains the old file into fresh swap instead of into a host
|
||
whose `MemAvailable` lies by the size of the model, and the swappiness caveat
|
||
- [[frank-npu]] — the RETIRED FLM NPU endpoint on Dankclaw (2026-09-11):
|
||
Gemma4 E4B vision+audio pack on the XDNA2 NPU, port 7771; kept as the
|
||
retirement record, including the IOMMU/SVA err=-19 root cause and
|
||
where every dependent route moved
|
||
|
||
### Benchmarks and Sizing
|
||
|
||
- [[frank-large-benchmark]] — backend/spec benchmark behind the old head
|
||
- [[ubatch-benchmark-large]] — active-model llama-bench ubatch sweep plan and results
|
||
- [[frank-small-benchmark]] — the small-model benchmark suite
|
||
- [[Running Qwen3.6 35B A3B FP8 on Dankserver]] — Qwen3.6-35B-A3B hardware notes
|
||
- [[Running Qwen3.6 27B FP8 on Dankclaw]] — Qwen3.6-27B sizing on the iGPU
|
||
- [[qwen3.8-strix-optimizations]] — Strix Halo tuning notes
|
||
- [[x4-pair-experiment]] — what a 3090 + Strix Halo combination can and cannot
|
||
do in mainline llama.cpp (measured 2026-09-16): the tensor inventory that
|
||
decides a split, the one flag (`-ot`) that kills per-tensor placement across
|
||
devices, the two-device layer splits that DO work (pure-Vulkan and cross-vendor
|
||
CUDA+Vulkan, +7 % decode at 64k), and the harness-parsing trap that made the
|
||
first round of measurements say otherwise
|
||
|
||
### Memory and Hardware
|
||
|
||
- [[RAM CPU Offloading in VLLM]] — KV cache swap between GPU VRAM and system RAM
|
||
- [[Hybrid CPU GPU Processing Dankserver]] — NVIDIA GPU compute with system RAM offload
|
||
- [[Shared Memory Architecture Dankclaw]] — AMD unified memory and ROCm configuration
|
||
- [[dankserver-vram-growth]] — VRAM/RAM growth behind the retired cuBLAS crash
|
||
- [[Quantization by Hardware Architecture]] — which quant format fits which GPU/CPU
|
||
|
||
### Retired Topology and History
|
||
|
||
- [[Qwen3.8 PP Deployment]] — the retired pipeline-parallel head + worker
|
||
- [[qwen3.8-spec-matrix]] — Qwen3.8-27B spec history (superseded by FastMTP)
|
||
- [[FastFlowLM NPU Inference]] — the retired FastFlowLM NPU endpoint
|
||
- [[DFlash DSpark Speculative Decoding]] — retired DFlash/DSpark drafting
|
||
- [[ling-3.0-flash-trial]] — the Ling-3.0-Flash trial runbook
|
||
- [[ling-3.0-flash-vllm-plan]] — the Ling-3.0-Flash vLLM plan (retired)
|
||
|
||
### vLLM Reference (historical)
|
||
|
||
- [[VLLM Overview]] — installation, CLI, API, architecture, quantization, parallelism
|
||
- [[VLLM Index]] — quick reference with commands, endpoints, and parameter table
|
||
- [[vllm_research_findings]] — research findings from the vLLM era
|
||
|
||
### Pipeline Parallelism (archive)
|
||
|
||
- [[Ethernet Bandwidth Math]] — the bandwidth budget for the PP pair
|
||
- [[Expected Performance]] — expected PP throughput
|
||
- [[llama.cpp RPC]] — the RPC transport between head and worker
|
||
- [[Mixed-Vendor Experiments]] — cross-vendor PP experiments
|
||
- [[Qwen3.6 27B Spec Methods]] — spec-decoding methods for the 27B
|
||
- [[Sample Script Set]] — reference scripts for the PP pair
|
||
- [[vLLM Pipeline Parallelism]] — vLLM's PP implementation
|
||
|
||
## Update Log
|
||
|
||
- [[log]] — chronological record of knowledge-base changes
|
||
|
||
## See Also
|
||
|
||
- [AGENTS.md](../AGENTS.md) — repository rules
|
||
- [serverAppConfigs-docs/LLM/index.md](LLM/index.md) — the LLM fleet knowledge base
|
||
- [dankware Configuration Knowledgebase](~/.pi/agent/docs/index.md) — the "root" level system knowlegebase
|