Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ Each release's page on GitHub has its notes and measurements. See [the 1.0.0 rel

## Unreleased

- Cortheon (`--cortheon`): DuckDuckGo results are kept, and its ads still skipped, when only the spelling differs (either quote style, a `class` attribute in any letter case, an unquoted `href`, spaces around its `=`, or a line break before it); a duplicate whose scheme or host differs only in letter case is dropped while paths and queries keep their case, and the PyPI, npm and crates.io allow-list takes the host in any case with the path exact (#2750). Thanks to @ppardus.
- CUDA EXL3 grouped experts launch and size their storage at the caller's tile and pair count, so decode no longer launches three quarters of its grid empty, and Qwen3.6-35B-A3B EXL3 sizes its grouped storage for 36,864 pair rows instead of 163,904 (about 3 GB less); outputs are bit-equal (#2843, for #2823).

- GLM-5.3-Flash on CUDA: with `--vision` and no video library, rank 0 says at startup how much each stream sets aside for `--vision-video-tokens` rows that no request can fill (128 MiB a stream at the default 16,384), and that `--vision-video-tokens 64` on every rank cuts it to 512 KiB (#2813). Thanks to @Bizuayeu.
- CUDA: dots.mocr's text decoder serves text prompts on a GB10 from the publisher's BF16 weights, on a new shared engine for dense GQA decoders (`zig/src/cuda_dense/`); `--vision`, prompt caching and fp8 caches are refused by name, and served CUDA checkpoints are unchanged (#2673, part of #1927). Thanks to @laudney.

- Cortheon (`--cortheon`): DuckDuckGo results are kept, and its ads still skipped, when only the spelling differs (either quote style, a `class` attribute in any letter case, an unquoted `href`, spaces around its `=`, or a line break before it); a duplicate whose scheme or host differs only in letter case is dropped while paths and queries keep their case, and the PyPI, npm and crates.io allow-list takes the host in any case with the path exact (#2750). Thanks to @ppardus.

- GLM-5.3-Flash on CUDA: with `--vision` and no video library, rank 0 says at startup how much each stream sets aside for `--vision-video-tokens` rows that no request can fill (128 MiB a stream at the default 16,384), and that `--vision-video-tokens 64` on every rank cuts it to 512 KiB (#2813). Thanks to @Bizuayeu.

- CUDA: `Qwen/Qwen3-Embedding-0.6B`, `-4B` and `-8B` load on the native engine from the published BF16 weights and serve `/v1/embeddings` (last-token pooling, unit-normed, `dimensions` crops). On one GB10 the worst cosine distance to float32 is 1.55e-4, 1.34e-4 and 1.08e-4 (transformers' own BF16: 1.88e-4, 1.79e-4 and 1.77e-4), a request's vectors equal each input sent alone, and a reranker folder or a flag the family does not serve is refused by name (#2285). Thanks to @Arminova.
- Qwen3.8-27B on Metal: the startup line says how many streams draft ("for both streams", "for all 4 streams", "for 8 of 16 streams"), the smaller of the stream count and `TF_Q27_DRAFT_SLOTS`, instead of "for one of them"; log text only (#2806).
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ Conversions are explicitly marked: their upstream weights need the linked conver

| Model / format | Download | Machine and memory scope | Native recipe / limits |
| --- | --- | --- | --- |
| dots.mocr, BF16 OCR | Use the local `dots-studio/dots.mocr` checkpoint. | Native HIP; AMD R9700 (`gfx1201`) checked, one GPU. | [Native OCR recipe](docs/recipes/dots-mocr-hip.md); full model-card demo matches HF tokens. No video, MTP head, CUDA, or Metal qualification. |
| dots.mocr, BF16 OCR | Use the local `dots-studio/dots.mocr` checkpoint. | Native HIP; AMD R9700 (`gfx1201`) checked, one GPU. | [Native OCR recipe](docs/recipes/dots-mocr-hip.md); full model-card demo matches HF tokens. Native CUDA serves text prompts only ([CUDA recipe](docs/recipes/dots-mocr-cuda.md)). No video, MTP head, or Metal qualification. |
| Qwen3.5-2B, MLX 4-bit | `tensorfold pull mlx-community/Qwen3.5-2B-MLX-4bit@93760be4f1f69842a46bc13dbdc0f19e291392a3` | One Mac (M5 Max checked), or one GB10; no RAM minimum published. | [2B](docs/recipes/qwen3.5-2b-native.md); [CUDA release checks](CHANGELOG.md#110). Text only. |
| Qwen3.8-27B, MLX 4-bit | `tensorfold pull TensorFold/Qwen3.8-27B-MLX-4bit`<br>`tensorfold pull z-lab/Qwen3.8-27B-DFlash2` | One Mac (M5 Max/M3 Ultra), or one GB10; a 32 GB Mac needs `iogpu.wired_limit_mb` raised (the startup refusal names the value). | [27B](docs/recipes/qwen3.8-27b.md). Add `--drafter z-lab/Qwen3.8-27B-DFlash2`; without it decoding is plain. |
| Nemotron 3.5 Lightning 30B-A3B, MLX 4-bit | `tensorfold pull TensorFold/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-MLX-4bit` | One Mac (M1-M5), or one GB10; also checked on RTX 3090 / RTX PRO 6000. | [Lightning](docs/recipes/nemotron-3.5.md). Includes MTP. |
Expand Down
1 change: 1 addition & 0 deletions docs/recipes/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ For agent-assisted contributions, read the [TensorFold contributor skill](SKILL.
| Family | Recipe |
| --- | --- |
| dots.mocr | [Native HIP OCR, BF16, one GPU](dots-mocr-hip.md) |
| dots.mocr | [Native CUDA text decoder, BF16, one GPU](dots-mocr-cuda.md) |
| Kimi K3 / K3.1 | [Native Metal bring-up, synthetic only, resident budget refusal](kimi-k3-metal.md) |
| Nemotron 3.5 Lightning | [MLX](nemotron-3.5.md), [Intel Arc, experimental](xpu-arc.md) |
| Nemotron 3.5 Parse | [Native HIP OCR, validation and qualification limits](nemotron-parse.md) |
Expand Down
37 changes: 37 additions & 0 deletions docs/recipes/dots-mocr-cuda.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# dots.mocr on native CUDA

The native CUDA engine serves dots.mocr's Qwen2 decoder for text prompts
through the shared dense engine (`zig/src/cuda_dense/`), from the BF16
`dots-studio/dots.mocr` checkpoint at revision
`e539fbb52280393adc081b289ec597430a0f9031`. It is qualified on a GB10
(sm_121) only. Images are not served on CUDA yet: `--vision` is refused
by name. The HIP engine, with the image tower, is in
[dots.mocr on native HIP](dots-mocr-hip.md).

```sh
zig build native -Dnvcc=/usr/local/cuda/bin/nvcc
zig-out/native/bin/tensorfold-native serve MODEL_DIRECTORY \
--context 8192 --parallel 8 --name dots --host 127.0.0.1 --port 8090
```

Replies carry no reasoning block: all text is answer content. The engine
keeps no prompt states, so `--prompt-cache-gib` is refused; so are
`--drafter`, `--slide`, `--kv-cache fp8` and `--prompt-precision int8`.
The engine's own copy drafts and `--no-drafts` give the same tokens.

| Responsibility | Files |
|---|---|
| Lanes, pages, attention, draws, the host's declarations | `zig/src/cuda_dense/` |
| Geometry, weights, one layer's arithmetic | `zig/src/families/dots_mocr/cuda_recipe.zig`, `cuda_weights.zig` |
| q, k and v biases with the rotary in Torch's rounding | `zig/kernels/cuda/dots_rope.cuh` (`tf_dots_qkv_rope`) |

The text reference runs the pinned oracle's `text` mode on any HIP or CUDA
GPU, and `score` classifies every native id by HF's teacher-forced logits
(exact, one BF16 step, or a failure, which exits nonzero):

```sh
python3 tools/zig/dots_mocr_reference.py text MODEL_DIRECTORY REFERENCE \
--prompt-file PROMPT.txt --pci PCI_ADDRESS
python3 tools/zig/dots_mocr_reference.py score MODEL_DIRECTORY REFERENCE \
NATIVE_IDS.json DIFFERENCES.json
```
3 changes: 2 additions & 1 deletion docs/recipes/dots-mocr-hip.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
This implementation serves the BF16 `dots-studio/dots.mocr`
checkpoint at revision `e539fbb52280393adc081b289ec597430a0f9031`.
It runs the image tower and Qwen2 decoder in native Zig/HIP. Python is
used only for the validation reference. CUDA and Metal are not qualified.
used only for the validation reference. CUDA serves the text decoder only
([dots.mocr on native CUDA](dots-mocr-cuda.md)); Metal is not qualified.

Build for the local GPU architecture. The checked host uses `gfx1201`:

Expand Down
Loading
Loading