CoolFace
Modelpublic

patrickbdevaney/Qwen3.5-122B-A10B-NVFP4-vllm-docker-jetson-agx-thor

sourceHugging Faceapache-2.0updated 7mo agoView on Hugging Face
5likes
Model Card

vLLM Docker Image โ€” Qwen3.5-122B-A10B-NVFP4 on Jetson AGX Thor

First confirmed deployment of Qwen3.5-122B-A10B at NVFP4 precision on a single NVIDIA Jetson AGX Thor (128GB unified memory).

This repository hosts the compressed Docker image tarballs needed to run a vLLM inference server for Qwen3.5-122B-A10B on Jetson AGX Thor. For full documentation, reproduction scripts, patches, and the Dockerfile, see the companion GitHub repository:

๐Ÿ“ฆ GitHub (scripts, patches, docs): patrickbdevaney/qwen-3.5-122b-a10b-jetson-thor
๐Ÿค– Base model weights: Qwen/Qwen3.5-122B-A10B

What's in This Repository

This HuggingFace repo contains only the Docker image as compressed tar archives. The image has all required patches pre-applied and is ready to load on a Jetson AGX Thor system.

FileDescription
vllm-thor-qwen35-latest.tar.gz.*Split compressed Docker image tarballs
sha256sums.txtChecksums for verifying image integrity
Model weights are not included. You must supply Qwen3.5-122B-A10B-NVFP4 weights separately. See the GitHub repo for the resharding script (01_reshard_nvfp4.sh).

Hardware Requirements

ComponentSpecification
PlatformNVIDIA Jetson AGX Thor
SoCThor (Blackwell GPU architecture)
Unified Memory128 GB LPDDR5x
GPUIntegrated Blackwell GPU (FP4 native tensor cores)
CPU12-core Arm Cortex-X925
StorageNVMe SSD (model weights on local disk)
OSUbuntu 24.04 (aarch64)
CUDA12.x (Jetson JetPack)
Architectureaarch64
Dockernvidia-container-runtime
โš ๏ธ This image is aarch64 only and requires a Blackwell-architecture GPU for NVFP4 execution. It will not run on x86 or older Jetson platforms.

Observed Performance

MetricValue
Decode throughput18.9 t/s
TTFT (with --enforce-eager)~120s โš ๏ธ do not use this flag
TTFT (without --enforce-eager)~10โ€“20s (estimated after CUDA graph warmup)
VRAM at init (peak)~97 GB
VRAM steady-state~75โ€“80 GB
Max context length16,384 tokens
GPU memory utilization flag0.72
QuantizationNVFP4 / compressed-tensors
Attention backendFlashInfer
Model weights size (resharded)~75 GB

Quick Start

1. Reassemble and load the image

bash
# Reassemble split tarballs
cat vllm-thor-qwen35-latest.tar.gz.* > vllm-thor-qwen35-latest.tar.gz

# Verify integrity
sha256sum -c sha256sums.txt

# Load into Docker
docker load -i vllm-thor-qwen35-latest.tar.gz

2. Prepare model weights

Download and reshard the base BF16 weights to NVFP4 using the script from the GitHub repo:

bash
git clone https://github.com/patrickbdevaney/qwen-3.5-122b-a10b-jetson-thor.git
cd qwen-3.5-122b-a10b-jetson-thor
bash scripts/01_reshard_nvfp4.sh
# Resharded weights output to: ~/Qwen3.5-122B-A10B-NVFP4/resharded/

3. Serve

bash
bash scripts/03_serve.sh

Or manually:

bash
docker run --rm --runtime=nvidia \
  -e VLLM_USE_FLASHINFER_MOE_FP4=0 \
  -e LD_PRELOAD=/usr/lib/aarch64-linux-gnu/nvidia/libcuda.so.1 \
  -e HF_HUB_DISABLE_XET=1 \
  -v ~/Qwen3.5-122B-A10B-NVFP4/resharded:/model \
  -v ~/thor-vllm-cache:/root/.cache/vllm \
  -p 8000:8000 \
  vllm-thor:qwen35-latest \
  python -m vllm.entrypoints.openai.api_server \
    --model /model \
    --quantization compressed-tensors \
    --attention-backend FLASHINFER \
    --gpu-memory-utilization 0.72 \
    --max-model-len 16384 \
    --max-num-seqs 2

Critical Notes

โŒ Do NOT use --enforce-eager

With --enforce-eager, every forward pass goes through Python dispatch with no CUDA graph optimization. For a 94-layer MoE model this causes ~120s TTFT on prompts of ~900 tokens. Remove the flag and allow CUDA graph warmup at startup. The first startup after removing the flag will take 10โ€“20 minutes longer while graphs are captured and cached to ~/thor-vllm-cache.

Required Environment Variables

VariableValuePurpose
VLLM_USE_FLASHINFER_MOE_FP40MoE FP4 FlashInfer kernel broken on Thor
LD_PRELOAD/usr/lib/aarch64-linux-gnu/nvidia/libcuda.so.1Required for CUDA library resolution on Jetson
HF_HUB_DISABLE_XET1Disables experimental HuggingFace XET transfer protocol

GPU Memory Utilization

Values above 0.72 cause OOM during KV cache profiling at model load. Do not increase this value without testing.

