Skip to content

Working with make

The Makefile wraps all of the above (GNU make and a POSIX sh — on Windows, Git for Windows’ usr\bin on PATH). make alone lists every target.

Target What it does
make doctor Toolchain, rust target, artifact, web deps.
make build / make release Build the server (CUDA=1 builds the kernel leaf too) / a clean-slate release build.
make dev Build, then run in the foreground.
make run Run the last build; fails, naming the changed files, if it is stale.
make mock make dev on the CPU mock: no GPU, no kernel leaf, no artifact.
make start / stop / restart / status / logs The background server; it outlives the terminal. Log and pid under .scratch/serve/.
make redeploy Build, and only if it succeeds: stop + start. On Windows the build fails while the server runs, since Windows locks a running exe: stop, build, start instead.
make dev-ui / run-ui Server plus Playground hot reload as one session; Ctrl+C stops both.
make web-dev / web-mock Vite alone, against a running engine or an in-process fake one.
make smoke / canary One /v1/models + a short completion / the canary suite.
make metrics Scrape the metrics listener (on by default; a server started with METRICS=0 has none).
make test / test-all / ci cargo test / plus web typecheck and vitest / what a CI job runs.
make gpu-status / gpu-guard / gpu-profile Who holds the card / refuse when it is held / the explicit GPU test profile.
make watch CUDA=0 Rebuild + restart on every Rust change (cargo-watch).
make clean / distclean This profile’s binary / everything.

Knobs go on the command line (make dev CUDA=0 PROFILE=dev, make dev-ui SPEC=off MAX_CONTEXT=40960) or in an untracked local.mk (local.mk.example). make config prints what is in force.

make MODEL=image serves the image model from F:/ai/models/ignis-image-2.1-turbo/ignis_image_2_1_turbo-v2.ninfer (ARTIFACT names another) as ignis-image-2.1-turbo. It has no context, lanes, prefill chunk, speculation, KV format or vision, so make passes none of those flags; the settings every model shares (BIND, API_KEY, IDLE_UNLOAD, …) apply as before. make config MODEL=image prints the server command.

With CUDA=1 the server starts with the 27B’s context left to the profile (MAX_CONTEXT empty: 917,504 tokens under rtx5090, adapted down to what the card has free, Adaptation) and the server’s auto rope scaling (yarn:3.5 there, the table that stretches the checkpoint’s trained 262,144 positions to the context; MAX_CONTEXT=524288 names a context, yarn:2, that never adapts; the gate legs ran at MAX_CONTEXT=262144 ROPE_SCALING=none) – KV_FORMAT=hq-e8-2b, SPEC=dflash2 with DRAFT_TOKENS=7, PREFILL_CHUNK empty (the server’s: the rtx5090 profile’s 2048), KV_HOST_POOL_BYTES=8G (the 27B’s; Flash-Next’s own arena is FN_KV_HOST_POOL_BYTES=2G, passed on every start so a switch to it gets it too). REQUEST_TIMEOUT and STREAM_TIMEOUT are empty: the server’s 2400 s deadlines (Deadlines). HOST_MARGIN_BYTES sets Flash-Next’s host margin (empty: the server’s 4G). KV_DISK_BYTES and KV_DISK_PATH set KV-disk (make config prints its budget and directory). SPEC=off turns speculation off (SPEC= leaves it to the server, and the rtx5090 profile speculates with dflash2). VISION=1 loads the tower; UNCENSORED=1 loads the uncensored variant in place of the default image, served as qwen3.8-27b-abliterated; ROPE_SCALING=yarn:4 pins the factor (empty is auto, from MAX_CONTEXT; none keeps the trained table); the metrics listener is on (METRICS=0 starts without it); API_KEY= and EXPOSE= set the access flags; IDLE_UNLOAD=<secs> sets idle unload (IDLE_UNLOAD=0 for a measurement); LOOP_GUARD=off turns the reasoning loop guard off (the server’s default rewinds a loop; a measurement passes off, as the A/B and TTFT session scripts do); ARGS='…' passes anything verbatim.

A CUDA run or start first runs a GPU guard (the preflight plus a check for other Ignis GPU work), skippable with GPU_CHECK=0.