Instructions to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="unsloth/Qwen3.6-35B-A3B-MTP-GGUF") 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 AutoModel model = AutoModel.from_pretrained("unsloth/Qwen3.6-35B-A3B-MTP-GGUF", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M # Run inference directly in the terminal: llama cli -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M # Run inference directly in the terminal: llama cli -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M # Run inference directly in the terminal: ./llama-cli -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M # Run inference directly in the terminal: ./build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
Use Docker
docker model run hf.co/unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
- LM Studio
- Jan
- vLLM
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "unsloth/Qwen3.6-35B-A3B-MTP-GGUF" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "unsloth/Qwen3.6-35B-A3B-MTP-GGUF", "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/unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
- SGLang
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF 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 "unsloth/Qwen3.6-35B-A3B-MTP-GGUF" \ --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": "unsloth/Qwen3.6-35B-A3B-MTP-GGUF", "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 "unsloth/Qwen3.6-35B-A3B-MTP-GGUF" \ --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": "unsloth/Qwen3.6-35B-A3B-MTP-GGUF", "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" } } ] } ] }' - Ollama
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with Ollama:
ollama run hf.co/unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
- Unsloth Desktop
- Pi
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Docker Model Runner
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with Docker Model Runner:
docker model run hf.co/unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
- Lemonade
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
Run and chat with the model
lemonade run user.Qwen3.6-35B-A3B-MTP-GGUF-UD-Q4_K_M
List all available models
lemonade list
- Hermes Agent
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
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 unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use unsloth/Qwen3.6-35B-A3B-MTP-GGUF with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M
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 "unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_M" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
MTP + Vision (mmproj)
I feel someone should say that mmproj vision file CAN be used while you have MTP enabled say on your llama.cpp command line, but what you need to do is pass "speculative.n_max: 0" in the extra_body. For instance, I use it for vision with my Hermes Agent:
auxiliary:
vision:
provider: custom:stack-tech
model: qwen3.6-35b-a3b
base_url: http://brachyura.stack-tech.local:8081/v1
timeout: 600
extra_body:
speculative.n_max: 0
download_timeout: 45
api_key_env: QV_ST_MODEL_API_KEY
This makes it so the model doesn't crash when it's trying to analyze the images but allows other MTP requests to still work just fine.
@Josephur can you explain how that allows other requests to use MTP? You've hard-coded no MTP into the model config for hermes.
Yes, this does work,
The crucial part is that this:
auxiliary:
vision:
extra_body:
speculative.n_max: 0
does not mean βconfigure this model with MTP permanently disabled.β It means, βwhen Hermes makes a request using its vision auxiliary model slot, add speculative.n_max: 0 to that particular HTTP request.β Hermes explicitly treats its main model and auxiliary models such as vision as separate independently configured slots. Its documentation also says auxiliary.<task>.extra_body is attached to that auxiliary request, and the OpenAI SDK turns extra_body entries into top-level JSON fields.
What is actually happening:
Suppose llama-server was started like this conceptually:
llama-server
...
--mmproj mmproj.gguf
--spec-type draft-mtp
--spec-draft-n-max 3
So its server default is MTP enabled, with up to 3 speculative tokens. Current llama.cpp still has draft-mtp as a supported speculative type and --spec-draft-n-max as the corresponding global default.
Then Hermes makes two different kinds of calls.
NORMAL HERMES REQUEST
β
β no speculative override
βΌ
llama-server
server default: n_max = 3
β
βΌ
MTP ON
But when Hermes needs vision:
HERMES VISION AUXILIARY REQUEST
β
β request contains:
β "speculative.n_max": 0
βΌ
llama-server
server default: n_max = 3
request override: n_max = 0
β
βΌ
MTP OFF
for THIS request
Then the next regular request comes in without that override:
NEXT NORMAL REQUEST
β
β no override
βΌ
server default: n_max = 3
β
βΌ
MTP ON
In current llama.cpp, each server request gets a task_params structure, and the speculative decoding configuration is part of those task parameters:
struct task_params {
...
struct common_params_sampling sampling;
struct common_params_speculative speculative;
...
};
Then, while llama-server is processing multiple generating slots, it calculates the draft-token limit separately for each slot:
const int n_draft_max = slot.get_n_draft_max();
if (n_draft_max > 0) {
...
}
So this isn't just some accidental behavior. The server architecture explicitly allows one active request/slot to have a different speculative configuration than another.
The llama.cpp documentation even shows speculative.n_max inside the parameters for individual slots.
So you could theoretically have this happening concurrently:
Slot 0: text agent request
speculative.n_max = 3
MTP ON
Slot 1: vision request
speculative.n_max = 0
MTP OFF
Slot 2: another text request
speculative.n_max = 3
MTP ON
All on the same loaded model/server.
The mmproj is still loaded into llama-server. You are not unloading the MTP head or mmproj.
You're merely telling llama.cpp:
For this generation, don't ask the MTP machinery to produce speculative tokens.
That makes sense as a workaround because multimodal processing inserts image-derived embeddings into the prompt rather than just ordinary text tokens. Current llama.cpp actually recognizes the combination of an mmproj and MTP/speculative model during server setup.
So you get:
Model weights
βββ Qwen text model
βββ MTP tensors/head loaded
βββ mmproj loaded
For text:
text prompt
β
Qwen
β
MTP speculative decoding
β
answer
For vision:
image
β
mmproj
β
image embeddings + text prompt
β
Qwen
β
ordinary autoregressive decoding
β
answer
The MTP components remain sitting in memory, they just aren't invoked for that request.
The reply says:
βYou've hard-coded no MTP into the model config for hermes.β
That would be true if you had done something like this for the overall main model:
model:
provider: custom
...
extra_body:
speculative.n_max: 0
Then every normal Hermes agent request could inherit it.
But you didn't.
You put it here:
auxiliary:
vision:
extra_body:
speculative.n_max: 0
Hermes specifically documents auxiliary jobs as independently configurable model slots, including Vision.
extra_bodythere isn't configuring llama.cpp globally. It's attached only to API requests made through Hermes'auxiliary.visionroute. llama-server itself is still launched with MTP enabled. Vision requests overridespeculative.n_maxto 0 for their individual request, while normal model requests omit the override and inherit the server's nonzero MTP setting.
Interestingly, Hermes did have a bug where some auxiliary.<task>.extra_body values from config.yaml were silently ignored. That bug was filed May 30, 2026 and has since been closed with a fix.
So on an older Hermes checkout, you could write:
auxiliary:
vision:
extra_body:
speculative.n_max: 0
and it might not actually reach llama.cpp.
If you enable llama.cpp's /slots and/or metrics/logging, you can watch the request parameters. Current llama.cpp's /slots output exposes speculative.n_max for each slot, and --metrics exposes speculative-draft statistics.
You should be able to observe the activity.
So yes, your workaround is mechanically sound, and better yet, current llama.cpp's per-task/per-slot implementation backs up why it works.
The really interesting implication is that you don't actually need a second Qwen server just to get stable vision. One Qwen3.6 instance can potentially serve text + MTP and vision without MTP simultaneously, with the request itself selecting whether speculative decoding runs.