Skip to content

ignis v0.7.2

Released 2026-10-19. The container image, the archives and the notes as written: the release on GitHub.

  • Flash-Next runs YaRN. Past its trained 262,144 positions, Flash-Next used to extrapolate its linear RoPE table, whatever --model-rope-scaling said. The profiles’ yarn:4 never 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. A none load 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 auto is the default. Each model’s YaRN factor follows its own context: no scaling up to 262,144 tokens, then max_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. none or yarn:F still 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 new server.stream_timeout (streaming) both default to 2400 s, and 0 means 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 header ignis-stopped-by: request_timeout on whole answers;
      • /v1/responses (HTTP and WebSocket) ends incomplete with incomplete_details.reason: "max_output_tokens".

      A tool call cut halfway is dropped. timeout_reply: error keeps the 504 / response.failed.

    • 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 504 request_timeout logged 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-status and Retry-After to a browser on another origin.
  • make: REQUEST_TIMEOUT is empty by default, so make start runs the server’s 2400 s (it passed 1800). A new STREAM_TIMEOUT knob is added, and make config prints both.
  • Outputs change wherever a context above 262,144 tokens is configured. That includes short prompts, because static YaRN scales every position:
    • rtx5090 profile: 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.
    • rtxpro6000 profile: 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: error to keep the old reply. Deadlines are 2400 s, where they were 120 s, and streamed chat completions now have one: set server.stream_timeout: 0 to turn it off.
  • A chat completion the engine drops now answers 500 engine_error, where it answered 504.
  • ADR 0057: rope scaling is auto by 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)
  • #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.
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.

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