Open-weight model
Ornith-1.5-35B-A3B-ROCmFP4-GGUF
by Julian Beltran julianmb/Ornith-1.5-35B-A3B-ROCmFP4-GGUF
Ornith-1.5-35B-A3B-ROCmFP4-GGUF is an open-weight model from Julian Beltran, released under Apache License 2.0. Its published files total 20.0 GB. It draws 19k downloads a month.
ROCmFP4 quantization of Ornith 1.5 35B-A3B for AMD Strix Halo (gfx1151) and RDNA 3.5 GPUs, produced with the Q40ROCMFP4STRIXLEAN preset (97.0% of parameters in ROCmFP4, attention K/V in the dual-scale ROCmFP4 variant, tokenembd at Q5K, all norms at F32, and…
Model Card
By Julian Beltran, published under apache-2.0, revision 9bb33c41d5ab.
ROCmFP4 quantization of Ornith 1.5 35B-A3B for AMD Strix Halo (gfx1151) and RDNA 3.5 GPUs, produced with the Q40ROCMFP4STRIXLEAN preset (97.0% of parameters in ROCmFP4, attention K/V in the dual-scale ROCmFP4 variant, tokenembd at Q5K, all norms at F32, and the nextn MTP ehproj at q80). Both checksums above are the content hashes recorded in this repo's git-LFS pointers, which is what huggingfacehub verifies on download. If SHA256SUMS ever disagrees with the table above, trust the table above and the LFS OID — see the note below. The factual claims on this card are machine-checked against the shipped files by verifycard.py, which runs in CI on every push. It reads the GGUF header over HTTP…
Read Julian Beltran's full model card
Ornith-1.5-35B-A3B ROCmFP4
ROCmFP4 quantization of Ornith 1.5 35B-A3B for AMD Strix Halo (gfx1151) and RDNA 3.5 GPUs, produced with the Q4_0_ROCMFP4_STRIX_LEAN preset (97.0% of parameters in ROCmFP4, attention K/V in the dual-scale ROCmFP4 variant, token_embd at Q5_K, all norms at F32, and the nextn MTP eh_proj at q8_0).
Known issue: output depends on the previous request. With a server reused across requests, this model's output is not reproducible — the same prompt can return different text depending on what ran before it, and can collapse into degenerate repetition (
分割线,mesh mesh mesh,恒 恒 恒).The root cause is most likely #29092 — Gated Delta Net recurrent state not being fully cleared between requests on a reused slot. The weights are fine; this is a runtime state bug, and it is not specific to this quant.
Recommended setting:
--spec-type draft-mtp --spec-mtp-strict-qwen --spec-draft-n-max 2 --spec-draft-p-min 0.6. Counter-intuitively this reduces the problem rather than causing it — see Known Issues for the measurements. An earlier revision of this card told you to disable MTP; that advice was wrong and has been retracted.Revision 2026-08-28: rebuilt from the ornith-ai aug-24 MTP refresh. The retrained MTP head gives ~100 tok/s effective decode on Strix Halo at the settings above. Note: the new MTP head requires this base revision; do not graft it onto older quants.
Quantization Details
| Property | Value |
|---|---|
| Quant format | Q4_0_ROCMFP4_STRIX_LEAN (ROCmFP4) |
| Parameters | 35,505,251,456 (35.51 B) |
| Bits per weight | 4.29 (19,052,438,944 bytes / 35,505,251,456 params) |
| File size | 17.74 GiB (19.05 GB) |
| SHA256 | 0f907917a1bfe4e0ca0d281e5709dcf34b6277063e94fab29491bb5c80fda696 |
| Vision projector | mmproj-Ornith-1.5-35B-BF16.gguf (0.84 GiB) |
| Projector SHA256 | d9ce31026d1cb1f3f8d5152e2e2a014d9d2b302b6c93a7dc07bb0a0487f52837 |
| Max Context | 262,144 tokens (256K) |
| Architecture | qwen35moe, 41 blocks, 1 nextn (MTP) block, d_model 2048, 256 experts |
general.file_type |
106 (ROCmFP4 fork-specific) |
| Source | Ornith-1.5-35B-A3B-GGUF Q8_0 aug-24 MTP refresh (allow-requantize) |
Both checksums above are the content hashes recorded in this repo's git-LFS pointers, which is what huggingface_hub verifies on download. If SHA256SUMS ever disagrees with the table above, trust the table above and the LFS OID — see the note below.
Note 2026-09-27: the
SHA256SUMSfile in this repo was stale, carrying the checksum from an earlier build (b42fb74c…). It has been corrected to match the shipped weights. If you verified againstSHA256SUMSand got a mismatch, your download was fine. The checksum in the table above was always correct.
Verifying this card
The factual claims on this card are machine-checked against the shipped files by verify_card.py, which runs in CI on every push. It reads the GGUF header over HTTP range requests and the repo's LFS OIDs, so it needs neither the weights nor a GPU.
# check the card as published on the Hub
python3 verify_card.py --repo julianmb/Ornith-1.5-35B-A3B-ROCmFP4-GGUF
# check a local card and/or a local copy of the weights
python3 verify_card.py --repo julianmb/Ornith-1.5-35B-A3B-ROCmFP4-GGUF \
--card ./README.md --gguf ./Ornith-1.5-35B-A3B-ROCmFP4.gguf
It verifies: both SHA256s (card vs LFS OID vs SHA256SUMS), both file sizes, the parameter count, the bits-per-weight figure, block_count, and that SHA256SUMS lists only files that exist. Exit code is non-zero on any mismatch, so it fails a build rather than shipping a wrong number.
This exists because the card drifted from the artifact several times — a stale SHA256SUMS, a wrong file size, a wrong size-percentage, and a quant description that did not match the actual tensor types. Please run it before publishing a new revision.
Tensor composition (read from the GGUF metadata)
| ggml type | Role | Parameters | Share |
|---|---|---|---|
| ROCmFP4 (101) | bulk of the transformer, incl. output.weight |
34,439,168,000 | 97.00% |
| ROCmFP4 (100) | attention K/V, dual-scale variant | 526,385,152 | 1.48% |
| Q5_K (13) | token_embd.weight |
508,559,360 | 1.43% |
| F32 (0) | all norms, incl. blk.40.nextn.{enorm,hnorm,shared_head_norm} |
22,750,336 | 0.06% |
| q8_0 (8) | blk.40.nextn.eh_proj.weight |
8,388,608 | 0.02% |
Note for anyone re-deriving these: earlier revisions of this card described the preset as "FP16 embedding/norm preservation". That was inaccurate — the norms are F32 and the token embedding is Q5_K, not FP16. Only the MTP eh_proj is q8_0; the three MTP norm vectors are F32.
Measured Performance (AMD Ryzen AI Max+ 395, Radeon 8060S, Mesa RADV Wave64)
Bare-decode comparison, no speculative decoding on either side:
| Configuration | Size | Decode | Output reproducible? |
|---|---|---|---|
ROCmFP4 + MTP n2 p0.6 strict-qwen (recommended) |
17.74 GiB | ~100 tok/s | 2 variants, semantically identical |
| ROCmFP4 bare decode | 17.74 GiB | 76.9 tok/s | No — ≥7 variants |
Q4_K_M (base repo) |
20.22 GiB | 71.5–71.7 tok/s | not measured |
ROCmFP4 + MTP n4 p0.6 strict-qwen |
17.74 GiB | 105.6 tok/s | No — ≥5 variants |
ROCmFP4 is ~7.3–7.6% faster and 12.3% smaller than the base repo's Q4_K_M (21,713,463,040 bytes vs 19,052,438,944 bytes; equivalently 4.29 vs 4.89 bits per weight).
Note that the fastest row is not the most usable one. The n4 setting is ~5% quicker than n2 but roughly triples the number of distinct outputs. Treat throughput and stability as separate axes here.
The "reproducible?" column was measured by chandlerma on Strix Halo / Vulkan / RADV, on this quant, by issuing the same request repeatedly and counting distinct outputs. Details and caveats in Known Issues.
Corrected 2026-09-27: this line previously said 16.7% smaller, which is not supported by the actual files. The measured figure is 12.3%, cross-checked two ways — raw bytes and bits-per-weight, which agree. The 16.7% figure could not be reproduced against the
Q4_K_Min the base repo under any assumption about whether that file carries an MTP head, since an MTP head adds only ~9 MB at q8_0. Treat the original number as a transcription error.
Draft acceptance rate is not a health signal for speculative decoding: when the drafter and the target are affected by the same state leak, they are blinded in the same way and acceptance stays high while the output varies. Judge MTP settings by output reproducibility, not acceptance.
Serving
HaloFPX (Text + Vision)
halofpx pull downloads and verifies both the ROCmFP4 weights and BF16 vision projector:
halofpx pull ornith-1.5-35b
halofpx serve
halofpx load ornith-1.5-35b
halofpx list reports model-weight and vision-projector readiness separately.
Direct llama-server Vision
llama-server \
-m Ornith-1.5-35B-A3B-ROCmFP4.gguf \
-mm mmproj-Ornith-1.5-35B-BF16.gguf \
-ngl 999 -c 131072 -fa on -np 1 \
--spec-type draft-mtp --spec-mtp-strict-qwen \
--spec-draft-n-max 2 --spec-draft-p-min 0.6
Full 256K Max Context (Strix Halo 128GB UMA):
llama-server \
-m Ornith-1.5-35B-A3B-ROCmFP4.gguf \
-ngl 999 -c 262144 -fa on -np 1 \
--spec-type draft-mtp --spec-mtp-strict-qwen \
--spec-draft-n-max 2 --spec-draft-p-min 0.6
Multi-Slot / Conservative Memory (131K Context):
llama-server \
-m Ornith-1.5-35B-A3B-ROCmFP4.gguf \
-ngl 999 -c 131072 -fa on -np 1 \
--spec-type draft-mtp --spec-mtp-strict-qwen \
--spec-draft-n-max 2 --spec-draft-p-min 0.6
Note on flags: - Keep MTP on, at
n-max 2, with--spec-mtp-strict-qwen. Disabling MTP makes reproducibility worse, not better. An earlier revision of this card said the opposite; see the retraction below. ---spec-mtp-strict-qwenis a fork-local flag. It exists in ROCmFPX (PR #54) and not in upstreamggml-org/llama.cpp. You need a ROCmFP4-capable build regardless, since the ROCmFP4 tensor types do not exist upstream — see Requirements. -ROCmFP4in ROCmFPX is built as a Vulkan backend plugin, off by default. If you enable it, pass-dev ROCmFPXVulkan0(notVulkan0) and setROCMFPX_PLUGIN_PATH. If your build has ROCmFP4 compiled into the normalVulkan0backend instead, use-dev Vulkan0. Check--list-devicesfor what your build exposes. ---mmap/--no-mmapwere removed in favour of--load-mode— see PR #26934. The default--load-mode automemory-maps unless the device reports it cannot. --np 1is deliberate. The known state leak is per reused slot, and concurrent slots make the cross-talk harder to reason about.
Requirements
This quant will not load in stock ggml-org/llama.cpp, LM Studio, or Ollama. The q4_0_rocmfp4 tensor types (ggml ids 100 and 101) do not exist upstream. You need a ROCmFP4-capable build:
- ROCmFPX/ROCmFPX — current, and the source of
--spec-mtp-strict-qwen - charlie12345/rocmfp4-llama (branch
mtp-rocmfp4-strix) — the original ROCmFP4 work
Building the Vulkan path in ROCmFPX:
cmake -B build -DGGML_VULKAN=ON -DROCMFPX_VULKAN_PLUGIN=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build -j --target llama-server
Then export ROCMFPX_PLUGIN_PATH=<build>/bin and select the device listed by --list-devices.
Known Issues
Retraction: an earlier revision of this card gave the wrong advice
Between 2026-09-27 and this revision, this card said "Do not enable --spec-type draft-mtp", pointed users at bare decode, and offered a no-MTP variant as the workaround. That was wrong. It was based on the hypothesis that MTP itself caused the problem. It does not. Disabling MTP makes output reproducibility worse.
I got it wrong because I took a repro from llama.cpp#26425 at face value — in that report, disabling --spec-type made output byte-identical across repeated calls. On this quant on Strix Halo the opposite is observed. The difference is that #26425's clean control was measured on a fresh sequence of requests, whereas the failure here is a per-slot state leak that a short control does not expose.
If you followed the earlier advice, go back to the recommended settings in Serving.
The actual issue: per-slot state leak (#29092)
Symptom. The same prompt returns different text depending on which request ran before it. With enough requests it collapses into degenerate repetition — 分割线, mesh mesh mesh, 恒 恒 恒, jijijijiji, op1 op1 op1.
This is not a quant defect. It has been reported on Q4_K_M and other quants of this architecture too.
Upstream: ggml-org/llama.cpp#29092 — "HIP/ROCm — fused Gated Delta Net op carries recurrent state across requests on a reused server slot (qwen35 / qwen35moe); earlier prompts' text is emitted verbatim in later completions". Recurrent state on a Gated Delta Net layer cannot be partially rolled back the way a KV cache can, so a reused slot does not fully return to a clean state.
There is a related open issue, #26425, whose MTP symptom overlaps. Which of the two is the dominant cause here is not settled.
Measured mitigation (Strix Halo / Vulkan / RADV, this quant)
By chandlerma, counting distinct outputs for a repeated identical request:
| Setting | Distinct outputs | Quality |
|---|---|---|
MTP n-max 4 strict-qwen |
≥5 | worst — visible garbage |
MTP off (-ngl 999) |
≥7 | bad — visible garbage |
MTP off, -ngl 998 |
≥6 | bad |
MTP off, GGML_VK_FORCE_MMVQ=1 |
≥5 | bad |
MTP n-max 2 strict-qwen |
2 | good — semantically identical, no garbage |
MTP is a mitigation here, not the cause. --spec-mtp-strict-qwen performs a bounded recurrent rollback of GDN state during draft verification, which partially suppresses the leak. That is why n-max 2 converges better than either n-max 4 or MTP-off, and it is consistent with the flag's own description of its mechanism.
The 2 remaining variants were semantically equivalent — same answer, slightly different wording. So n-max 2 is stable for practical purposes, not perfectly deterministic.
Caveats: measured on one machine, one prompt, -np 1, and Vulkan rather than HIP. n-max 2 vs n-max 4 was not tested across many prompts, and the -ngl 998 and MMVQ arms were not combined with --spec-mtp-strict-qwen. Treat it as the best available starting point, not a guarantee.
If you need strict reproducibility
- Use
-np 1and restart the server between unrelated sessions. Much of the effect is a reused-slot artefact. - Set
cache_prompt: falsefor the requests you care about. - There is no flag that makes this architecture fully deterministic until #29092 is fixed. Low temperature helps but does not remove the cross-request dependence.
Related open upstream issues
All four are open as of 2026-09-27. These can produce similar-looking symptoms and are worth ruling out if disabling MTP does not resolve it for you:
| Issue | What it is |
|---|---|
| #29092 | The likely root cause here. Fused Gated Delta Net carries recurrent state across requests on a reused slot. Its own reporter bisects with layer count: -ngl 42 leaks, -ngl 41 (layer 0 on CPU, fused GDN disabled) is clean. Worth trying on Vulkan too. |
| #25618 | On Vulkan (repro hardware: Strix Halo iGPU), speculative decoding against a quantized target is not lossless where the same setup matches on bf16. Ngram speculation stays lossless on the same target, which is what localises it to the draft path. -fa off does not help. |
| #27572 | HIP/gfx1151: a device→host copy race on the MTP hidden state drives draft acceptance to exactly 0.00000 under -np N with long prompts, surfacing as empty completions. Correct at -np 1. The same issue also reports --spec-type draft-mtp aborting during draft-context creation on Vulkan (RADV, b10581) with GGML_ASSERT(tensor->data != NULL), and acceptance 0.00000 from the very first request on newer HIP builds. |
| #26432 | ROCm: context + MTP over budget spills into GTT silently, with no load-time warning, collapsing throughput 60%+. Reported on a 20 GB Radeon 7900 XT rather than a UMA Strix Halo box, and currently labelled stale — treat as a pattern to watch, not a confirmed match. Watch mem_info_gtt_used during prefill. |
KV cache types
turbo3 / turbo4 are not valid -ctk/-ctv values on current llama.cpp. The allowed set is f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1, and the default is f16.
If you want to trade memory for speed, -ctk q8_0 -ctv q8_0 is the safe step down — community testing on Qwen3.5 found q8_0 indistinguishable from f16 in both directions, with real degradation only below that. Going to q4_0/q4_1 is a known cause of degraded long-horizon coherence, so avoid it if you are seeing repetition.
The default for both is f16, so passing nothing is fine.
Disabling thinking / reasoning
This is a hybrid reasoning model. Its chat template honours enable_thinking, and llama.cpp exposes it as --reasoning on|off|auto (default auto, which detects from the template). With --reasoning off the template emits a pre-closed empty <think> block, so no thinking tokens are generated.
Two separate flags are easy to confuse:
--reasoning off— controls whether the template starts a thinking block (generation-side).--reasoning-format— controls how thought tags in the response are parsed and returned (none,deepseek,deepseek-legacy; defaultauto). Use--reasoning-format noneif you want any thought text left inline inmessage.content, ordeepseekto get it inmessage.reasoning_content.
--reasoning is a server startup flag and is not settable per request. Note that enable_thinking passed via --chat-template-kwargs is deprecated and ignored on current builds.
If you see raw reasoning-style text in the output despite --reasoning off, that is a different problem from the degeneration above — check that --jinja is on (it is by default on current builds) and that your client is not injecting its own <think> tags.
Identity and Version
- Repository
- julianmb/Ornith-1.5-35B-A3B-ROCmFP4-GGUF
- Publisher
- Julian Beltran
- Task
- Not stated by the source
- Modality
- Other
- Library
- Not stated by the source
- Parameters
- Not stated by the source
- Languages
- moe
- Revision
- 9bb33c41d5abf979347e4d216add729dfca5e909
- First published
- 2026-08-20
- Last updated
- 2026-09-27
Files and Weights
9 files, 20.0 GB in total. The weights are 2 files totalling 20.0 GB in gguf.
Every file
| File | Type | Size | SHA-256 |
|---|---|---|---|
| Ornith-1.5-35B-A3B-ROCmFP4.gguf | Weights | 19.1 GB | 0f907917a1bf |
| mmproj-Ornith-1.5-35B-BF16.gguf | Weights | 902.8 MB | d9ce31026d1c |
| .github/workflows/verify-card.yml | Configuration | 585 B | — |
| verify_card.py | Configuration | 14.5 KB | — |
| NOMPT.md | Documentation | 5.2 KB | — |
| README.md | Documentation | 17.6 KB | — |
| upstream-26425-draft.md | Documentation | 3.8 KB | — |
| SHA256SUMS | Other | 196 B | — |
| .gitattributes | Repository | 1.7 KB | — |
License and Download
- License
- apache-2.0
- Access
- Open weights, no gate
- Download size
- 20.0 GB
Released by Julian Beltran through its official repository on Hugging Face. Read the license.
Built From
- Derived from ornith-ai/Ornith-1.5-35B-A3B-GGUF
- Quantized from ornith-ai/Ornith-1.5-35B-A3B-GGUF
Memory Requirements
| Precision | Weights in memory |
|---|---|
| As published | 20.0 GB |
Weights only, from the published parameter count; the key-value cache and runtime add to this.
Questions About Ornith-1.5-35B-A3B-ROCmFP4-GGUF
Can I use Ornith-1.5-35B-A3B-ROCmFP4-GGUF commercially?
Yes. Ornith-1.5-35B-A3B-ROCmFP4-GGUF is released under Apache License 2.0. The Apache License 2.0 is a permissive open-source license. It permits commercial use, modification and redistribution. It requires keeping the license and copyright notices and any NOTICE file, stating significant changes, and it includes an express patent grant from contributors.