Nine pages under LLM/ document the upstream radiance engine at 8da043c: - engine shape, plugin model, RAD2 container, ABI and environment - every serve flag grouped with defaults and the law behind each knob - the HTTP surface, request fields and refusal classes - rad-convert, the recipe language, quantisers, imports, reuse, rad-export, KL scoring - the (arch id, quant) family table and the recipe of record per model - kernel/quantiser plugin authoring, encodings, build and checks - architecture plugin authoring: declare, step, probe, lane and media rules - rad-info/radbench/radtune and the shell harnesses - the container contract, host prerequisites, readiness and restart triage Also completes the dangling Related line on the frank-archon endpoint page.
8.4 KiB
type, title, description, tags, timestamp
| type | title | description | tags | timestamp | |||
|---|---|---|---|---|---|---|---|
| reference | Radiance Engine — the inference server behind frank-archon | The radiance inference engine: its shape, plugin model, container format, and how the reference pages fit together. |
|
2026-10-30 |
Radiance Engine — shape, plugin model, container
Radiance is StillDeadcode's inference server for AMD GPUs, written in C++20 and HIP: language models, plus image, video, speech and music generation and embeddings. One HTTP front end speaks OpenAI's chat, completions, Responses, images, audio and video APIs, Anthropic's Messages API and llama-server's native one. Nothing in the serving path is Python.
The fleet's only radiance endpoint is frank-archon (2× R9700, TP=2, Dankserver). This page
and its siblings own the engine reference; the live deployment shape, its Eras and its measured
laws stay on the endpoint page. The numbers here describe upstream main as read 2026-10-30
(release 1.14.0, plugin ABI 31). The fleet pin is older (1.8.1): a flag below that post-dates the pin
is a boot refusal, never a silent no-op, and the endpoint page records the CLI families that pin
itself retired relative to its own rollback target.
Source: https://codeberg.org/StillDeadcode/radiance at 8da043c. Engine docs live in docs/
(GUIDE.md for serving, TOOLS.md for tools, PLUGIN.md for plugins, ARCHITECTURES.md per
family, OPS.md for the op vocabulary, spec.md for the design).
The four moving parts
graph LR
A[Checkpoint<br/>safetensors / GGUF] -->|rad-convert + recipe| B[.rad container]
B --> C[radiance engine]
C --> D[OpenAI / Anthropic /<br/>llama-server wire APIs]
P1[kernel library .so<br/>libr4d, libavx, libref] --> C
P2[architecture .so<br/>one per arch id × quant descriptor] --> C
P3[quantiser .so<br/>libquant] -->|rad-convert| A
- Engine —
core/: declare phase, placement/memory planner, scheduler, KV manager, sampler, tokeniser, HTTP server, media preprocessing. - Kernel libraries — implement ops for hardware.
libr4dtargets RDNA4 (gfx1200,gfx1201);libavxserves the host backend (AVX-512/AVX2) with no GPU at all;librefis the slow reference implementation every other library is checked against. - Architecture plugins — declare one model family at one weight format: its weights, buffers, KV groups and the ops it issues each step. The engine picks one by an exact (architecture id, quantisation descriptor) pair, with no fallback.
- Quantiser plugins —
libquant'srtn,gptq,awq,autoround,paroquant,m2xfp4,ggml,cast,import; they write a weight's numbers into an encoding's planes. - Tools —
rad-info,rad-convert,rad-export,rad-kbench,rad-tune,rad-schemas,rad-tokcheck, plusrad-chatparse,rad-avx-check,r4d_selftestin the build tree.
Two phases, one static graph
rad_arch_declare runs once per rank and names every weight, buffer, KV group and op, in order.
The core resolves every op against the kernel hierarchy per band, per domain, and completes the
whole plan before a byte of weights is read. rad_arch_step then only issues handles obtained at
declare; it may not allocate and may not synchronise. A model whose declare succeeds is fully known
statically, which is what makes --debug-graph, the buffer liveness plan and rad-convert's
plan-only check possible.
Consequences a plugin author must respect:
- An op that never resolves is
RAD_NULL_HANDLEand only fails if issued. A fusion is a selection: ask for the fused op, emit the chain whenrad_op_resolvedis false. - Declaration order is the buffer planner's liveness. A drafter must be declared after the trunk it runs behind, or trunk and drafter buffers silently share bytes.
- Every op in the graph must have a row in a loaded kernel library.
librefimplements the conventional vocabulary indocs/OPS.md; device-only ops (most fusions) exist only inlibr4d.
The .rad container (RAD2)
A container is one file holding everything the server needs: weights as canonical encoding planes, the tokeniser (and optionally a second vocab), the chat template, metadata, the recipe it was made with, and any draft head. It names no kernel library.
- Planes are kernel-independent: codes, scales, zero points, codebooks — row-major, bit-packed
sub-byte where needed. A kernel rearranges them into its own layout at load (
layout/relayouthooks), losslessly, so a kernel library can change layouts without reconverting the model. - Encodings are data, not an enum:
RadEncodingnames the scheme (plain,affine, or a quantiser's own), the planes by role, the scale grouping, and a transform (fwhtN,perm,givens). That is how one file can hold block-FP8, int4, MXFP4, NVFP4-imported, ParoQuant rotations and llama.cpp grids. rad-infois the reader: sections (strings, metadata, directory, planes, encodings, vocab, profile, data),--meta,--vocab,--recipe,--plugins, and-vfor every tensor with its encoding and what made it.
See Radiance Conversion for producing one and Radiance Tools for inspecting it.
Selection key and version law
- A checkpoint's architecture id is its
config.jsonmodel_typewithout underscores;rad-convert --arch IDoverrides it.rad_arch_quantsupplies the quantisation descriptor (empty for an unquantised checkpoint). - No fallback. A raw official FP8 checkpoint whose
quantization_config.quant_methodisfp8is not the pair theqwen4exp_fp8plugin claims ((qwen4exp, "")), so both serve and convert refuse it until the descriptor is changed with--setor a stagedconfig.json. The deployment lesson is on frank-archon; the mechanism is on Radiance Conversion. RAD_ABI_VERSIONcovers every header a plugin compiles against. A plugin reporting a different number is refused at load, with both numbers printed. It moves on any shape change, not on a new optional export; rebuild when it changes. Release version and ABI are independent:/versionreports the release,rad-info --pluginsreports what loaded.
Environment
| variable | meaning |
|---|---|
RADIANCE_HOME |
plugin search path: :-separated homes, each holding kernels/, architectures/, quantizers/; first wins, same-name files shadow later homes. Compiled-in default is <prefix>/share/radiance |
RADIANCE_KERNELS |
default for --kernels: ordered kernel libraries, first wins; unnamed libraries are not loaded |
RADIANCE_TUNE |
pin a kernel's tuned axes for a measurement (a measurement aid, not a deployment setting) |
RADIANCE_CALIB_DIR |
a serve run records per-layer input Gram matrices here (the GPTQ calibration tap) |
RADIANCE_CALIB_TOKENS |
tokens after which the tap stops and writes (default 65536) |
RADIANCE_LOG, RADIANCE_LOG_STEPS |
log level; per-step token counts |
RADIANCE_DEBUG_RESID |
residual-stream probe per (layer, site) |
RADIANCE_DFLASH_Q_TEMP |
temperature of a DFlash2 coupled walk's candidate softmax |
The full list of debug knobs (RADIANCE_DEBUG_*, RADIANCE_DUMP_*, RADIANCE_OP_ORACLE, …) is in
the source's getenv calls; none is a deployment setting.
Where the pages are
| Page | Owns |
|---|---|
| Radiance Serve Options | every serve flag, grouped, with defaults and the law behind each knob |
| Radiance HTTP API | endpoints, request fields, streaming, tool calls, refusal rules |
| Radiance Conversion | rad-convert, the recipe language, quantisers, imports, reuse, rad-export, KL scoring |
| Radiance Model Families | which plugin claims which model, and the conversion command per family |
| Radiance Plugins | kernel and quantiser plugins: ABI, rows, hooks, encodings, build and checks |
| Radiance Architecture Plugins | declaring a model: weights, buffers, KV groups, ops, step, probe |
| Radiance Tools | rad-info, rad-kbench, rad-tune, rad-schemas, rad-tokcheck, harnesses |
| Radiance Operations | the container contract, host prerequisites, readiness, ledgers, restarts |
| frank-archon | the fleet's live radiance endpoint: shape, Eras, rollback, measured laws |
Sources
README.md,docs/GUIDE.md§1–§4,docs/TOOLS.md,docs/PLUGIN.md,docs/DOCKER.md,docs/ARCHITECTURES.md,docs/OPS.md,spec.md§2–§4,abi/*.h,core/config.cpp,core/rad_core.hat commit8da043c(codeberg.org/StillDeadcode/radiance).