SASS2MLIR findings – ~20% to 100%+ GPU performance [Nvidia] improvements

Checkmydoor1 pts1 comments

GitHub - mbuchel/sass2mlir-bench: this is benchmarking for sass2mlir · GitHub

/" data-turbo-transient="true" />

Skip to content

Type / to search

Sign in<br>Sign upAppearance settings

You signed in with another tab or window. Reload to refresh your session.<br>You signed out in another tab or window. Reload to refresh your session.<br>You switched accounts on another tab or window. Reload to refresh your session.

Dismiss alert

{{ message }}

mbuchel

sass2mlir-bench

Public

Notifications<br>You must be signed in to change notification settings

Fork

Star

master

BranchesTags

Go to file

CodeOpen more actions menu

Folders and files<br>NameNameLast commit message<br>Last commit date<br>Latest commit

History<br>2 Commits<br>2 Commits

passes/example

passes/example

.gitignore

.gitignore

LICENSE

LICENSE

Makefile

Makefile

PASSES.md

PASSES.md

README.md

README.md

bench.sh

bench.sh

bench_vllm.py

bench_vllm.py

setup.sh

setup.sh

speedups.jpg

speedups.jpg

View all files

Repository files navigation

jetson-llm-bench

Stock LLM decode benchmarks for the Jetson AGX Orin (and an x86_64<br>desktop): llama.cpp on GGUF, vLLM on bf16 safetensors. No custom kernels,<br>no interposers — this is the reference harness you quote baselines with.

For the technical explanation of what the passes do and how they get<br>these numbers, see<br>mbuchel.github.io/projects/sass2mlir .

Two hosts, detected from uname -m; everything that differs follows<br>from that:

Jetson AGX Orin<br>Blackwell desktop

arch<br>aarch64, sm_87, 14 SM<br>x86_64, sm_120

engines<br>llama.cpp + vLLM<br>llama.cpp + vLLM

wheels<br>jetson-ai-lab index, pinned<br>PyPI (its x86_64 wheels are CUDA builds)

Override any of it: ARCH=, CUDA_ARCH=, INDEX_URL=, VLLM_SPEC=.

Measured speedups

Stock llama.cpp against the same model under a pass built with this dev<br>flow — Jetson AGX Orin, tg128, stock and pass measured back to back in<br>one session:

Qwen3.5-4B (Q4_K_M): 25.0 → 31.0 tok/s

Nemotron3-Nano-4B (Q4_K_M): 31.2 → 40.5 tok/s

The venv is made by uv — ./setup.sh vllm<br>installs it into ~/.local/bin itself if it is missing (rc files<br>untouched), because its resolver is much faster than pip on eMMC. If uv<br>cannot be installed, it falls back to python3 -m venv + pip — same<br>.venv layout either way. The interpreter stays 3.10 regardless: the<br>jetson-ai-lab wheels are cp310 builds.

./setup.sh # llama-bench + vLLM venv + GGUFs<br>./setup.sh models # just the GGUFs (~5 GB)<br>./setup.sh bf16 # + Qwen bf16 safetensors (~8 GB, for vLLM)<br>./setup.sh check # what is present, what is missing<br>sudo jetson_clocks # before any measurement

MODEL_GGUF=$PWD/models/Qwen3.5-4B-Q4_K_M.gguf ./bench.sh llama<br>MODEL_HF=$PWD/models/Qwen3.5-4B ./bench.sh vllm<br>MODEL_HF=$PWD/models/Qwen3.5-4B ./bench.sh vllm-eager

Model formats: why there are two downloads

llama.cpp reads GGUF and nothing else. It has no safetensors reader,<br>so the llama.cpp side of each model exists only as a GGUF — for<br>Qwen3.5 that is Qwen3.5-4B-Q4_K_M.gguf (~4.8 bpw), and that quantized<br>file is the llama baseline, not an optional extra.

vLLM serves the bf16 safetensors (Qwen/Qwen3.5-4B, ~8 GB), fetched<br>separately by ./setup.sh bf16 because only the vLLM side consumes them.

Consequence for reading numbers: the llama.cpp run is Q4_K_M and the<br>vLLM run is bf16 — the two engines are not precision-matched , and<br>llama.cpp moves ~3x fewer weight bytes per token. Their tok/s are not<br>directly comparable; quote each engine against itself.

Models

repo<br>file<br>used by

Nemotron GGUF<br>nvidia/NVIDIA-Nemotron-3-Nano-4B-GGUF<br>NVIDIA-Nemotron3-Nano-4B-Q4_K_M.gguf<br>llama.cpp

Qwen GGUF<br>unsloth/Qwen3.5-4B-GGUF<br>Qwen3.5-4B-Q4_K_M.gguf<br>llama.cpp

Qwen bf16<br>Qwen/Qwen3.5-4B<br>models/Qwen3.5-4B/ (dir)<br>vLLM

Downloads resume, so a dropped link costs nothing. On x86_64 the Qwen<br>GGUF is skipped by default to keep the download small; QWEN=1 ./setup.sh models fetches it anyway.

Writing a pass

The .deb doubles as the dev package: it installs the headers and static<br>libraries a pass links against, and this repo builds one out of tree, so<br>iterating on the Jetson does not mean rebuilding sass2mlir (which itself<br>always comes from the .deb — nothing here builds it). See<br>PASSES.md .

cp -r passes/example passes/my-pass # then edit<br>make my-pass<br>sass2mlir my-pass some.cubin --passes-dir passes/my-pass

Why --index-url and not --extra-index-url

The jetson-ai-lab index is where the CUDA-enabled aarch64 wheels live —<br>vllm 0.20.0+cu126, torch 2.11.0, triton, flash-attn, all built<br>for JetPack 6 / CUDA 12.6. That is the whole point of pointing at it,<br>and it means torch needs no special case: it arrives as a vLLM<br>dependency from the same index.

--extra-index-url would add PyPI alongside it. PyPI carries generic<br>aarch64 builds under the same names, and pip picks by version, not by<br>which index looked more authoritative — so a higher version number on<br>PyPI wins and you get a wheel with no CUDA. That is not an install<br>error: it is a working import with no GPU, found much later and<br>confusingly. --index-url...

vllm llama gguf qwen3 passes bench

Related Articles