Files
Frank 3a04e34414 docs(radiance): reference the engine's options, plugins and conversion
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.
2026-10-30 15:01:37 -07:00

141 lines
8.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: "reference"
title: "Radiance Engine — the inference server behind frank-archon"
description: "The radiance inference engine: its shape, plugin model, container format, and how the reference pages fit together."
tags:
- llm
- radiance
- reference
timestamp: 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
```mermaid
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. `libr4d` targets RDNA4 (`gfx1200`,
`gfx1201`); `libavx` serves the host backend (AVX-512/AVX2) with no GPU at all; `libref` is 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`'s `rtn`, `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`, plus `rad-chatparse`, `rad-avx-check`, `r4d_selftest` in 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_HANDLE` and only fails if issued. A fusion is a *selection*:
ask for the fused op, emit the chain when `rad_op_resolved` is 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. `libref` implements the
conventional vocabulary in `docs/OPS.md`; device-only ops (most fusions) exist only in `libr4d`.
## 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`/`relayout`
hooks), losslessly, so a kernel library can change layouts without reconverting the model.
- Encodings are data, not an enum: `RadEncoding` names 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-info` is the reader: sections (strings, metadata, directory, planes, encodings, vocab,
profile, data), `--meta`, `--vocab`, `--recipe`, `--plugins`, and `-v` for 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.json` `model_type` without underscores; `rad-convert
--arch ID` overrides it. `rad_arch_quant` supplies the quantisation descriptor (empty for an
unquantised checkpoint).
- **No fallback.** A raw official FP8 checkpoint whose `quantization_config.quant_method` is `fp8`
is not the pair the `qwen4exp_fp8` plugin claims (`(qwen4exp, "")`), so both serve and convert
refuse it until the descriptor is changed with `--set` or a staged `config.json`. The deployment
lesson is on [[frank-archon]]; the mechanism is on [[Radiance Conversion]].
- `RAD_ABI_VERSION` covers 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: `/version`
reports the release, `rad-info --plugins` reports 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.h` at commit `8da043c` (codeberg.org/StillDeadcode/radiance).