Skip to content

TensorFold 1.1.3

Choose a tag to compare

@ashhart ashhart released this 23 Oct 21:26
· 901 commits to main since this release

1.1.3 lets Flash Next image chats resume from their cache, keeps rejected tool calls visible, ends the reasoning split at the model's own close token, reads checkpoints whose shards sit in a subfolder, builds on Windows again, and lets servers built from source find their structured-output library.

Images, tool calls and reasoning

  • Flash Next image chats that add another image resume from their cached prompt instead of processing it again: image streams sit in the standard frame, and positioned pooling reads the image's three position axes. Malformed image spans are refused before anything is allocated (#1200).
  • With parallel_tool_calls: false, a call to a tool the request did not offer, or a malformed call, comes back as text in content instead of being dropped, and it does not use up the one allowed call (#1207).
  • The reasoning split ends at the model's own close token, so a </think> that the reply quotes as text no longer ends reasoning_content early (#1180).
  • --vision-image-tokens accepts explicit image budgets up to 262,144 tokens again (#1198). The server checks its JPEG and WebP decoders against the pinned versions, warns at startup and reports the problem in its diagnostics when one is unusable, such as a newer Homebrew jpeg-turbo, and still serves PNG and text (#1199).
  • Nemotron's CUDA vision path encodes each image in a request once (#1104).

Serving and loading

  • A checkpoint index may name shards in a folder inside the model folder, as nvidia/Qwen3.8-Flash-Next-FP4-Local does; .. and absolute names are still refused (#1179, #1187).
  • The tokenizer reads possessive quantifiers in pre-tokenizer patterns, as Ling's pattern uses them (#1132).
  • A halt during a single stream's prompt pass fails that request with its reason (#1133).
  • A speech request that produces no audio gets an empty reply instead of HTTP 500 (#1167).
  • Greedy and top-k sampling no longer sort the whole vocabulary: greedy takes one pass, and a top-k of up to half the row uses a bounded heap that picks the same tokens as the full sort.
  • Tensor parallelism parses the runner's command before it takes any resource, and keeps RDMA verbs load failures in its HCA diagnostics (#1126, #1127).

Builds and platforms

  • The Windows target builds from source again (timespec, sockets and the idle nap) (#1193).
  • -Dnvcc and the tensor-parallel build options are declared for every target, so a macOS build accepts them (#1165).
  • The Engram NFKD table's generator is committed beside the table, and CI checks the table on the pinned Unicode version (#1148).
  • Structured output on servers built from source: zig build grammar installs libtfgrammar beside the native server on every OS (on Linux it went to lib/, where the server does not look), and a server without it says so once at startup, naming the fix. Release archives already ship it in lib/.

Docs

  • What a run past two ranks reports (#1201), the 27B recipe's native CUDA backend and the formats it reads (#1146), a GPU clock cap for GB10s in the runbook (#1110), and the tensor-parallel fabric's RoCE attribution (#1128). New: what --parallel caps, the startup line that reports how many streams the engine took, and /health's live counts of active and waiting requests.

Release testing

1.1.3 against 1.1.2 on the same machines and checkpoints: cold prompts at 2k to 64k, the stream sweep at 1, 2, 4 and 8 streams with every stream checked against its run alone and against "draft": false, resumed chats against fresh ones with thinking on and off, and a 64k needle.

  • Every model gives the same tokens on both releases in every cell, no request failed, and resumed chats equal fresh ones.
  • DGX Spark (GB10), Qwen3.8 Flash Next MLX 4-bit MTP: prefill and decode within 0.6%; image replies equal across releases.
  • DGX Spark, Nemotron 3.5 Super VL NVFP4: image replies equal; speed within 3%.
  • DGX Spark, Qwen3.8-27B with DFlash2: prefill within a few percent; the release archive's binary gives the same tokens as a native build.
  • DGX Spark, Nemotron 3.5 Lightning MLX 4-bit: one known change. Tokens are identical, but its MTP drafts are scheduled differently at two and four streams, and the change repeats across runs: two-stream chat decodes 17% slower (two-stream aggregate 6.5% lower), while four streams are 13% faster. One and eight streams, and prefill at every length, are within 1.2%. We are looking at the draft schedule's window-cost tables for the next release.
  • Mac Studio M3 Ultra (no tensor units), Flash Next, Qwen3.8-27B and Nemotron Lightning: prefill within 0.5%, decode within 1.6%, and every sweep cell within 4.3%, both ways.
  • Known and unchanged from 1.1.2: at a 64k prompt the needle cell gets an empty reply, or a continuation of the document, from Flash Next and Qwen3.8-27B on both releases. Nemotron Lightning answers it.
  • Host tests pass on Linux and macOS, and the archives' binaries report 1.1.3 from an empty directory.

Thanks

@sethforprivacy, @tpischke, @ahinore, @Bizuayeu, @jschmied, @chaog992, @plotarmordev, @jayleaton, @cwschroeder, @BobClawblaw, @cshintov, @akol1 and @flashosophy.