ignis v0.7.2
Released 2026-10-19. The container image, the archives and the notes as written: the release on GitHub.
Changes
Section titled “Changes”- Flash-Next runs YaRN. Past its trained 262,144 positions, Flash-Next used to extrapolate its linear RoPE table, whatever
--model-rope-scalingsaid. The profiles’yarn:4never reached it. It now applies YaRN the way its reference implementations do (HF, vLLM, SGLang): one scaled table for the attention layers, the sparse-attention indexer and the MTP head, with YaRN’s attention factor folded into cos and sin on queries and keys. Anoneload is byte-identical to before. The kernels match a host reference at every position up to 1,048,575, and the indexer selects the same blocks as a host top-k (ADR 0059).- On the RTX 5090 at ~499K prompt tokens, YaRN 2.25 retrieved 5/5 needles placed between 24K and 475K, and 1 of 2 three-hop chains. The unscaled table retrieved 4/5 and the same chain.
- That is one question per cell, so it separates nothing statistically.
- The prefill rate was the same with both tables.
- The references’ choices are recorded in a finding.
--model-rope-scaling autois the default. Each model’s YaRN factor follows its own context: no scaling up to 262,144 tokens, thenmax_context / 262,144(2 at 524,288, 3 at 786,432, 4 at 1,048,576). This is the factor Qwen’s cards give for those lengths.noneoryarn:Fstill overrides it. The load log names the table it runs and the setting it came from (rope_scaling,rope_scaling_setting). A change of the setting reloads the model only when the table changes (ADR 0057)- A deadline on every route, and a partial answer when it passes (ADR 0058):
-
server.request_timeout(non-streaming, was 120 s) and a newserver.stream_timeout(streaming) both default to 2400 s, and0means no deadline. -
Streamed chat completions had no deadline at all and now have one. Image jobs have one too, counted from the job’s turn and never from the queue.
-
With the new
server.timeout_reply: partial(the default), a passed deadline answers what was generated so far:- chat completions end with
finish_reason: "length"and their usage, plus the response headerignis-stopped-by: request_timeouton whole answers; /v1/responses(HTTP and WebSocket) endsincompletewithincomplete_details.reason: "max_output_tokens".
A tool call cut halfway is dropped.
timeout_reply: errorkeeps the 504 /response.failed. - chat completions end with
-
Decisions and image jobs always answer with an error.
-
The lane is freed in every case.
-
- Errors say what actually happened. A chat completion the engine drops is
500 engine_error, where it was a 504request_timeoutlogged as a timeout. Decisions and the image prompt enhancer tell an engine that gave up (engine_gave_up) from a deadline that passed. - CORS now exposes
ignis-stopped-by,ignis-model-statusandRetry-Afterto a browser on another origin. make:REQUEST_TIMEOUTis empty by default, somake startruns the server’s 2400 s (it passed 1800). A newSTREAM_TIMEOUTknob is added, andmake configprints both.
Upgrade notes
Section titled “Upgrade notes”- Outputs change wherever a context above 262,144 tokens is configured. That includes short prompts, because static YaRN scales every position:
rtx5090profile: the 27B (786,432) runs YaRN at 3 instead of 4. Flash-Next (589,824) runs YaRN at 2.25, where it used to run its unscaled table. To keep Flash-Next’s native table for work that never goes past 262,144 tokens, set--model-max-context 262144, or set--model-rope-scaling none.rtxpro6000profile: both models run YaRN at 4. Flash-Next gains it for the first time.
- A request past its deadline now gets a partial answer, not a 504. Set
server.timeout_reply: errorto keep the old reply. Deadlines are 2400 s, where they were 120 s, and streamed chat completions now have one: setserver.stream_timeout: 0to turn it off. - A chat completion the engine drops now answers
500 engine_error, where it answered 504.
Decisions
Section titled “Decisions”- ADR 0057: rope scaling is
autoby default - ADR 0058: the deadline contract per route
- ADR 0059: Flash-Next applies YaRN (attention factor on q and k, FP32 angle, the 27B’s table builder)
- Amended: ADR 0017, the metrics (an image job’s outcome
timed_out)
Work in progress (issues still open)
Section titled “Work in progress (issues still open)”- #327: the anvil-serving qualification; its rerun recipe on this release goes to fakoli/anvil-serving#660
- Flash-Next at 1,048,576 tokens with YaRN 4 and MTP on: a needle and multi-hop run on the RTX PRO 6000 (spec rope-scaling/02)
- #331: a native wide MoE decode route
- #332: user feedback. The request timeout (point 2) is addressed in this release; the cold-prefill rate, the idle-unload default and the CLI-docs consistency (points 1, 3 and 4) are still open.
Container image (linux/amd64)
Section titled “Container image (linux/amd64)”podman run --rm --device nvidia.com/gpu=all -p 8000:8000 \ -v /path/to/models:/models:ro \ -e IGNIS_MODEL_ARTIFACT=/models/<name>.ninfer \ ghcr.io/gpillon/ignis:0.7.2(docker: --gpus all in place of --device.) The image carries
the CUDA runtime but no driver — the host’s NVIDIA driver is
injected by the container runtime. It is built from the same
compile as the Linux tarball below, so the two always carry the
same binaries.
Binaries
Section titled “Binaries”The kernel is compiled for SM120a (RTX 5090 / Blackwell
consumer) only, and the engine needs a .ninfer artifact, which
is not part of this release. The Linux tarball needs the CUDA 13
runtime on the host; the Windows zip carries cudart64_*.dll.
Both need an NVIDIA driver new enough for CUDA 13.
Apache-2.0 (LICENSE, NOTICE); the vendored reference ops keep
their own terms (NOTICE-kernel).
Full Changelog: https://github.com/gpillon/ignis/compare/v0.7.1...v0.7.2
