Instructions to use Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp with MLX:
# Make sure mlx-vlm is installed # pip install --upgrade mlx-vlm from mlx_vlm import load, generate from mlx_vlm.prompt_utils import apply_chat_template from mlx_vlm.utils import load_config # Load the model model, processor = load("Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp") config = load_config("Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp") # Prepare input image = ["http://images.cocodataset.org/val2017/000000039769.jpg"] prompt = "Describe this image." # Apply chat template formatted_prompt = apply_chat_template( processor, config, prompt, num_images=1 ) # Generate output output = generate(model, processor, formatted_prompt, image) print(output) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Pi
How to use Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp"
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp" } ] } } }Run Pi
# Start Pi in your project directory: pi
- OpenClaw new
How to use Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp"
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp" \ --custom-provider-id mlx-lm \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
- Hermes Agent
How to use Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp with Hermes Agent:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp"
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp
Run Hermes
hermes
- Atomic Chat
Ornith-1.0-35B-MTPLX-Vision (mxfp4 body, int4 MTP head)
A vision-enabled Ornith 1.0 35B model for Apple Silicon via MTPLX native speculative decoding (MTP). The body is the Shiftedx mxfp4 + abliterated build; the MTP head has been re-quantized from its original 5-bit to 4-bit affine (group 64) so the model loads on stock MTPLX without a loader patch.
Why this derivative exists
The Shiftedx mxfp4-vision model has the best MTP acceptance of the
Ornith MTP variants I measured, but its MTP head is prequantized at
5-bit. Stock MTPLX (up to 2.1.0) miscomputes the 5-bit group size in
_infer_prequantized_group_size (integer-floor 32 // 5 = 6 instead of
6.4), infers group_size 60 instead of 64, and nn.quantize rejects
the layer at load:
ValueError: [quantize] The last dimension of the matrix needs to be
divisible by the quantization group size 60 ... shape (2048,4096)
That bug is filed as youssofal/MTPLX#182 with a fix in PR #183. This repo is the model-side workaround: the MTP head is re-quantized to 4-bit affine (group 64), which stock MTPLX loads natively (5-bit packing is the only non-power-of-2 width that triggers the bug; 4-bit does not).
Transform
Per quantized MTP tensor (a weight / scales / biases triple):
- dequantize at 5-bit, group 64 to bf16
- re-quantize at 4-bit, group 64, affine
13 quantized triples transformed, 33 norm / layernorm tensors passed through unchanged. The body (model shards) and vision tower are unchanged from the Shiftedx source.
The 5-bit to 4-bit round-trip costs a small amount of draft-head fidelity: mean abs error ~0.0006 per tensor against the original 5-bit dense, which shows up as a modest acceptance drop at the deepest draft position (see below).
Performance (measured)
The signal that matters for an MTP head is draft acceptance at the chosen bit width: high acceptance at lower bits means the draft head matches the target well without paying for extra precision. Wall-clock tok/s is reported for completeness but varies with hardware state and is not the figure of merit here.
Acceptance at depth 3, by MTP head bit width (same M5 Pro config)
Apple M5 Pro 64 GB, MTPLX 2.1.0 (stock, no patch), mtp_history_policy=committed
(CLI default), --draft-temperature 0, thinking OFF, warm.
| Variant | MTP bits | d3 accept pos1/2/3 | loads on stock MTPLX |
|---|---|---|---|
| This repo (int4 MTP head) | 4 | 0.90 / 0.77 / 0.66 | yes |
| Shiftedx mxfp4-vision (source) | 5 | 0.93 / 0.86 / 0.76 | no (needs MTPLX #183) |
| Jonandrop/Ornith-1.0-35B-MTPLX-Vision | 4 | 0.85 / 0.71 / 0.52 | yes |
| wang-yang/Ornith-1.0-35B-MTPLX (non-vision source) | 4 | 0.23 / 0.04 / 0.00 | yes |
This repo is the highest-acceptance Ornith MTP variant at 4-bit, and the highest-acceptance variant overall that loads on stock MTPLX. At 4-bit it reaches pos3=0.66, close to the 5-bit source's 0.76, while every other 4-bit variant is at 0.52 or collapses. The 5-bit source is marginally higher but costs an extra bit and needs the MTPLX loader fix; this repo gets most of the way there at lower precision with no patch.
The wang-yang source collapse (pos3=0.00) is not a quantization issue: its shipped MTP draft head diverges from its own target body (264 of 1803 body leaf tensors differ from the vision variants; the MTP head is bit-identical across variants). See the comparison repo Jonandrop/Ornith-1.0-35B-MTPLX-Vision README for the weight-diff evidence.
Wall-clock tok/s (this repo, for reference)
| Depth | tok/s (e2e) | speedup vs AR | acceptance pos1/2/3 |
|---|---|---|---|
AR (--no-mtp) |
64.7 | 1.00x | - |
| MTP depth 1 | 73.2 | 1.13x | 0.893 |
| MTP depth 2 | 68.5 | 1.06x | 0.866 / 0.775 |
| MTP depth 3 | 78.4 | 1.21x | 0.899 / 0.768 / 0.661 |
tok/s (e2e) is generated_tokens / total_elapsed, wall-clock including
prefill. Varies run-to-run with thermal/contention state.
Why naive RTN, not AWQ or GPTQ
The 5-bit to 4-bit re-quantization here is plain round-to-nearest (RTN). I tried two techniques that beat RTN for weight quality on standard LLMs (AWQ, arXiv:2306.00978; GPTQ, arXiv:2210.17323). Both collapsed MTP acceptance below RTN when applied to this draft head:
- AWQ (activation-aware per-channel weight scaling): reduced MTP head
weight reconstruction error 13.6% vs RTN across all 10 standard Linears,
but acceptance collapsed to pos3 0.02 (vs RTN 0.66). Cause: AWQ scales
weights by
sper input channel and must inverse-scale activations by1/sat runtime. In a transformer draft head those rescaled activations feed residual streams, RMSNorms, attention softmax, and the (RTN) MoE experts, none of which are re-quantized withW*s, so the rescale leaks and corrupts them. AWQ's rescale is only invisible when every consumer of the rescaled activation uses the scaled weights. - GPTQ (sequential Hessian error compensation, no runtime rescale): acceptance collapsed to pos3 0.00. Cause: a correct GPTQ needs the per-column quantizer to exactly match MLX's group-64 affine grid; a column-wise uniform quantizer misaligns the error compensation and perturbs the final weights. Group-aware GPTQ is more work and the proven margin at 4-bit is only ~0.1 to 0.2 perplexity (not acceptance), so the expected upside is small.
The headline finding from this: weight reconstruction error is not acceptance. A 13.6% weight-error win (AWQ) produced acceptance 30x worse. RTN remains the best stock-loadable 4-bit MTP head here. The 5-bit source (0.76 at pos3) stays marginally ahead but needs the MTPLX loader fix (#182/#183).
Usage
mtplx start --model <path-to-this-model-dir> --port 8092 \
--chat-template-path <path-to-this-model-dir>/chat_template.jinja
OpenAI-compatible endpoint supporting text and image input via
POST /v1/chat/completions. The MTPLX CLI defaults to the
committed history policy this model requires.
Sources
| Component | Source | License |
|---|---|---|
| Base model | deepreinforce-ai/Ornith-1.0-35B | MIT |
| mxfp4 body + 5-bit MTP + abliteration + vision tower | Shiftedx/ornith-1.0-35b-abliterated-mxfp4-vision-mtplx | Apache-2.0 |
| MTP head re-quantization (5-bit to 4-bit) | this repo | Apache-2.0 |
| MTPLX runtime | youssofal/MTPLX | Apache-2.0 |
Released under Apache-2.0, preserving the upstream licenses.
- Downloads last month
- 893
4-bit
Model tree for Jonandrop/Ornith-1.0-35B-MTPLX-Vision-mxfp4-int4-mtp
Base model
ornith-ai/Ornith-1.0-35B