TensorRT Edge-LLM
The Thor served its models with llama.cpp only. NVIDIA’s engine for the Thor is TensorRT Edge-LLM. This chapter is the plan to test it, the design for two engines behind one agent, and the first results.
Status, 2026-10-06: Qwen3.6-35B-A3B in NVFP4 runs on Edge-LLM v0.11.0 as a second model in the Thor Tigress Cub’s picker, next to Nemotron 3 Nano on llama.cpp. The results are in “First results” below. The Nano on Edge-LLM hasn’t been built yet. Facts about Edge-LLM come from NVIDIA’s documentation and release notes; each source is named.
This chapter covers
- why Edge-LLM and not TensorRT-LLM
- what Edge-LLM supports on the Thor, and what is still experimental
- the system design for two engines behind one agent
- the build-and-test pipeline, step by step
- what to measure, and when Edge-LLM would replace llama.cpp
- the open questions and risks
Why Edge-LLM
| Engine | On the Thor | Model format | Serving |
|---|---|---|---|
| llama.cpp (today) | built here from commit 8216c84 for sm_110 | GGUF (Nemotron 3 Nano Q8_0, 33.6 GB) | llama-server, OpenAI-compatible, router mode |
| TensorRT-LLM | not supported on Jetson; NVIDIA’s forum points Thor users to Edge-LLM | TensorRT engines | trtllm-serve |
| TensorRT Edge-LLM | officially supported: JetPack 7.0/7.1 (CUDA 13.0) and 7.2 (CUDA 13.2) | TensorRT engines built on the device | experimental OpenAI-compatible server |
The Thor has TensorRT 10.16.2 and CUDA 13.2 installed (checked with pip and
dpkg). Edge-LLM isn’t installed.
The reason to try it is speed. Generating a token reads every active weight once, so speed follows the bytes read per token (chapter “Model serving”, “Estimate its speed”). NVIDIA publishes the Nano in NVFP4, a 4-bit format the Thor’s Blackwell GPU runs natively. It is 19.3 GB against 33.6 GB for our Q8_0: about 0.61 bytes per parameter, so about 2 GB read per token for 3.2B active. The same formula estimates about 90 tok/s against the 53.5 measured today. That is an estimate from one calibration point, not a measurement.
The one published Thor result: in the MLPerf Inference v6.1 Edge Agentic benchmark, Edge-LLM ran Qwen3.6-27B in NVFP4 at 52.33 output tokens/s, with a median 247 ms to the first token, and finished 6.4 times faster than the llama.cpp reference run (24 min 36 s against 2 h 37 min, 1,007 turns, inputs up to about 23.5K tokens). That is a different model and workload from ours.
What Edge-LLM supports
From the supported-models page and the release notes:
| Item | Status |
|---|---|
| Nemotron 3 Nano 30B-A3B | supported in NVFP4 (nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4, 19.3 GB) since v0.7.0 |
| Nemotron 3.5 Lightning 30B-A3B | supported in NVFP4 (21.6 GB), with MTP and DFlash speculative decoding, since v0.10.0 |
| Nemotron 3 Super 120B-A12B | supported in NVFP4 |
| Mixture-of-experts and Mamba hybrids | supported for the listed models only |
| OpenAI-compatible server | experimental since v0.7.0; in-flight batching, single rank, since v0.11.0 |
| Python wheels for aarch64 | since v0.11.0 (2026-09-29), Python 3.10 to 3.12 |
| Latest release | v0.11.0, 2026-09-29 |
System design
| Part | Before | Now (2026-10-06) |
|---|---|---|
thor-tigress-agent | one model server (--model 127.0.0.1:8079) | --engine MODEL=HOST:PORT per other engine; each request goes to the engine serving the model it names; /v1/models merges the lists, leaving out an engine that doesn’t answer |
| llama.cpp router | :8079, GGUF files in ~/models/gguf/ | unchanged |
| Edge-LLM server | none | :8081, user service thor-edge-llm (thor-tigress-serve edge), capped at 48 GB; checkpoint in ~/models/edge-llm/<model>/, engines in ~/models/edge-llm/cache/ |
thor-tigress-serve | llama.cpp only | EDGE_MODEL names the checkpoint; list shows it with its engine; load and unload start and stop its service |
| memory checks | cover llama.cpp’s models | load checks free memory for either engine |
Design rules:
- Clients don’t change. The web chat, Claude Code and OpenCode keep
sending a model name to
:8080. Which engine serves it is the agent’s business. - One model, one engine at a time. The Nano in Q8_0 on llama.cpp (57.8 GB with 4 × 1M context) and the Nano in NVFP4 on Edge-LLM side by side may not fit. The test runs Edge-LLM with the llama.cpp Nano unloaded, at a quiet hour.
- Engines are built, not downloaded. A TensorRT engine is compiled for the exact GPU that runs it, so every engine is built on the Thor.
The pipeline
The commands follow the Jetson AI Lab tutorial and the Edge-LLM docs. None were run here yet.
1. Tools. NVIDIA’s PyTorch container for export, and the C++ runtime built on the Thor:
docker pull nvcr.io/nvidia/pytorch:26.05-py3
git clone https://github.com/NVIDIA/TensorRT-Edge-LLM.git
cd TensorRT-Edge-LLM && git submodule update --init --recursive
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DTRT_PACKAGE_DIR=/usr \
-DCMAKE_TOOLCHAIN_FILE=cmake/aarch64_linux_toolchain.cmake \
-DEMBEDDED_TARGET=jetson-thor -DCUDA_CTK_VERSION=13.0 -DENABLE_CUTE_DSL=ALL
make -j"$(nproc)"
The tutorial passes -DCUDA_CTK_VERSION=13.0; the Thor has CUDA 13.2.
Whether that matters is the first thing to check.
2. Checkpoint and export. NVIDIA publishes the Nano already in NVFP4, so the quantize step is skipped. The export takes a checkpoint folder:
hf download nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4 --local-dir ~/models/edge-llm/nemotron-3-nano/checkpoint
tensorrt-edgellm-export ~/models/edge-llm/nemotron-3-nano/checkpoint ~/models/edge-llm/nemotron-3-nano/onnx
3. Build the engine on the Thor:
./build/examples/llm/llm_build --onnxDir ~/models/edge-llm/nemotron-3-nano/onnx \
--engineDir ~/models/edge-llm/nemotron-3-nano/engine
4. Serve. The experimental server, on a port of its own:
python -m experimental.server --model <engine or checkpoint> --port 8081
5. Measure. First with the C++ benchmark tool
(./build/examples/llm/llm_bench --engineDir … --mode generation), then
through the server with the same requests sent to llama.cpp.
What to measure
Each with the date, the Edge-LLM version, the precision, the context size and the number of slots, as for every number in this book.
| Measure | How | llama.cpp today |
|---|---|---|
| generation speed, one reply | the Rust prompt from chapter “Model serving”, 600 tokens, thinking off | 53.5 tok/s |
| generation speed, four replies at once | four requests together; tok/s each and in total | to measure |
| time to first token | prompts of 1K and 23.5K tokens | to measure |
| memory | MemAvailable before and after starting the server | 57.8 GB (4 × 1M) |
| longest context that loads | raise until it fails | 1,048,576 per slot × 4 |
| answer quality | spark scores on the same 20 prompts; compile rate of the Rust answers | to measure |
| export and build time | wall clock for steps 2 and 3 | none (GGUF is downloaded as is) |
| disk | ONNX plus engine size | 33.6 GB |
| stability | the server under the chat’s normal use for 24 hours | to measure the same way |
Edge-LLM becomes the default engine for a model only if:
- it generates at least 1.5 times faster on one reply and on four,
- spark scores and compile rates are no worse,
- it fits with at least 8 GB free at the context the chat needs,
- and its server handles thinking and tool calls (below) for 24 hours without a restart.
First results
Measured on 2026-10-06 on the Thor, with Edge-LLM v0.11.0 installed from its
aarch64 wheel into ~/.local/share/edge-llm/venv (no container: Docker needs
sudo there, and the wheel carries the runtime built for
jetson-thor-jp72-cu13-sm110).
Build. tensorrt-edgellm-serve built everything itself from
nvidia/Qwen3.6-35B-A3B-NVFP4 (23.4 GB) on its first start:
| Step | Time |
|---|---|
| language-model engine (40 layers) | 270 s, of which TensorRT 261 s |
| vision engine (the checkpoint is multimodal) | 113 s |
| first start, total, to the first answer | 442 s |
| later starts, engines reused from the cache | 30 s |
The engines take 1.7 GB on disk; the weights stay in the checkpoint. The vision engine built without trouble, unlike issue #233.
Memory. Free memory went from 59 GB to 29 GB while the server started
next to the Nano, with a 32K-token context and one reply at a time
(--max-kv-cache-capacity 32768 --max-input-len 16384 --max-batch-size 1).
It settled at about 35 GB free with both running.
Features the chat needs. With --reasoning-parser auto --tool-call-parser auto, through the agent:
| Feature | Result |
|---|---|
streamed reasoning (reasoning_content) with Think on | yes; first token 0.12 s on the server |
enable_thinking: false | answers without reasoning |
| tool calls (the Web switch) | yes: it called web_search and the agent’s search loop ran |
The same 20 Rust tasks (in jetson-thor/model-serving/compare.py: median, config parsing,
brackets, a ring buffer and so on), one turn each, thinking off, at most 2,048
tokens, first Rust block compiled with rustc --edition 2024 --test:
| Qwen3.6-35B-A3B NVFP4, Edge-LLM | Nemotron 3 Nano Q8_0, llama.cpp | |
|---|---|---|
| speed, median | 78.0 tok/s | 53.3 tok/s |
| compiles | 18 of 20 | 15 of 20 |
| tests pass | 14 of 20 | 14 of 20 |
| answers cut at 2,048 tokens | 0 | 6 |
| spark: all five rules | 30% | 5% |
| spark: no comments in function bodies | 40% | 18% |
spark: no unwrap | 90% | 76% |
| spark: false claims | 0% | 0% |
| words of prose per answer | 0 (code only) | 238 |
Against the bar in “What to measure”: faster, more answers compile, better on the five rules, no false claims; tests passing are equal. So it went into the chat as an option, not as the default. The speed estimate of about 90 tok/s was 15% high.
Not measured yet: four replies at once (the server was built for one), time to first token on long prompts, the longest context it holds, and 24 hours of use.
A clean-code model in the chat
The second use of Edge-LLM: a model picked for writing clean code, offered in the Thor Tigress Cub’s model picker next to the Nano.
Candidates. Models on Edge-LLM’s supported list with an NVFP4 checkpoint published by NVIDIA (sizes from the Hugging Face file listings):
| Model | Kind | Checkpoint | Size | Speed estimate |
|---|---|---|---|---|
| Qwen3.8-27B | dense, 27.3B | nvidia/Qwen3.8-27B-NVFP4 | 21.9 GB | about 8 tok/s by the formula; Edge-LLM ran its predecessor Qwen3.6-27B at 52.33 tok/s output throughput in MLPerf, a batched workload |
| Qwen3.6-35B-A3B | mixture of experts, 34.7B total, 3B active | nvidia/Qwen3.6-35B-A3B-NVFP4 | 23.4 GB | about 90 tok/s by the formula |
Qwen3-Coder-Next, the coding model in chapter “Model serving”, isn’t on Edge-LLM’s list, so it stays a llama.cpp candidate.
How the winner is picked. Clean code is measured, not judged by eye:
| Measure | Tool | Pass mark |
|---|---|---|
| the five Rust rules | spark, on the answers to the same 20 Rust tasks | higher than the Nano’s score on the same tasks |
| compiles | cargo build on each answer, as teacher does | higher than the Nano’s rate |
| tests pass | the tests in each task | higher than the Nano’s rate |
| no false claims | spark’s false-claim check | lower than the Nano’s rate |
| speed | tok/s through the agent, one reply | at least 30 tok/s, to keep the chat usable |
The baseline is the Nano’s numbers on the same tasks, measured the same day. A coding model alone isn’t enough: in the earlier baseline (chapter “The checker: spark”), Qwen2.5-Coder-7B on TensorRT-LLM followed all five rules in 4% of its answers.
In the chat. The winner gets an engine of its own on the Edge-LLM
server and appears in the picker as one more model. The agent sends requests
for it to :8081 and everything else to :8079 (figure 16.1). Memory: the
Nano takes 57.8 GB, so about 50 GB is left with 8 GB kept free. A 22 to 23
GB checkpoint plus its context fits, at a context to be measured.
Steps, each needing a GPU time window on the Thor:
- Build both candidates’ engines (pipeline above).
- Run the 20 Rust tasks through each, and through the Nano.
- Score them with spark,
cargo buildand the tests. - Serve the winner on
:8081, add the agent’s routing, and add it to the picker.
Open questions and risks
| Question | Why it matters | How to find out |
|---|---|---|
Does the experimental server stream reasoning_content and honour chat_template_kwargs.enable_thinking? | the chat’s Think switch and the thinking panel depend on it | send the chat’s own request and read the stream |
| Does it support tool calls? | the Web switch runs a web_search tool loop in the agent | a request with tools |
| How long a context can the engine hold, and at what memory cost? | the Nano is served with 1M tokens per slot | step 5, “longest context” |
| Does the server rebuild everything it serves? | an open issue (NVIDIA/TensorRT-Edge-LLM #233, v0.11.0 on a Thor) reports the server building unneeded parts for about 30 minutes, then failing | build first with llm_build, then point the server at the engine |
| CUDA 13.0 in the build flags, 13.2 on the Thor | a mismatch could fail the build | step 1 |
| Shared GPU | export and build are long GPU jobs on the Thor everyone’s chat runs on | run in a time window the owner sets, with the Nano unloaded |
Sources
- TensorRT Edge-LLM supported models
- TensorRT Edge-LLM support matrix
- TensorRT Edge-LLM releases
- Jetson AI Lab: TensorRT Edge-LLM on Jetson
- NVIDIA blog: Edge-LLM completes the MLPerf Edge Agentic benchmark 6.4× faster on Jetson AGX Thor
- Issue #233: tensorrt-edgellm-serve on Thor
- NVIDIA forum: TensorRT-LLM engines on Jetson Thor