The 8 GB Lab Book · Chapter 1

There is no VRAM on this board

Board
Jetson Orin Nano Super
Mode
15W (nvpmodel 0)
Summary
The board shows 7,620 MB of one shared pool, not 8,000. The 7B plus the 3B reached 7,441 MB, and swap took 659 MB more. The model load deltas subtract the 643 MB idle of that run.

What I expected

Before the run, I wrote down each expected cost.

  • Usable memory: 8,000 MB
  • CUDA context, cudaFree(0): ~800 MB
  • CUDA context, torch: ~800 MB
  • Llama-3.2-1B Q4_K_M: 700 MB
  • Llama-3.2-3B Q4_K_M: 1,800 MB
  • Qwen3-4B Q4_K_M: 2,250 MB
  • gemma-3n-E2B Q4_K_M: ~3,000 MB
  • Qwen2.5-7B Q4_K_M: 4,300 MB
  • 7B + 3B together: 8,000 MB (my note; the 7B and 3B rows above sum to 6,100)

The theory

Why there is no vram here

A normal PC keeps the model weights in . VRAM is a separate chip on the graphics card. The OS runs in its own separate memory.

This board does not have this division. The OS, CUDA, the camera and the LLM all use memory from one 8 GB chip. There is one pool, not two pools.

THE ARITHMETIC: how close a call the 7B+3B was

7620 visible - 7441 resident (7B+3B) = 179 MB. This is the headroom that remained.

Then increased by another 659 MB in addition to that. There was no location where it could go.

7620 - 5355 (7B alone) = 2265 MB is still free with the 7B resident. The 3B alone took 3109 MB, more than this margin. So the second model does not fit. It left 179 MB and pushed 659 MB into swap.

The measurement

WhatExpectedMeasuredNote
Usable memory8,000 MB7,620 MB8192 - 7620 = 572 MiB reserved below Linux
Idle, desktop up-715 MBdesktop idle (measured.json). The two CUDA rows subtract 715. The six model rows subtract 643, the idle when the loads began
CUDA context, cudaFree(0)~800 MB+86 MB
CUDA context, torch~800 MB+341 MBtorch libraries + context
Llama-3.2-1B Q4_K_M700 MB+1,441 MBpile 2084 · dev 955 MiB
Llama-3.2-3B Q4_K_M1,800 MB+3,109 MBpile 3752 · dev 2436 MiB
Qwen3-4B Q4_K_M2,250 MB+3,622 MBpile 4265 · dev 3031 MiB
gemma-3n-E2B Q4_K_M~3,000 MB+3,421 MBpile 4064 · N from file size
Qwen2.5-7B Q4_K_M4,300 MB+4,712 MBpile 5355 · dev 4528 MiB
7B + 3B together8,000 MB (rows sum to 6,100)+6,798 MB7441/7620 + swap 659 -> reboot
Measured on the board unless the row says estimate or predicted.
One pile of RAM. There is no spare VRAM.
Fig 1.1One pile of RAM. There is no spare VRAM.

What's on the GPU, one model (7B)

Qwen2.5-7B, on device

weights          4168 MiB
KV cache          224 MiB
scratch           136 MiB
= = 4528 MiB on the GPU

The remainder of the 5355 MB pile is 827 MB. It is on the CPU side: page cache, buffers and python.

With torch, it costs 341 MB only to start CUDA, not 86. The runtime that you select is a part of the budget.

I measured these numbers on the board with at 15W, with the desktop on.

The fixed costs before any model loads

the fixed costs, MiB (tegrastats labels them MB)

8 GB chip
8192
visible
7620
idle
715
CUDA ctx
86
reserved
572
7620: the real ceiling. The sticker's 8 GB is 8192 MiB, and 572 of it is reserved before Linux counts it. Idle 715 is the desktop idle; the load run started from 643.

The board gave visible, idle and CUDA ctx while it ran. tegrastats prints MB, but it counts . The 8 GB chip is 8192 MiB. So 8192 - 7620 = 572 MiB is reserved before Linux counts it. My first note gave 380 MB, but that was 8000 - 7620, a subtraction across two units.

Six loads, climbing to the wall

1B
2084
3B
3752
4B
4265
E2B
4064
7B
5355
7B+3B
7441

Line at 7620 ceil

No OOM error anywhere, all values in MB. First the pile fills (X = swap, then reboot), then the board goes.
modelpredictedmeasured
1B7001441
3B18003109
4B22503622
E2B~3,0003421
7B43004712
7B+3B8000 (rows sum to 6100)6798
predicted vs measured, MB added by loading.

Where it broke

I predicted 700 MB for the 1B and measured 1441. Every model cost more than my note, the 1B twice as much, because I had counted weights and not the context, the scratch and the runtime. The 7B plus 3B did not reach my 8,000 prediction. It reached 7,441 MB, then 659 MB of swap, then a reboot. My 8,000 was not even the sum of my own rows, which is 6,100.

My notes from Day 1

Written by hand on 2026-09-01, before this chapter was typed. These are my original notes from that day. Where the chapter corrects them, the chapter is current.

Handwritten notes, Day 1, page 1
Day 1, page 12026-09-01
Handwritten notes, Day 1, page 2
Day 1, page 22026-09-01

Summary

  • The sentence "4B Q4 only needs 2.5 GB of VRAM" is dimensionally wrong on this board. That sentence assumes that a 16 GB host is next to the card. On Nano, the 2.5 GB, the CUDA context, the camera pool and Ubuntu are parts of one pool.
  • OOM is not a CUDA error that you catch and then try again on host RAM. There is no host RAM. First the pile becomes full. Then the board fails.
  • Make the budget from the measured idle. Do not use the 8,000 on the sticker.

Sources

These sources are not mine. Measured numbers came off my own board; specs, estimates and paper figures are labeled as such.

  • NVIDIA CUDA programming guide (UM vs copy)
  • Jetson architecture: iGPU + shared LPDDR5
  • NVIDIA Developer Forum on pinned vs device buffers on Orin (pinned ≠ always fastest)
  • Jetson Orin Nano 8GB datasheet: 8GB 128-bit LPDDR5, 102 GB/s in Super