Downloads · 30 days
30
8% of all-time downloads
xunkutech-ai/Qwythos-9B-v2-MLX-bf16-mtp
Qwythos-9B-v2-MLX-bf16-mtp is a image-text-to-text model from xunkutech-ai. Use it for the image-text-to-text task on the model card, and read the license before you ship it in a product. It is set up for mlx. The card lists the license as apache-2.0.
This repository, xunkutech-ai/Qwythos-9B-v2-MLX-bf16-mtp, contains an oMLX-specific bfloat16 conversion of empero-ai/Qwythos-9B-v2 with the model's 15 native Multi-Token Prediction (MTP) tensors embedded under the lan…
Downloads · 30 days
30
8% of all-time downloads
All-time downloads
362
Public
Parameters
9.7B
19.3 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors19.3 GB · 100%
From the Hugging Face model README
This repository, xunkutech-ai/Qwythos-9B-v2-MLX-bf16-mtp, contains an oMLX-specific bfloat16 conversion of empero-ai/Qwythos-9B-v2 with the model's 15 native Multi-Token Prediction (MTP) tensors embedded under the language_model.mtp.* namespace.
The embedded MTP head is intended for oMLX's Lightning MTP runtime path. It can also be retained when this BF16 model is converted to an oQ model by enabling Preserve MTP weights in oMLX.
Compatibility notice: this embedded-MTP variant is supported only by oMLX. Do not use this repository as an ordinary MLX-VLM, MLX-LM, or LM Studio model. Those runtimes do not provide the oMLX embedded-head loading, quantization, and Lightning MTP behavior required by this artifact.
No additional fine-tuning was performed for this repository. The weights were converted from the upstream v2 checkpoint while preserving BF16 precision, the upstream Apache-2.0 license, and the native MTP head.
| Repository | Purpose | MTP layout |
|---|---|---|
| xunkutech-ai/Qwythos-9B-v2-MLX-bf16 | General MLX-VLM target model | MTP omitted |
| xunkutech-ai/Qwythos-9B-v2-MLX-bf16-mtp | oMLX-only model with Lightning MTP and Preserve MTP oQ support | 15 tensors embedded as language_model.mtp.* |
| xunkutech-ai/Qwythos-9B-v2-MLX-bf16-mtp-draft | Standalone drafter for separate-draft runtimes | Drafter-only qwen3_5_mtp namespace |
This model card covers only the second variant. Its examples intentionally use oMLX exclusively.
The model retains the Qwen3.5 visual tower and image/video special tokens. The upstream card primarily reports text reasoning evaluations, so visual performance should be evaluated on the intended workloads.
Qwythos-9B-v2 is an Empero AI reasoning model built on Qwen3.5-9B. The v2 release applies FTPO (Final-Token Preference Optimization) to the earlier Qwythos checkpoint. Instead of broadly modifying the output distribution, FTPO targets token positions that begin repetition loops and trains the model to prefer coherent alternatives.
According to the upstream model card, v2:
The upstream developers describe v2 as a hygiene and robustness release rather than a new capability tier. They also note that the restored MTP head came from the Qwen3.5-9B base and was not co-trained with the FTPO-updated main weights. Lightning MTP acceptance may therefore be workload-dependent.
These results are summarized from the upstream card. They were measured with Empero AI's internal generative chain-of-thought harness and were not independently reproduced by this conversion.
| Benchmark | Upstream Qwythos-9B-v2 result |
|---|---|
| MMLU, chain-of-thought | 83.8% |
| MMLU, 5-shot log-likelihood | 69.6% |
| ARC-Challenge | 96.4% |
| GPQA-Diamond | 49.0% |
| GSM8K | 93.6% |
| HumanEval pass@1 | 77.4% |
| Looping rate, greedy | 0.0% |
| Refusal rate | 0.0% |
See the upstream model card for the complete methodology, training description, comparisons, examples, and limitations.
Install oMLX with Homebrew:
brew tap jundot/omlx https://github.com/jundot/omlx
brew install omlx
Start the managed background server:
omlx start
Or run oMLX in the foreground with an explicit model directory:
omlx serve --model-dir /path/to/models
Place the complete Qwythos-9B-v2-MLX-bf16-mtp directory under the selected oMLX model directory. The server automatically discovers model subdirectories. The default service address is:
http://localhost:8000
The instructions and Preserve MTP behavior in this card were verified against oMLX 0.5.1. Use an oMLX release that exposes both Lightning MTP and Preserve MTP weights.
After oMLX discovers the model:
Use Lightning MTP, which consumes the head embedded in this repository. Do not configure the separate VLM MTP external-drafter mode for this embedded variant.
If the Lightning MTP toggle is unavailable, verify that:
The built-in oMLX chat interface is available at:
http://localhost:8000/admin/chat
Select the model ID shown by oMLX and start a text or multimodal conversation. The embedded MTP head is used when Lightning MTP is enabled in the model settings.
After the oMLX server has discovered the model and Lightning MTP has been enabled, call oMLX's OpenAI-compatible endpoint:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
--data '{
"model": "Qwythos-9B-v2-MLX-bf16-mtp",
"messages": [
{
"role": "user",
"content": "Explain speculative decoding with a native MTP head."
}
],
"temperature": 0.6,
"top_p": 0.95,
"max_tokens": 2048
}'
Use the exact model ID displayed in the oMLX Models page if it differs from the directory name.
The upstream model is designed to reason before answering. A starting point is:
{
"temperature": 0.6,
"top_p": 0.95,
"top_k": 20,
"repetition_penalty": 1.05,
"max_tokens": 16384
}
The upstream v2 card reports that repetition penalty is optional rather than load-bearing because the looping behavior was trained out. Use a smaller generation budget for ordinary prompts and a larger budget for difficult reasoning, coding, tool-use, or long-context tasks.
This BF16 embedded-MTP model is a valid source model for oMLX oQ quantization. To retain native Lightning MTP after quantization, the Preserve MTP weights option must be enabled explicitly.
oMLX 0.5.1 accepts the following oQ levels:
oQ2, oQ2.5, oQ2.7, oQ3, oQ3.5, oQ4, oQ5, oQ6, oQ8
For example, selecting oQ6 with Preserve MTP enabled produces an output name ending in:
-oQ6-mtp
The final name is assigned by oMLX after removing previous precision or quantization suffixes from the source directory name.
With Preserve MTP weights enabled, oMLX:
In this context, “Preserve MTP weights” means preserving a complete, loadable, self-consistent MTP head. It does not mean that every eligible matrix inside the MTP decoder necessarily remains BF16.
Preserve MTP is disabled by default. If it remains off, oMLX:
An oQ model created without Preserve MTP cannot regain the original MTP head by changing config.json alone. Re-run quantization from this BF16 source with the option enabled.
The oMLX dashboard submits the following fields to its authenticated POST /admin/api/oq/start endpoint. This example is provided for users who already automate the oMLX Admin API:
{
"model_path": "/path/to/Qwythos-9B-v2-MLX-bf16-mtp",
"oq_level": 6,
"group_size": 64,
"sensitivity_model_path": "",
"text_only": false,
"dtype": "bfloat16",
"preserve_mtp": true
}
The Admin API requires an authenticated oMLX admin session. For normal use, the oMLX dashboard is the recommended interface.
This rebuilt BF16 source already contains the corrected Qwen3.5 vision patch-embedding layout:
vision_tower.patch_embed.proj.weight
[1152, 2, 16, 16, 3]
The old channels-first layout caused model loading and sensitivity measurement to fail before quantization. The current artifact was independently verified against the source transpose and is the correct source for a new oQ task.
Sensitivity measurement still requires oMLX to load a compatible model or sensitivity proxy. If oQ reports that sensitivity measurement produced no scores, inspect the earlier log lines for the actual model-load or calibration failure rather than treating that final message as the root cause.
In the oMLX Models page, verify all of the following:
Measure target-only and Lightning MTP throughput with the same prompt, sampling parameters, output-token count, and concurrency. The upstream card warns that the restored MTP head was not co-trained with the FTPO update, so acceptance and speedup can vary.
The source checkpoint was converted with a streaming, GPU-independent safetensors converter. Unchanged BF16 tensors were copied without a full-model BF16-to-FP32 round trip. Only framework-required tensor transformations were applied.
The upstream config stores partial_rotary_factor at the text_config top level, while the relevant MLX Qwen3.5 paths consume it from rope_parameters. The converted config stores:
{
"text_config": {
"rope_parameters": {
"rope_type": "yarn",
"factor": 4.0,
"original_max_position_embeddings": 262144,
"mrope_section": [11, 11, 10],
"rope_theta": 10000000,
"partial_rotary_factor": 0.25
}
}
}
The upstream value qwen3_5_vision was normalized to qwen3_5 for compatibility with MLX backends that use a narrower vision model-type whitelist.
The visual patch projection was changed from Hugging Face channels-first Conv3d layout:
[out, in, depth, height, width] = [1152, 3, 2, 16, 16]
to MLX channels-last kernel layout:
[out, depth, height, width, in] = [1152, 2, 16, 16, 3]
Both the safetensors metadata and the underlying BF16 data were transposed.
The conversion was independently checked:
oMLX's compatibility detector also checks both the MTP config fields and the actual presence of mtp.* tensors. This repository satisfies both conditions.
| File | Size | Description |
|---|---|---|
| config.json | 2.9 KB | MLX-compatible Qwen3.5 config with one MTP layer |
| model-00001-of-00004.safetensors | 5.28 GB | BF16 model shard 1/4 |
| model-00002-of-00004.safetensors | 5.36 GB | BF16 model shard 2/4 |
| model-00003-of-00004.safetensors | 5.34 GB | BF16 model shard 3/4 |
| model-00004-of-00004.safetensors | 3.33 GB | BF16 model shard 4/4, including the embedded MTP head |
| model.safetensors.index.json | 71 KB | Tensor-to-shard index |
| tokenizer.json | 20.0 MB | Qwen3.5 tokenizer |
| tokenizer_config.json | 1.2 KB | Tokenizer metadata |
| chat_template.jinja | 8.0 KB | Upstream chat template |
| preprocessor_config.json | 390 B | Image preprocessing configuration |
| video_preprocessor_config.json | 385 B | Video preprocessing configuration |
| generation_config.json | 163 B | Generation token configuration |
The upstream Qwythos model uses the Qwen3.5 chat template and is intended for tool-augmented and agentic workflows. Use oMLX's OpenAI-compatible API and handle tool execution, argument validation, permissions, and safety policy in the calling application.
This oMLX-specific conversion is released under the same Apache-2.0 license as the upstream model.