frank-medium: swap ROCmFPX llama.cpp runtime for vllm-radiance MXFP4

Rootless Quadlet on dankserver serving
just1moremodel/Qwen3.8-27B-Uncensored-MXFP4-awq (the radiance stack's
designated alternate target; ships its fp8 MTP head, no rewrite step) with
the DFlash2-FP8 drafter at SPEC=7 on the 2x R9700s (TP=2, host network,
:7770, alias frank-medium unchanged).

- dankserver/frank-medium/: quadlet unit, container entrypoint (fork of
  serve-mxfp4.sh's patch block at pinned clone commit 97353293), healthcheck
- dispatcher retires the root llama.cpp unit, re-tags the registry image to
  the localhost alias, installs the quadlet, waits on /health
- planner maps dankserver/frank-medium/* to frank-medium; scripts-era
  mappings removed
- ROCmFPX-era env/serve/unit/download scripts staged in scripts/.AGENTTRASH
  with .rocmfpx suffix; seams updated (frank_medium_quadlet.bats new)
This commit is contained in:
Frank
2026-09-15 20:59:55 -07:00
parent db29c4d227
commit 6b647c1558
13 changed files with 566 additions and 47 deletions
+9 -8
View File
@@ -349,8 +349,16 @@ def services_for_path(path: str, target: str) -> set[str]:
"copyparty": {"copyparty"},
"plex": {"plex"},
"tautulli": {"tautulli"},
"frank-medium": {"frank-medium"},
}
_add(services, *quadlet_services.get(parts[1], set()))
if len(parts) >= 2 and parts[1] == "frank-medium":
# The vllm-radiance runtime since 2026-09-15: the quadlet file
# above, plus the entrypoint and healthcheck it mounts straight
# out of the checkout. Every file in the service dir is runtime
# state.
_add(services, "frank-medium")
return services
return services
if parts[0] == "frankbook-pro":
@@ -368,14 +376,7 @@ def services_for_path(path: str, target: str) -> set[str]:
if parts[0] == "scripts":
name = p.name
if name in {"frank-medium.env", "frank-medium.service", "serve-frank-medium.sh"}:
_add(services, "frank-medium")
elif name == "chat-template.jinja":
# frank-medium reads this template only when its env file points
# at it (the GGUF's embedded template is the default); frank-large
# runs halogen-flash-server, which owns its own chat handling.
_add(services, "frank-medium")
elif name in {"homepage-status.py", "homepage-status.service", "homepage-status.timer"}:
if name in {"homepage-status.py", "homepage-status.service", "homepage-status.timer"}:
_add(services, "homepage")
# Deployment/test/benchmark scripts and other repo tooling do not
# restart a runtime service.
+28 -22
View File
@@ -991,34 +991,40 @@ wait_for_llm_large_ready() {
return 0
}
# deploy_llm_medium — frank-medium replaced frank-small on 2026-09-15 when the
# RTX 3090 left the host for two Radeon AI PRO R9700 cards. The old unit is a
# CUDA-era FreeToken service that can only crash-loop on this hardware, so it
# is retired here (stop, disable, move the installed unit to the trash) before
# its replacement starts. Same failure mode as frank-large's retirement: this
# host's `systemctl disable` has been observed to delete the unit file itself
# (2026-08-26 incident), so both outcomes are tolerated.
retire_root_llm_small() {
local trash="$HOME/.AGENTTRASH/20260915-frank-small-retire/host-units"
run_privileged systemctl stop frank-default-small 2>/dev/null || true
run_privileged systemctl disable frank-default-small 2>/dev/null || true
run_privileged systemctl stop frank-small.service 2>/dev/null || true
run_privileged systemctl disable frank-small.service 2>/dev/null || true
if [[ -e /etc/systemd/system/frank-small.service || -L /etc/systemd/system/frank-small.service ]]; then
# deploy_llm_medium — frank-medium runs as a rootless Quadlet since the
# 2026-09-15 runtime swap to the vllm-radiance MXFP4 stack. It began the day
# as a root llama.cpp unit (the ROCmFPX/Q8_0_ROCMFPX_AGENT deployment from
# the morning GPU swap); that root unit is retired here first — stop,
# disable, move the installed unit into the home trash. Same failure mode as
# frank-large's retirement: this host's `systemctl disable` has been
# observed to delete the unit file itself (2026-08-26 incident), so both
# outcomes are tolerated.
retire_root_llm_medium() {
local trash="$HOME/.AGENTTRASH/20260915-rocmfpx-retire/host-units"
run_privileged systemctl stop frank-medium.service 2>/dev/null || true
run_privileged systemctl disable frank-medium.service 2>/dev/null || true
if [[ -e /etc/systemd/system/frank-medium.service || -L /etc/systemd/system/frank-medium.service ]]; then
mkdir -p "$trash"
run_privileged mv -- /etc/systemd/system/frank-small.service \
"$trash/frank-small.service"
echo "retired root unit frank-small.service -> $trash"
run_privileged mv -- /etc/systemd/system/frank-medium.service \
"$trash/frank-medium.service"
echo "retired root unit frank-medium.service -> $trash"
fi
run_privileged systemctl daemon-reload
}
deploy_llm_medium() {
retire_root_llm_small
relink_unit frank-medium
run_privileged systemctl daemon-reload
run_privileged systemctl enable frank-medium
run_privileged systemctl restart frank-medium
retire_root_llm_medium
# Pull once, then run the localhost/-aliased tag: this host's quadlet
# path cannot resolve registry-prefixed refs from local storage at
# create time (same as frank-large on dankclaw). Pull=never keeps boots
# off the registry.
podman pull docker.io/stilldeadcode/vllm-radiance:0.9.3 >/dev/null 2>&1 || true
podman tag docker.io/stilldeadcode/vllm-radiance:0.9.3 localhost/radiance-vllm:0.9.3
# The compile cache must exist before the quadlet mounts resolve; the
# one-time setup (setup-mxfp4.sh / PREPARE_ONLY) normally creates it.
mkdir -p /home/dank/.radiance-cache-w4a8-093-gdnm-nqft-fp8s-gnq/{vllm,inductor,triton,aiter}
install_quadlet frank-medium dankserver/frank-medium/quadlet frank-medium
systemctl --user restart frank-medium.service
wait_for_health frank-medium http://127.0.0.1:7770/health 1200
}
+7 -4
View File
@@ -179,10 +179,13 @@ for path in "${CHANGED[@]}"; do
scripts/mount-entropy.sh)
add_test tests/mount_entropy.bats
;;
scripts/frank-medium.env|scripts/serve-frank-medium.sh)
add_test tests/llm_units.bats
add_test tests/llm_secrets.bats
add_test tests/scripts_syntax.bats
# frank-medium moved to a rootless quadlet (vllm-radiance MXFP4) on
# 2026-09-15; its unit, entrypoint and healthcheck live in the
# service dir and carry the fleet's GPU and podman posture.
dankserver/frank-medium/*)
add_test tests/frank_medium_quadlet.bats
add_test tests/deployment_scoping.bats
add_test tests/docs_completeness.bats
;;
scripts/*.service)
add_test tests/llm_units.bats