--max-num-seqs 2

Higher values increase CUDA graph capture time and VRAM pressure during warmup. Keep at 2 unless you have tested higher values.

CUDA Graph Cache

CUDA graphs are saved to the volume mounted at /root/.cache/vllm. Always mount a persistent host directory here. Without this, graphs are recaptured on every container start (adds 10โ€“20 min per boot).

Benign Startup Warning

You will see this at container start โ€” it is safe to ignore:

ERROR: ld.so: object '/usr/lib/aarch64-linux-gnu/nvidia/libcuda.so.1' from
LD_PRELOAD cannot be preloaded (file too short): ignored.

The CUDA stack loads correctly via other paths.

Import Errors Outside a GPU Container

Running any vLLM import outside of a GPU-enabled container (e.g. for patching or verification) will fail with:

ImportError: /tmp/vllm/vllm/_C.abi3.so: undefined symbol: cuPointerGetAttribute

This is expected. Verify patches using grep, not Python imports.


What's Pre-Applied in This Image

The image is built from a pinned vLLM source commit with two required fixes applied. Neither fix is present in the upstream vLLM version baked into the base Jetson container at the time of this build.

Patch 1 โ€” RMSNormGated activation parameter

Adds a missing activation parameter to RMSNormGated.__init__ in vllm/model_executor/layers/layernorm.py. Without this, model load fails with:

AttributeError: 'RMSNormGated' object has no attribute 'activation'

Root cause: RMSNormGated.forward() references self.activation at line 595, but the __init__ method never accepted or stored this parameter. The upstream vLLM code assumed it was already set but the version baked into the Jetson container was missing it.

The fix โ€” two additions to __init__:

python
# Added to signature (after norm_before_gate):
activation: str = "silu",

# Added to body (after self.norm_before_gate = norm_before_gate):
self.activation = activation

Full patched __init__ signature:

python
def __init__(
    self,
    hidden_size: int,
    eps: float = 1e-6,
    group_size: Optional[int] = None,
    norm_before_gate: bool = False,
    activation: str = "silu",          # โ† ADDED
    device: torch.device | None = None,
    dtype: torch.dtype | None = None,
):

Patch 2 โ€” FlashInfer MoE FP4 kernel disable

Not a code patch โ€” applied via environment variable (VLLM_USE_FLASHINFER_MOE_FP4=0). The FlashInfer MoE FP4 kernel is broken on Jetson Thor at this vLLM version. Setting this variable falls back to the standard MoE kernel. FlashInfer attention (non-MoE) works correctly and is kept enabled via --attention-backend FLASHINFER.

Verify patches are present in the loaded image

bash
docker run --rm vllm-thor:qwen35-latest \
  grep -n "self.activation\|activation: str" \
  /tmp/vllm/vllm/model_executor/layers/layernorm.py
# Expected output:
# 511:        activation: str = "silu",
# 536:        self.activation = activation
# 597:            activation=self.activation,

Full patch files are available in the GitHub repo under reproduce/patches/.


Software Stack

ComponentVersion / Detail
vLLMBuilt from source โ€” pinned commit (see GitHub)
Python3.12.12 (cpython-3.12.12-linux-aarch64)
PyTorchCompatible with Jetson Thor JetPack CUDA stack
Docker runtimenvidia container runtime
Base Docker imageNVIDIA Jetson vLLM container (aarch64)
Quantization formatcompressed-tensors (NVFP4)
Attention kernelFlashInfer (MoE FP4 kernel disabled)

Repository Structure (GitHub)

QWEN-3.5-122B-A10B-JETSON-.../
โ”œโ”€โ”€ README.MD
โ”œโ”€โ”€ DOCKERFILE
โ”œโ”€โ”€ docker-compose.yml
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ layernorm_rmsnormgated_activation.patch
โ”œโ”€โ”€ chat/
โ”‚   โ”œโ”€โ”€ templates/
โ”‚   โ”‚   โ””โ”€โ”€ chat.html
โ”‚   โ”œโ”€โ”€ main.py
โ”‚   โ””โ”€โ”€ requirements.txt
โ””โ”€โ”€ scripts/
    โ”œโ”€โ”€ 01_reshard_nvfp4.sh
    โ”œโ”€โ”€ 02_build_docker.sh
    โ”œโ”€โ”€ 03_serve.sh
    โ”œโ”€โ”€ 04_verify.sh
    โ””โ”€โ”€ 05_patch_existing_image.sh

Relationship to GitHub Repository

ResourceLocation
Docker image tarballsThis HuggingFace repo
Dockerfile & build scriptsGitHub
Patch filesGitHub (reproduce/patches/)
Resharding scriptGitHub (scripts/01_reshard_nvfp4.sh)
Chat UIGitHub (chat/)
Full documentationGitHub (README.MD)

License

  • โ€”Reproduction scripts / vLLM: Apache 2.0
  • โ€”Qwen3.5 model weights: Qwen License โ€” see model card before use

Citation

If this deployment is useful in your work, please consider citing or linking to the GitHub repository.

Patrick Devaney โ€” vLLM Jetson Thor: Qwen3.5-122B-A10B-NVFP4 (February 2026)
https://github.com/patrickbdevaney/qwen-3.5-122b-a10b-jetson-thor