TensorRT-LLM is NVIDIA’s inference stack for Hopper and Blackwell GPUs. This guide launches a Massed Compute GPU VM, pulls the NGC release container, runs trtllm-serve under systemd, and hits /v1/chat/completions the same way you would hit OpenAI.
You get a /v1 endpoint on port 8000 (same as vLLM; SGLang defaults to 30000). The walkthrough uses ungated TinyLlama/TinyLlama-1.1B-Chat-v1.0 so the API comes up without a Hugging Face token. This was validated on an NVIDIA H100 PCIe (80 GB) on August 25, 2026. TensorRT-LLM 1.2.1 served that model on the PyTorch backend (the 1.2.1 default). There is no separate trtllm-build step in this path.
If you already run SGLang or vLLM on Massed Compute, this is the NVIDIA container path — same OpenAI request shape, different runtime. Do not copy those pip/venv guides; the install here is Docker.
| Component | Version | Purpose |
|---|---|---|
| Ubuntu Server | 24.04 LTS | Image 184: NVIDIA driver 580.126.16, Docker 29.2.1, NVIDIA Container Toolkit |
| TensorRT-LLM | 1.2.1 | nvcr.io/nvidia/tensorrt-llm/release:1.2.1 (~16 GB) + trtllm-serve |
| PyTorch | 2.10.0 (NGC 25.12) | CUDA 13.1 inside the container (forward-compat with host driver 580) |
| Model (validated) | TinyLlama/TinyLlama-1.1B-Chat-v1.0 | Ungated chat model. /v1 returned Pong. |
| Resource | This walkthrough | Notes |
|---|---|---|
| GPU | H100 PCIe 80 GB (gpu_1x_h100) |
Validated. TinyLlama weights are small; the runtime still filled ~73 GB with paged KV cache |
| System RAM | 128 GB | SKU ships 128 GiB |
| vCPU | 20 | SKU ships 20 vCPU |
| Storage | 1250 GB | NGC image plus Hugging Face cache |
| Network | 1 Gbps | First docker pull is the slow step |
Massed Compute VM Pricing
Lead with the H100 this guide was tested on. Blackwell is listed for FP4 work we did not run here.
Pricing fetched from the Massed Compute inventory API on August 25, 2026.
| SKU | Description | vCPU | RAM | Storage | Price | Capacity |
|---|---|---|---|---|---|---|
gpu_1x_l40_spot |
1x L40 (48GB) [Spot] | 14 | 72 GiB | 625 GB | $0.78/hr | 19 |
gpu_1x_6000_ada |
1x RTX 6000 ADA (48GB) | 12 | 72 GiB | 350 GB | $0.79/hr | 12 |
gpu_1x_l40 |
1x L40 (48GB) | 14 | 72 GiB | 625 GB | $0.86/hr | 19 |
gpu_1x_pro_6000_blackwell |
1x RTX PRO 6000 Blackwell (96GB) | 16 | 144 GiB | 725 GB | $2.19/hr | 16 |
gpu_1x_h100_spot |
1x H100 (80GB) [Spot] | 20 | 128 GiB | 1250 GB | $2.45/hr | 2 |
gpu_1x_h100 |
1x H100 (80GB) | 20 | 128 GiB | 1250 GB | $2.73/hr | 2 |
gpu_1x_h100. Use on-demand if the endpoint has to stay up. The H100 is the card this run used — see Llama 3.1 Benchmark by GPU Type and the H100 section in Why RAG Systems Rely on NVIDIA GPUs. Hopper FP8 / Transformer Engine context: Why NVIDIA Leads in AI. For 96 GB and FP4 on one card see Why the RTX PRO 6000 Blackwell Is Built for Modern AI and Rendering. For a broader inference-card comparison see The Best GPU for LLM Inference Without Overpaying.Step-by-Step Deployment
Image 184 logs in as Ubuntu (capital U). If SSH offers extra keys and then fails, add -o IdentitiesOnly=yes. Image 184 already has Docker and the NVIDIA Container Toolkit. Ubuntu is not in the docker group, so the bootstrap uses sudo docker. systemd runs the container as root, which is how this run stayed up.
Launch GPU VM
# Launch via Massed Compute dashboard or API
# Product: gpu_1x_h100
# Image: 184 (Ubuntu Server 24.04 w/ Drivers)
# SSH Key: attach your public key
# Instance name: tensorrt-llm-openai
Wait until the VM is running and copy the SSH details. This run landed in us-central-3 (Des Moines).
Verify GPU Access
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP \
'nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv,noheader'
This run printed: NVIDIA H100 PCIe, 81559 MiB, 580.126.16.
Bootstrap TensorRT-LLM
Pull the NGC release container and run trtllm-serve under systemd. Inside the container the server binds 0.0.0.0:8000. On the host it is published as 127.0.0.1:8000 only.
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP 'bash -s' <<'EOF'
set -euxo pipefail
TRTLLM_IMAGE="${TRTLLM_IMAGE:-nvcr.io/nvidia/tensorrt-llm/release:1.2.1}"
TRTLLM_MODEL="${TRTLLM_MODEL:-TinyLlama/TinyLlama-1.1B-Chat-v1.0}"
TRTLLM_PORT="${TRTLLM_PORT:-8000}"
mkdir -p "${HOME}/.cache/huggingface" "${HOME}/trtllm-openai"
sudo docker pull "${TRTLLM_IMAGE}"
sudo tee /etc/systemd/system/trtllm-openai.service >/dev/null <<UNIT
[Unit]
Description=TensorRT-LLM OpenAI-compatible API
After=docker.service network-online.target
Requires=docker.service
Wants=network-online.target
[Service]
Type=simple
Restart=on-failure
RestartSec=15
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker rm -f trtllm-openai
ExecStart=/usr/bin/docker run --rm --name trtllm-openai --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 -p 127.0.0.1:${TRTLLM_PORT}:8000 -v ${HOME}/.cache/huggingface:/root/.cache/huggingface ${TRTLLM_IMAGE} trtllm-serve ${TRTLLM_MODEL} --host 0.0.0.0 --port 8000
ExecStop=/usr/bin/docker stop trtllm-openai
[Install]
WantedBy=multi-user.target
UNIT
sudo systemctl daemon-reload
sudo systemctl enable --now trtllm-openai
EOF
--ipc=host and the memlock/stack ulimits match NVIDIA’s container run flags (MPI inside the image, even on one GPU). TimeoutStartSec=0 is required: first start downloads weights and runs autotune, which takes longer than systemd’s default timeout. The host publish stays on 127.0.0.1 until you add a firewall rule and auth.
The container log on this H100 printed CUDA Forward Compatibility mode ENABLED (host driver 580, container CUDA 13.1 / 590). That is expected on image 184 with this NGC tag. It served.
Verify Service Status
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP 'systemctl is-active trtllm-openai'
Expected output: active
active means Docker started. It does not mean /v1 is up yet. Poll the next step.
Test Models Endpoint
First start downloads TinyLlama and runs autotune. On this H100, /v1/models answered in about 50–60 seconds (same order of magnitude on a restart with weights already cached). Poll until it answers:
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP 'bash -s' <<'EOF'
set -euo pipefail
for _ in $(seq 1 90); do
if curl -sf http://127.0.0.1:8000/v1/models >/tmp/trtllm-models.json; then
cat /tmp/trtllm-models.json
echo
echo TRTLLM_MODELS_OK
exit 0
fi
sleep 10
done
journalctl -u trtllm-openai -n 160 --no-pager
exit 1
EOF
This run returned:
{"object":"list","data":[{"id":"TinyLlama/TinyLlama-1.1B-Chat-v1.0","object":"model","created":1787660705,"owned_by":"tensorrt_llm"}]}
Run Chat Completion Test
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP 'bash -s' <<'EOF'
set -euo pipefail
curl -sf http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"TinyLlama/TinyLlama-1.1B-Chat-v1.0","messages":[{"role":"user","content":"Reply with the single word pong."}],"max_tokens":16,"temperature":0}'
echo
EOF
The assistant message on this run was Pong. Same request shape as OpenAI and as the vLLM / SGLang posts.
Confirm GPU Utilization
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP \
'nvidia-smi --query-gpu=name,memory.used,utilization.gpu --format=csv,noheader'
After load this H100 sat at 73065 MiB used. That is not 1.1B of weights. TensorRT-LLM logged Allocated 67.59 GiB for max tokens in paged KV cache (max sequence length 2049). For TinyLlama that reservation is leftover VRAM you are not using. To leave more free, add --kv_cache_free_gpu_memory_fraction 0.3 to the trtllm-serve command and restart. For a real 8B+ serve, the default reservation is usually what you want.
Model Conversion and Engine Build
On TensorRT-LLM 1.2.1, conversion and trtllm-build are not required and not available. NVIDIA’s 1.2 release notes remove the TensorRT engine backend: trtllm-build, trtllm-refit, trtllm-prune, --backend tensorrt, and the per-model convert_checkpoint.py scripts are gone. PyTorch is the only execution backend. Point trtllm-serve at a Hugging Face repo or a TensorRT Model Optimizer checkpoint. That is what this walkthrough did.
Older Hugging Face cards (for example NVIDIA’s Llama 3.1 8B Instruct FP8 notes written against TensorRT-LLM 0.13) still show convert_checkpoint.py then trtllm-build. Those commands fail in this NGC 1.2.1 container. Do not paste them into the systemd unit above.
When you want a quantized checkpoint on 1.2.1, skip the engine build and serve the published Model Optimizer weights:
# Inside the same NGC container / systemd ExecStart model argument.
# Gated Llama: add docker run -e HF_TOKEN=... Not run on this VM.
trtllm-serve nvidia/Llama-3.1-8B-Instruct-FP8 --host 0.0.0.0 --port 8000
NVIDIA’s ungated FP8 example is nvidia/Qwen3-8B-FP8 (model card lists Blackwell / B200 test hardware). Confirm the card matches your GPU before you swap it in.
Where TensorRT-LLM Fits vs vLLM, SGLang, and TGI
Use this post for TensorRT-LLM. Link out for the other engines — those guides already exist.
- TensorRT-LLM (this guide): NVIDIA NGC container +
trtllm-serve. PyTorch backend in 1.2.1. OpenAI/v1on port 8000. Pick this when you want NVIDIA’s runtime on Hopper/Blackwell. - SGLang: high-throughput self-hosted serving, radix / prefix cache, port 30000. See Deploy SGLang with an OpenAI-Compatible API on GPU Cloud.
- vLLM: the existing Massed Compute production OpenAI-API path. See Deploy vLLM with OpenAI API on GPU Cloud.
- TGI: Hugging Face–native serving. See Build an LLM Inference API with TGI.
This is not a bake-off. The numbers below are TinyLlama on one H100, not a vLLM or SGLang comparison. Pick TensorRT-LLM when you want NVIDIA’s Hopper/Blackwell runtime and Model Optimizer checkpoints. Pick SGLang for prefix cache / high QPS. Pick vLLM when you want the OpenAI-API path Massed Compute already runs in production.
Supported GPUs: H100, Blackwell, and FP8/FP4
TensorRT-LLM 1.2.1 is NVIDIA’s inference stack for Hopper and Blackwell. This post was validated on one H100 PCIe 80 GB.
| GPU | Precision NVIDIA documents | This post |
|---|---|---|
H100 PCIe 80 GB (gpu_1x_h100) |
Hopper FP8 (Transformer Engine) | Validated TinyLlama, PyTorch backend |
| H100 / H200 class | FP8 instruct checkpoints such as nvidia/Llama-3.1-8B-Instruct-FP8 |
Not run |
| RTX PRO 6000 Blackwell 96 GB | FP4 / NVFP4 plus FP8 | Not run |
| L40 / RTX 6000 Ada | TensorRT-LLM can run; do not assume a Hopper FP8 checkpoint loads | Not run |
NVIDIA’s 1.2 notes list Llama 3.1 8B Instruct at FP16 / FP8 / NVFP4 among validated models. NVFP4 is the Blackwell-oriented path. H100 product context: Llama 3.1 Benchmark by GPU Type. Blackwell product context: RTX PRO 6000 Blackwell.
Precision, VRAM, and Multi-GPU
H100 (Hopper) has FP8. RTX PRO 6000 Blackwell has FP4. This VM ran TinyLlama, not an FP8 or FP4 checkpoint.
| Path | Hardware NVIDIA documents | What we ran |
|---|---|---|
| TinyLlama 1.1B (this guide) | Any TensorRT-LLM GPU | Yes — H100 PCIe |
nvidia/Llama-3.1-8B-Instruct-FP8 |
Hopper / Lovelace / Blackwell; NVIDIA lists H100 test hardware | No. Gated Llama weights; needs HF_TOKEN |
nvidia/Qwen3-8B-FP8 |
NVIDIA’s trtllm-serve FP8 example; model card lists Blackwell / B200 |
No |
| 70B FP8 | Typical next SKU gpu_2x_h100 with --tp_size 2 |
No |
gpu_2x_h100 was $5.46/hr with 1 free on August 25, 2026. GPU pricing for current stock. Tensor parallelism on trtllm-serve is --tp_size, not --tp. Stay on one GPU (this walkthrough) until a single card OOMs or you need a 70B-class checkpoint. Then launch gpu_2x_h100 (or Blackwell 2×) and set --tp_size 2 to match the GPU count. Pipeline parallel is --pp_size in NVIDIA’s serve CLI; it was not used here.
To try NVIDIA’s H100-documented FP8 8B (gated) after this smoke is green:
# Requires a Hugging Face token with Llama 3.1 access.
# Edit ExecStart: TinyLlama/... → nvidia/Llama-3.1-8B-Instruct-FP8
# Add: -e HF_TOKEN=... on the docker run line, then:
sudo systemctl daemon-reload
sudo systemctl restart trtllm-openai
Concurrency, TTFT, and Throughput
Same H100 PCIe, TinyLlama-1.1B-Chat-v1.0, TensorRT-LLM 1.2.1 PyTorch backend, localhost, August 25, 2026.
| Metric | Value |
|---|---|
| Time to first token (median of 5 streams) | 23.1 ms |
| First stream after a pause (warmup) | 50.7 ms |
| 8 concurrent chat completions, wall clock | 523 ms |
| Combined output tokens, 8-way | 164 |
| Combined output throughput, 8-way | 314 tok/s |
Report the median TTFT. The 50.7 ms first stream is warmup, not the number to quote.
This is a smoke on TinyLlama, not an FP8 vs BF16 bake-off. NVIDIA’s published before/after for a Hopper FP8 8B (not this VM): on H100 they report ~1.3× throughput for nvidia/Llama-3.1-8B-Instruct-FP8 vs FP16 (MMLU 68.3 vs 68.6) with TensorRT-LLM 0.13 on 8× H100, batch 1024, in-flight batching — see the Llama-3.1-8B-Instruct-FP8 model card. That is NVIDIA’s number, a different TRT-LLM version, and eight GPUs. Do not quote it as this Massed Compute run.
Eight-way smoke from the VM:
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP 'bash -s' <<'EOF'
set -euo pipefail
for i in $(seq 1 8); do
curl -sf http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"TinyLlama/TinyLlama-1.1B-Chat-v1.0","messages":[{"role":"user","content":"Reply with one short sentence."}],"max_tokens":32,"temperature":0}' \
>/tmp/trtllm-c$i.json &
done
wait
echo TRTLLM_CONCURRENCY_OK
EOF
Troubleshooting
SSH fails or keeps asking for a password. Image 184’s user is Ubuntu, not ubuntu. Use -o IdentitiesOnly=yes. Refresh host keys with ssh-keygen -R YOUR_VM_IP if the instance was relaunched on a reused IP.
permission denied talking to Docker. Image 184 ships Docker, but Ubuntu is not in the docker group. Use sudo docker …, or sudo usermod -aG docker Ubuntu and start a new SSH session. systemd does not need that group.
NGC pull is slow. Tag 1.2.1 is about 16 GB. Pin that tag. Do not use floating latest in a systemd unit.
Container says CUDA Forward Compatibility ENABLED. Expected on image 184 (driver 580) with this NGC image (CUDA 13.1 / 590). This H100 served in that mode.
systemctl is-active is active but curl fails. Docker is up; weights and autotune are still loading. Poll /v1/models. Read journalctl -u trtllm-openai -f.
Tiny model using ~73 GB. Default paged KV cache. Add --kv_cache_free_gpu_memory_fraction 0.3 for smoke tests.
FP8 checkpoint fails on L40 / A6000. Hopper FP8 wants H100/H200. Ada can run TensorRT-LLM; do not assume a Hopper FP8 checkpoint will load there. FP4 wants Blackwell. Neither was run on this VM.
Gated model 401. TinyLlama does not need a token. Llama 3.1 FP8 does: put HF_TOKEN on the docker run -e line (systemd Environment= alone does not enter the container).
Nothing on port 30000. trtllm-serve default is 8000. SGLang uses 30000.
Laptop curl to http://YOUR_VM_IP:8000 hangs. Expected while the host publish is 127.0.0.1. Test from the VM.
trtllm-build: command not found or convert_checkpoint.py missing. Expected on 1.2.1. The TensorRT engine path was removed. Serve a Hugging Face or Model Optimizer checkpoint with trtllm-serve.
Out of memory. Smaller model, shorter context, lower --kv_cache_free_gpu_memory_fraction, an FP8 checkpoint NVIDIA lists for your GPU, a larger SKU, or --tp_size.
Deploy TensorRT-LLM on NVIDIA H100 GPUs
Launch NVIDIA H100 instances optimized for TensorRT-LLM inference. Get 80GB HBM, FP8 Tensor Cores, and per-second billing.
Think it. Build it. Scale it.
Quick Setup Reference
# 1. Launch gpu_1x_h100, image 184
# 2. Verify GPU
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP 'nvidia-smi'
# 3. Bootstrap TensorRT-LLM (script in step 3)
# 4. Wait for /v1, then chat
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP 'curl -sf http://127.0.0.1:8000/v1/models'
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP \
'curl -sf http://127.0.0.1:8000/v1/chat/completions -H "Content-Type: application/json" -d "{...}"'
# 5. Monitor
ssh -o IdentitiesOnly=yes Ubuntu@YOUR_VM_IP 'journalctl -u trtllm-openai -f'
Frequently Asked Questions
01What did this guide actually run?
gpu_1x_h100, image 184, nvcr.io/nvidia/tensorrt-llm/release:1.2.1, trtllm-serve TinyLlama/TinyLlama-1.1B-Chat-v1.0 on the PyTorch backend, 127.0.0.1:8000. Chat returned Pong. Median TTFT 23.1 ms. 8-way 314 tok/s.
02What models work with this setup?
Hugging Face causal LMs TensorRT-LLM 1.2.1 can load, plus NVIDIA Model Optimizer checkpoints. This guide only proves TinyLlama. Gated Llama weights need HF_TOKEN on the docker run line.
03Do I need to convert the model and run trtllm-build?
Not on TensorRT-LLM 1.2.1. NVIDIA removed the TensorRT engine backend. Serve the Hugging Face repo or a Model Optimizer checkpoint. Older convert + trtllm-build snippets on Hugging Face cards target pre-1.2 releases.
04How do I change the model after deployment?
Edit /etc/systemd/system/trtllm-openai.service, change the model argument to trtllm-serve, then sudo systemctl daemon-reload && sudo systemctl restart trtllm-openai. New weights download on restart.
05TensorRT-LLM vs vLLM vs SGLang?
Same client: /v1/chat/completions. This post is NVIDIA’s container runtime. SGLang is the high-throughput / prefix-cache option. vLLM is the OpenAI-API path already documented for production. See Deploy SGLang with an OpenAI-Compatible API on GPU Cloud and Deploy vLLM with OpenAI API on GPU Cloud.
06Can I run a 70B model?
Not on this walkthrough. FP8 70B is tight on one 80 GB H100 with long context. NVIDIA’s serve flag for tensor parallelism is --tp_size 2 on gpu_2x_h100. FP4 on Blackwell was not tested here.
07How do I enable external access?
Change -p 127.0.0.1:8000:8000 to -p 0.0.0.0:8000:8000, open the firewall for 8000, and put TLS plus auth in front. Do not leave an open inference API on the public internet.
08What’s the difference between spot and on-demand?
Spot is cheaper and can be interrupted. This run used on-demand gpu_1x_h100. Use on-demand if the endpoint has to stay up.
Recipe tested on August 25, 2026.











