docs: OKF v0.1 compliance pass + fact-check + 3 research briefs
- Migrate all 127 non-reserved docs to OKF v0.1 frontmatter (type/description/tags/timestamp); fix 13 YAML issues, 2 duplicate-FM blocks, strip reserved-page FM - Restructure log.md to OKF (## YYYY-MM-DD, newest-first) - Fact-check against scripts/AGENTS.md ground truth: fix 6 false 'Active' banners on retired runbooks, 96->114 GiB GTT, deployment.md vs deploy-plan.py/deploy-remote.sh, Deployment Flow frank-medium=Quadlet, Calibre 9.9.0->9.15.0 + CVE-2025-7404 conflation, Copyparty v1.20.24, RomM 5.3.0 breaking change - Move *arr docs to new FrankBook-Pro/ section (git mv, link-safe) - Write active runbook bodies from ground truth (frank-large, frank-small) - Add 3 research briefs + HTML report: Local TTS and Voice Cloning, AI Job Search and Resume Tools, Most Popular Self-Hosted AI Apps (Jun-Sep 2026) - Add upstream-version rows to ComfyUI/OpenWebUI/Hermes app docs - All 336 tests pass; 136 pages, 0 unresolved wikilinks
This commit is contained in:
1 parent
24f7a7772d
commit
93d1181fee
103 files changed
+2047
-4329
No files matched your search
@@ -1,7 +1,7 @@
|
||||
---
|
||||
type: reference
|
||||
title: stock llama.cpp Qwen3.8-27B UD-Q8_K_XL (DFlash2) on Dankclaw (frank-large)
|
||||
description: The active frank-large runbook — the stock llama.cpp prebuilt (unsloth b11030, ROCm gfx1151) serving unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL (27B dense, UD-Q8_K_XL) with the DFlash2 drafter (z-lab/Qwen3.8-27B-DFlash2-GGUF:Q4_K_M) on the Dankclaw Strix Halo iGPU: the prebuilt runtime, the full-window/one-stream shape, the DFlash2 spec method, fp8 KV, the Qwen-Sharp template, the payload, the client contract, and the failure modes worth knowing.
|
||||
title: "stock llama.cpp Qwen3.8-27B UD-Q8_K_XL (DFlash2) on Dankclaw (frank-large)"
|
||||
description: "The active frank-large runbook — the stock llama.cpp prebuilt (unsloth b11030, ROCm gfx1151) serving unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL (27B dense, 31.46 GiB) with the z-lab DFlash2 Q4_K_M drafter (depth 4) and q8_0 KV on the Dankclaw Strix Halo iGPU: the prebuilt runtime, the full-window/one-stream shape, the DFlash2 spec method, the Qwen-Sharp template, the payload, the client contract, and the failure modes worth knowing."
|
||||
tags:
|
||||
- llm
|
||||
- llama.cpp
|
||||
@@ -13,145 +13,103 @@ tags:
|
||||
- q8
|
||||
- dflash2
|
||||
- rocm
|
||||
- fp8-kv
|
||||
- q8-kv
|
||||
timestamp: 2026-09-21
|
||||
---
|
||||
|
||||
# stock llama.cpp Qwen3.8-27B UD-Q8_K_XL (DFlash2) on Dankclaw (frank-large)
|
||||
# frank-large — stock llama.cpp Qwen3.8-27B UD-Q8_K_XL (DFlash2)
|
||||
|
||||
> **ACTIVE since 2026-09-21.** It replaced the Kairic Edge runtime
|
||||
> (ciru-ai/ROCmFPX, jcbtc/Qwen3.8-27B-IU4-Kairic-Edge — see
|
||||
> [[frank-large-kairic-edge-qwen38-27b]], the current rollback target),
|
||||
> which had replaced the unsloth llama.cpp prebuilt serving
|
||||
> unsloth/Qwen3.8-Flash-Next-GGUF:UD-IQ4_XS (125B MoE — see
|
||||
> [[frank-large-unsloth-qwen38-flash-next]]). Deployed as a **root
|
||||
> systemd unit** (`scripts/frank-large.service`, `User=dank`), port 7770,
|
||||
> on the same gfx1151 iGPU. The RTX 3090 it does not touch belongs to
|
||||
> [[frank-small-gemma4-12b]].
|
||||
> **ACTIVE since 2026-09-21.** Replaces [[frank-large-kairic-edge-qwen38-27b]]
|
||||
> (Kairic Edge IU4 W4A4, now the rollback target) and
|
||||
> [[frank-large-unsloth-qwen38-flash-next]] (the Flash-Next MoE it preceded).
|
||||
> Same port (7770), same alias (`frank-large`), same client contract surface.
|
||||
|
||||
The model is `unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL` — a **27B dense**
|
||||
Qwen3.8 at **UD-Q8_K_XL** (a high-precision 8-bit quant). It is a qwen3_5
|
||||
hybrid: 64 layers total, 16 full attention + 48 Gated DeltaNet linear
|
||||
attention. The payload is two files: the 31.46 GiB main GGUF and the 1.14
|
||||
GiB DFlash2 Q4_K_M drafter.
|
||||
## Identity
|
||||
|
||||
The runtime is the **stock llama.cpp** prebuilt (unsloth b11030, ROCm
|
||||
gfx1151) at `/home/dank/GitPackages/unsloth-llama-b11030/llama-server`.
|
||||
It is a mainline llama.cpp build that supports the qwen3_5 architecture
|
||||
and the DFlash2 drafter (llama_model_qwen35, llama_model_dflash,
|
||||
common_speculative_impl_draft_dflash).
|
||||
|
||||
## Why this swap
|
||||
|
||||
- The operator asked for the 27B model at **one conversation, full
|
||||
context (262,144)** with DFlash2 spec decode (2026-09-21).
|
||||
- The stock llama.cpp prebuilt is the only stock-compatible runtime with
|
||||
qwen3_5 + DFlash2 support — no source build, no CK `config.h`, no
|
||||
PromptForge sidecars, no compatibility mode.
|
||||
- The spec method is DFlash2 (a block-diffusion drafter) at depth 4. The
|
||||
drafter has a sliding window of 2048 (small draft KV, ~40 MiB).
|
||||
- **Endpoint:** `frank-large` at `192.168.0.143:7770` (Dankclaw).
|
||||
- **Runtime:** stock llama.cpp — the unsloth `b11030` prebuilt
|
||||
(`/home/dank/GitPackages/unsloth-llama-b11030/llama-server`), ROCm gfx1151.
|
||||
A mainline build, not a fork: it supports the `qwen3_5` architecture and the
|
||||
DFlash2 drafter (`llama_model_qwen35`, `llama_model_dflash`,
|
||||
`common_speculative_impl_draft_dflash`).
|
||||
- **Service shape:** root systemd unit `scripts/frank-large.service`
|
||||
(`User=dank`), launched by `scripts/serve-frank-large.sh` with tunables from
|
||||
`scripts/frank-large.env`.
|
||||
|
||||
## Shape
|
||||
|
||||
One root unit, one process, one published port:
|
||||
|
||||
| half | port | reachable |
|
||||
|---|---|---|
|
||||
| llama-server (OpenAI front-end + engine, single process) | 7770 | published as host **7770** |
|
||||
|
||||
## Runtime
|
||||
|
||||
- **Prebuilt**: `/home/dank/GitPackages/unsloth-llama-b11030/llama-server`
|
||||
(mainline, ROCm gfx1151 prebuilt, version 0.4.1-dev, build 11030,
|
||||
commit 6ba30d05b). The build bundles its own ROCm runtime — no host SDK
|
||||
gate, no venv.
|
||||
- **GPU target**: `gfx1151` (Strix Halo).
|
||||
- **Spec-draft flags**: `--spec-draft-type-k`, `--spec-draft-type-v`,
|
||||
`--spec-draft-threads`, `--spec-draft-cpu-mask`, `--spec-draft-prio`,
|
||||
`--spec-draft-poll` all present (confirmed via `--help`).
|
||||
- **Model:** `unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL` — a 27B **dense** model,
|
||||
31.46 GiB GGUF (sha256-verified by `scripts/download-frank-large.sh`).
|
||||
- **Context:** one stream, full 262,144 tokens (the model's native window),
|
||||
`PARALLEL_SLOTS=1`.
|
||||
- **Placement:** all layers on the iGPU (`--n-gpu-layers 999`). The 27B dense
|
||||
weights (31.46 GiB) + the DFlash2 drafter (1.14 GiB) + q8_0 KV (~8.6 GiB) +
|
||||
compute buffers fit the iGPU's GTT aperture (~114 GiB).
|
||||
|
||||
## Spec method
|
||||
|
||||
- **DFlash2 depth 4** (`--spec-type draft-dflash --model-draft <drafter>
|
||||
--spec-draft-n-max 4 --spec-draft-n-min 0`): the block-diffusion
|
||||
drafter proposes 4 tokens per step.
|
||||
- **Draft device**: `--spec-draft-device ROCm0` (the drafter runs on the
|
||||
iGPU).
|
||||
- **DFlash2 is a block-diffusion drafter** (not a standalone LM). The
|
||||
drafter has a sliding window of 2048 (~40 MiB of draft KV).
|
||||
DFlash2 (a block-diffusion drafter) at **depth 4**. The drafter is the z-lab
|
||||
`Qwen3.8-27B-DFlash2-Q4_K_M` (1.14 GiB), loaded via `--model-draft` with
|
||||
`--spec-type draft-dflash` and `--spec-draft-device ROCm0`. It has a sliding
|
||||
window of 2048, so its draft KV is small (~40 MiB). Greedy verification
|
||||
(`--temp 0 --top-p 1.0 --top-k 0 --min-p 0.0`) is required.
|
||||
|
||||
## Chat template
|
||||
## KV
|
||||
|
||||
The serve script passes `--chat-template-file` pointing at
|
||||
`dankserver/frank-medium/qwen-sharp-v22.4.0.jinja` (the Qwen-Sharp
|
||||
v22.4.0 template, the same one frank-medium uses). Without this flag the
|
||||
binary falls back to the built-in `peg-native` template, which produces a
|
||||
~73,600-token prompt for a ~250-token request (280x the expected size).
|
||||
With the sharp template wired in, the same request produces a 62–175-token
|
||||
prompt. The `Chat format: peg-native` log line is the format-type label,
|
||||
not the template indicator — the sharp template is active even when that
|
||||
line appears.
|
||||
**q8_0** (`--cache-type-k q8_0 --cache-type-v q8_0`), ~8.6 GiB at 262k. The
|
||||
unsloth b11030 build does **not** support fp8 KV (allowed: f32/f16/bf16/q8_0/
|
||||
q4_0/q4_1/iq4_nl/q5_0/q5_1); q8_0 is the highest-precision 8-bit option.
|
||||
|
||||
## Memory budget
|
||||
## Template
|
||||
|
||||
The iGPU addresses **114 GiB** (the GTT aperture over the shared LPDDR,
|
||||
`gtt_total` in `/sys/class/drm/card1/device/`; `rocm-smi`'s 2 GiB
|
||||
"dedicated" is not the budget). The 27B dense model (31.46 GiB GGUF) is
|
||||
mmap'd in with `-ngl 999`; budget at 262k ≈ 41–43 GiB (weights + drafter
|
||||
+ fp8 KV + buffers), leaving ~71–73 GiB of aperture headroom. The 8 GiB
|
||||
prompt-cache budget (`CACHE_RAM=8192`) is the qualified config. The model
|
||||
is a 27B hybrid (16 full attention + 48 Gated DeltaNet); its DeltaNet
|
||||
state is smaller than a primarily-DeltaNet model, so the fleet's 12.8
|
||||
GiB DeltaNet `CACHE_RAM` floor does not apply.
|
||||
|
||||
**KV budget**: 16 full-attention layers × 2 (K+V) × 4 kv_heads × 256
|
||||
head_dim × 1 byte (fp8) = 32,768 bytes/token. 262,144 tokens × 32,768 ≈
|
||||
8 GiB for attention KV. Plus 48 DeltaNet recurrent states (small).
|
||||
The Qwen-Sharp v22.4.0 template is pinned via `--chat-template-file`
|
||||
(`dankserver/frank-medium/qwen-sharp-v22.4.0.jinja`) with `--jinja` and
|
||||
`--chat-template-kwargs '{"preserve_thinking":true}'`. Without
|
||||
`--chat-template-file` the binary falls back to the built-in `peg-native`
|
||||
template, which produces a ~73,600-token prompt for a ~250-token request.
|
||||
`preserve_thinking` keeps prior thinking blocks across turns for multi-turn
|
||||
agents. The template gates `reasoning_effort` to `{xhigh, medium, low}` — the
|
||||
harness folds its levels onto that set in `models.yml` (`reasoningEffortMap`).
|
||||
|
||||
## Payload
|
||||
|
||||
`scripts/download-frank-large.sh` (resumable, each file verified against
|
||||
its declared byte count + sha256; `--verify-only` re-checks):
|
||||
|
||||
| file | size | sha256 |
|
||||
|---|---|---|
|
||||
| `Qwen3.8-27B-UD-Q8_K_XL.gguf` | 31,457,991,680 | `af36ecb6…` |
|
||||
| `Qwen3.8-27B-DFlash2-Q4_K_M.gguf` | 1,143,006,816 | `1a25c568…` |
|
||||
`scripts/download-frank-large.sh` fetches the main GGUF and the DFlash2
|
||||
drafter, each verified against its declared byte count + sha256
|
||||
(`--verify-only` re-checks). The serve script refuses to start if the binary,
|
||||
the main GGUF, or the drafter is missing.
|
||||
|
||||
## Client contract
|
||||
|
||||
- **Port**: 7770 (the same port and alias the prior deployments served).
|
||||
- **Alias**: `frank-large`.
|
||||
- **Context**: 262,144 (the model's native window), 1 slot.
|
||||
- **KV**: fp8 quantized (`--cache-type-k fp8 --cache-type-v fp8`).
|
||||
- **Sampling**: greedy (`--temp 0 --top-p 1.0 --top-k 0 --min-p 0.0`) —
|
||||
the DFlash2 drafter needs greedy verification.
|
||||
- **Reasoning**: enabled (`--reasoning auto --reasoning-format deepseek
|
||||
--reasoning-budget -1`), extracted to `reasoning_content`.
|
||||
- **Vision**: text-only (the model has a vision projector — mmproj-BF16
|
||||
is available — but this deployment serves text-only, matching the prior
|
||||
frank-large). The fleet's image path is [[frank-small-gemma4-12b]]
|
||||
either way.
|
||||
- **Reasoning effort**: the Qwen3.8 template gates `reasoning_effort` to
|
||||
{xhigh, medium, low} — the harness folds its levels onto that set in
|
||||
`models.yml` (`reasoningEffortMap`).
|
||||
|
||||
## Measured performance
|
||||
|
||||
(To be filled in after deploy.)
|
||||
- **Alias:** `frank-large` (the `id` at `/v1/models`).
|
||||
- **Reasoning:** extracted to `reasoning_content` (`--reasoning auto`,
|
||||
`--reasoning-format deepseek`, unlimited budget).
|
||||
- **Tools:** supported (`--jinja` is pinned).
|
||||
- **Vision:** none — text-only (no mmproj), matching the prior frank-large.
|
||||
- **Sampling:** greedy by default; a client that sends a temperature gets its
|
||||
own, and the harness applies per-model overrides from `models.yml`.
|
||||
|
||||
## Failure modes worth knowing
|
||||
|
||||
- **The model has `mtp_num_hidden_layers: 1`** but this deployment uses
|
||||
DFlash2 (not MTP) for spec decode. The MTP layer is unused.
|
||||
- **The model has vision** (`language_model_only: false`, image_token_id
|
||||
248056, mmproj-BF16 0.93 GB available) but this deployment serves
|
||||
text-only.
|
||||
- **DFlash2 needs greedy verification**: the serve script pins
|
||||
`--temp 0 --top-p 1.0 --top-k 0 --min-p 0.0`. A non-greedy request
|
||||
will not be verified correctly by the drafter.
|
||||
- **Model load is slow (minutes cold).** Health returns 503 while loading; do
|
||||
not kill the process. `deploy.sh` waits up to 20 minutes (`LLM_WAIT`).
|
||||
- **`--ngl` (double-dash) is invalid in b11030** — use `--n-gpu-layers`
|
||||
(the serve script uses the long form).
|
||||
- **The 8-bit UD-Q8_K_XL decodes ~17 t/s** vs the prior 4-bit Kairic Edge IU4
|
||||
at ~22 t/s — the ~23 % larger weight size (31.46 vs 26 GiB) explains the
|
||||
gap; it is not a regression.
|
||||
- **DFlash2 draft acceptance is text-variety-dependent** (0.85 on a trivial
|
||||
one-word answer, 0.519 on a varied explanatory prompt) — do not read a
|
||||
single-request acceptance as the steady state.
|
||||
|
||||
## Rollback
|
||||
|
||||
[[frank-large-kairic-edge-qwen38-27b]] — the Kairic Edge payload and
|
||||
runtime are intact on disk.
|
||||
Payload and runtime for [[frank-large-kairic-edge-qwen38-27b]] (Kairic Edge
|
||||
IU4 W4A4) remain intact on disk. See [[frank-large-unsloth-qwen38-flash-next]]
|
||||
for the Flash-Next predecessor it replaced on 2026-09-21.
|
||||
|
||||
# Citations
|
||||
|
||||
- unsloth prebuilts: https://huggingface.co/unsloth
|
||||
- Model: https://huggingface.co/unsloth/Qwen3.8-27B-GGUF
|
||||
- DFlash2 drafter: https://huggingface.co/z-lab
|
||||
- Serve script: `scripts/serve-frank-large.sh`; tunables: `scripts/frank-large.env`
|
||||
Reference in new issue
Block a user