Instructions to use ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4") model = AutoModelForMultimodalLM.from_pretrained("ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4
- SGLang
How to use ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4 with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4 with Docker Model Runner:
docker model run hf.co/ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4
Ornith-1.5-35B-A3B-AWQ-INT4
AWQ W4A16 quantization of ornith-ai/Ornith-1.5-35B-A3B,
in compressed-tensors pack-quantized format, produced for SGLang on Intel Arc
Pro B-series.
The multi token prediction head is preserved at BF16 so it remains available for SGLang speculative decoding.
| Size | {{ARTIFACT_SIZE_GIB}} GiB |
| Format | compressed-tensors / pack-quantized |
| Scheme | W4A16 asymmetric, group size 32 |
| Quantized | routed MoE experts only |
| Vision tower | preserved, BF16 |
| MTP head | preserved, BF16 |
| Context | 262,144 tokens (native configuration) |
The MTP head
Ornith-1.5-35B-A3B ships a multi token prediction head, declared in its config
as mtp_num_hidden_layers: 1. On this model the head is not small: it carries
its own full 256-expert mixture of experts, 785 tensors and about 822 M
parameters, 2.3 percent of the whole model.
transformers does not instantiate an MTP module for
Qwen3_5MoeForConditionalGeneration. The subtree is therefore absent from the
model object during quantization, and save_pretrained cannot write what is not
there. The head is dropped, silently, and nothing in the process errors. This is
why a quantization workflow can silently produce an artifact with zero
mtp.* tensors.
Here the head is carried across from the source checkpoint byte for byte into
model-mtp.safetensors. It was never loaded and never quantized, so it is
bit-identical BF16.
Without it, speculative decoding has no weights to load. Nothing errors; the accept length simply pins at 1.00 and the model looks like a weak drafter rather than a broken one.
What is quantized, and what is not
Ornith-1.5-35B-A3B is a fine-grained mixture of experts: 256 experts per
layer, 8 active per token, across 40 layers, with moe_intermediate_size 512.
The routed experts are where the parameters live.
Quantized: the routed experts, and only those. 40 layers x 256 experts x 3 projections = 30,720 modules.
Left at BF16:
| params | share | |
|---|---|---|
linear attention (linear_attn.*, 30 layers) |
1.007 B | 2.81% |
| MTP head | 0.822 B | 2.30% |
embed_tokens |
0.509 B | 1.42% |
lm_head |
0.509 B | 1.42% |
| vision tower (27 blocks) | 0.411 B | 1.15% |
full attention (self_attn.*, 10 layers), shared experts, router gates |
0.336 B | 0.94% |
How much of this is actually 4 bit
| stored at 4 bits | 32.21 B parameters, 90.0 percent of the model |
| kept at BF16 | 3.6 B parameters, 10.0 percent |
Activations are BF16 throughout; only weights are quantized, hence W4A16.
Footprint and throughput are not comparable across quantization formats. A build that packs more of the model into fewer bits will be smaller and will usually decode faster on the same hardware, because decode at batch one is bound by how many bytes move per token. Which model is better for your use is answered by measuring quality on your workload, not by comparing file sizes.
Quantization details
- Source:
ornith-ai/Ornith-1.5-35B-A3BBF16, not re-quantized from the FP8 or NVFP4 releases. - Method: AWQ via llm-compressor,
W4A16asymmetric, group size 32, MSE observer, int8 zero points,pack-quantized. - Calibration: 512 sequences of 1024 tokens, 60 percent code instructions
from
codeparrot/self-instruct-starcoderand 40 percent general instructions fromHuggingFaceH4/ultrachat_200k, chat-template formatted. - Pipeline: sequential, one decoder layer at a time
(
sequential_targets=["Qwen3_5MoeDecoderLayer"]), so each layer is calibrated against the quantized output of the layers before it.
Group size 32 rather than 128, and this is the opposite choice from a dense
model. A group is a run of weights along the input dimension sharing one scale
and one zero point, so what matters is how many groups each row gets. These
experts are narrow: moe_intermediate_size is 512, so at group 128 an expert's
down_proj would carry four scales for the entire row and a single outlier
would set the quantization step for 128 weights. A dense model's input
dimensions are 8x to 34x larger and never hit this. Group 32 costs about 11
percent more bytes read per token and buys back the resolution.
Calibration size matters more here than for a dense model. With 256 experts and top-8 routing, each expert observes roughly one thirty-second of the calibration tokens, so the sample count sets how well the tail experts are seen, not merely how stable the scales are.
Quality
This release passed a deterministic coherence gate, not a benchmark, while served through SGLang on four Intel Arc Pro B70 GPUs. The gate verifies that:
reasoning_contentis non-empty and the separate final answer is correct on multi-step arithmetic and syllogistic reasoning;- factual and Python coding responses are coherent and contain their required result;
- a basic image input is accepted and its dominant color is identified;
- output is printable and does not collapse into repetitive text.
The full prompts, reasoning, final responses, token usage, and pass flags ship
in coherence-results.json. This is a release smoke
test; it does not estimate benchmark accuracy or claim parity with BF16.
Usage
SGLang on Intel Arc
docker run --rm -d --name ornith15 \
--device=/dev/dri -v /dev/dri:/dev/dri \
--group-add video --group-add "$(getent group render | cut -d: -f3)" \
--cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
--ipc=host --shm-size=64g --ulimit memlock=-1 \
-p 30000:30000 -v /path/to/Ornith-1.5-35B-A3B-AWQ-INT4:/model:ro \
-e ONEAPI_DEVICE_SELECTOR=level_zero:gpu \
rahulunair/sglang-xpu:latest \
python -m sglang.launch_server --model-path /model \
--device xpu --tp-size 4 --moe-runner-backend triton \
--host 0.0.0.0 --port 30000 \
--trust-remote-code --attention-backend intel_xpu --page-size 64 \
--context-length 40960 --max-total-tokens 40960 \
--max-mamba-cache-size 64 \
--chunked-prefill-size 4096 --mem-fraction-static 0.85 \
--reasoning-parser qwen3-thinking \
--cuda-graph-config '{"decode":{"backend":"full","bs":[1,2,4,8]},"prefill":{"backend":"disabled"}}' \
--skip-server-warmup
SYS_PTRACE and seccomp=unconfined are required. Without them the
symmetric-memory all-reduce declines silently and the slower stock collective
runs, with nothing in the log to say so.
Check that max_total_num_tokens equals context_len in the startup log.
If it is smaller, the Gated DeltaNet state pool has taken the KV cache and long
prompts will fail; --max-mamba-cache-size is what corrects it.
This is a thinking model. Pass --reasoning-parser qwen3-thinking so the trace
is returned in reasoning_content and the answer in content.
Recommended sampling, from the base model card: temperature=0.6, top_p=0.95,
top_k=20 for general use, temperature=1.0 to reproduce its published
benchmark numbers.
Speculative decoding with the MTP head
The head is BF16 and excluded from quantization, so it loads as plain BF16 linears. It is off unless asked for and costs nothing while off.
Support for an MTP head on this architecture depends on your SGLang build registering an MoE MTP model class. Confirm before relying on it.
Limitations
- Quality is not benchmarked. The release coherence gate verifies normal reasoning, answer, code, factual, and basic image behavior only.
- Vision is lightly exercised. The vision tower is unquantized and the release gate includes one synthetic color image, but no multimodal benchmark was run.
- The AWQ smoothing scale for each layer's expert input is shared between the routed experts and the shared expert, and the shared expert is not quantized here, so it contributes to the smoothing objective without benefiting from it. This is what upstream llm-compressor does for every Qwen mixture of experts, and what the reference artifact was produced under.
- Treat this as a 4 bit model. Greedy text will diverge from BF16, as it will for any 4 bit build, so it is not a drop in replacement where exact BF16 outputs matter.
License
MIT, inherited from
ornith-ai/Ornith-1.5-35B-A3B.
- Downloads last month
- 2,411
Model tree for ulkaa/Ornith-1.5-35B-A3B-AWQ-INT4
Base model
ornith-ai/Ornith-1.5-35B-A3B