MaruOpsInfrastructure and AI notes

About (Korean)Contact (Korean)

Run vLLM on RTX: Rocky Linux 9 and Ubuntu 24.04 or 26.04

Three cooling fans for a Gigabyte GeForce RTX 3090 graphics card standing on a wooden table.

Reference photo · Three cooling fans for a Gigabyte GeForce RTX 3090 graphics card standing on a wooden table. · Photo: PantheraLeo1359531 / Source / CC BY 4.0 · Resized for listings; illustrative photo, not the tested environment

Load a small language model on an RTX GPU and serve answers through an HTTP endpoint with vLLM. The main paths cover NVIDIA RTX on Rocky Linux 9 and Ubuntu 24.04 or 26.04. Separate sections explain the hardware and runtime conditions that differ for AMD and Intel GPUs.

The base date is October 22, 2026, and the example image is fixed as v0.32.0. This is a follow-up guide created by checking the official documentation and distribution image information, and is not a review of running and measuring GPU inference on all three operating systems. The screenshots in the text are actual official document screens, and the representative photo is a photo of the RTX 3090 for reference.

On this page

Choose the path that suits your GPU

RTX uses CUDA, ROCm for supported AMD GPUs, and XPU path for supported Intel GPUs. When GPU manufacturers change, images and host drivers also change. Containers reduce installation differences, but they do not replace an unsupported GPU with a supported GPU.

GPUexecution pathConditions to check first
NVIDIA RTX 20, 30, 40, 50 series, etc.vllm/vllm-openaivLLM Compute Capability 7.5 or higher, driver and image CUDA compatibility
AMD Instinct/Select Radeon/Ryzen GPUsvllm/vllm-openai-rocmAccurate combination of GPU·gfx architecture·ROCm·OS·kernel
Supported Intel Arc/Data Center GPUsvllm/vllm-openai-xpuList of verified hardware, Intel driver and runtime combinations

Compute Capability is the generation of compute capabilities supported by NVIDIA GPUs. This value is different from the VRAM capacity. Don’t just look at the product lines in the table above and assume that all features of each individual model are supported, but compare your model in the vLLM GPU installation document .

A screen showing the requirements for Linux and Compute Capability 7.5 or higher in the NVIDIA CUDA tab of the vLLM official documentation.
What to check in the NVIDIA tab is the GPU generation condition · 2026-10-22 Actual document screen capture. Source: vLLM project / Apache-2.0. This is not an inference execution result screen. I have cut out and marked only the parts to be read.

What vLLM does and choosing your first model

vLLM is an engine for language model inference and API serving. It schedules incoming work for the GPU, which is useful for a service handling concurrent requests. Installing it does not change a model’s answer quality or guarantee the lowest latency for a single request. See the vLLM introduction.

The first model is set to Qwen/Qwen2.5-1.5B-Instruct. It is a 1.5B class small conversation model, and you can check the Apache-2.0 license and vLLM usage examples on the official model card. Rather than showing off the latest large model, a good starting point is to download → load GPU → check the connection in the first response. (Qwen official model card)

The GPU memory VRAM contains not only the weights but also the calculation intermediate values and KV cache . The KV cache is a space that stores the values ​​used to calculate the attention of previously processed tokens. The longer the input or the more conversations you process simultaneously, the greater the amount required.

model scaleSimple calculation of only 16-bit weightsinterpretation
1.5BAbout 3GBFor first load and API connection verification
7BAbout 14 GBCan’t be sure there’s enough space left in 16GB VRAM
8BAbout 16 GBDoesn’t mean the entire execution space will fit in 16GB VRAM

This table is a rough weight-memory estimate calculated as parameter count multiplied by 2 bytes. It is not a benchmark or a guarantee that a model will run on a particular GPU. Begin with a short context and few concurrent requests. If memory runs out, reduce model size and context length to narrow the cause. See the vLLM memory-saving guide.

Ready for Rocky Linux 9·Ubuntu 24.04·26.04

The examples assume an x86_64 host, administrator privileges and ordinary Docker Engine. A VM needs access to a passed-through GPU. Rootless Docker and Podman have different runtime configurations and require separate procedures.

cat /etc/os-release
uname -r
uname -m
lspci -nn | grep -Ei 'VGA|3D|Display'
sudo docker version

If you do not have lspci, install sudo dnf install pciutils for Rocky and sudo apt install pciutils for Ubuntu. Both Client and Server must be visible in docker version. If you don’t have Docker, check the official installation procedure for Ubuntu or RPM series Docker installation procedure and the support range of your distribution first. Do not start by running commands to bulk delete packages from existing container servers.

operating systemNVIDIA preparation path for this articleversion check point
Rocky Linux 9DNF Driver → RPM Toolkit RepositoryThe minor version specified in the Toolkit support table is 9.7. Separate comparison with your own 9.x·kernel
Ubuntu 24.04 LTSUbuntu Driver Tools → DEB Toolkit repository24.04 specified in Docker and Toolkit support table
Ubuntu 26.04 LTSUbuntu Driver Tools → DEB Toolkit repository26.04 specified in Docker and Toolkit support table

It was written based on the NVIDIA Container Toolkit support table and Docker Ubuntu support table confirmed on 2026-10-22. This table is for NVIDIA container configuration and does not mean that AMD and Intel have been automatically verified on the same OS.

Ubuntu 24.04·26.04: NVIDIA Driver

If nvidia-smi is already operating normally and meets the driver conditions in the image, reinstallation is skipped. On the new lab equipment, you can use Ubuntu’s driver tool to check for candidates and then install them. You will need to clean up your installation method before mixing it with an existing NVIDIA repository or a manual .run installation. (Ubuntu official NVIDIA driver guide)

sudo apt update
sudo apt install -y ubuntu-drivers-common pciutils
ubuntu-drivers devices
sudo ubuntu-drivers install
sudo reboot

After rebooting, reconnect and check the GPU and driver version with nvidia-smi. Devices that use Secure Boot also check the module signature and key registration procedures. If the automatically recommended driver does not meet the required CUDA 13 requirements in the image below, do not proceed, but check the latest driver installation path that supports your GPU and Ubuntu version.

Rocky Linux 9: NVIDIA Drivers

This NVIDIA RPM repository procedure is for an x86_64 lab machine with no existing driver installation and a Turing-or-newer GPU, such as the applicable RTX models. rhel9 is the repository identifier used for Rocky 9. Skip this step if the installed driver already works. See NVIDIA’s Rocky Linux installation guide.

sudo dnf install -y dnf-plugins-core pciutils
sudo dnf install -y kernel-devel-matched kernel-headers
sudo dnf config-manager --set-enabled crb
sudo dnf install -y epel-release
sudo dnf config-manager --add-repo \
  https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
sudo dnf clean expire-cache
sudo dnf module enable -y nvidia-driver:open-dkms
sudo dnf install -y nvidia-open
sudo reboot

Open in open-dkms refers to the type of NVIDIA kernel module. This is not a command to install AMD drivers or Nouveau. If the module does not load even after rebooting, check whether the current kernel matches the development package, DKMS build status, and Secure Boot signature. Do not turn off SELinux without checking the cause.

Connect host GPU into Docker

Making GPUs visible to the host and making them visible to the container are two steps. First, the following command must succeed on the host: If that fails, fix the driver first before installing vLLM.

nvidia-smi
nvidia-smi --query-gpu=name,driver_version,memory.total,memory.free \
  --format=csv

The amd64 image setting of vllm/vllm-openai:v0.32.0 confirmed in this article records CUDA 13.0.2. Typical execution of the CUDA 13 series requires R580 or later drivers, and newer drivers may be required depending on actual GPU/capabilities. Do not apply compatibility bypass settings for data center GPUs to GeForce RTX. (Official Image Tag, NVIDIA CUDA Driver Compatibility Conditions)

The CUDA Version at the top of nvidia-smi is the CUDA level supported by the host driver. It does not refer to the CUDA Toolkit installed on the host or the CUDA version in the container. The container method below does not assume installation of nvcc on the host.

Toolkit for Ubuntu 24.04·26.04

Register NVIDIA’s DEB repository and signing key. If the same repository is already set up, do not register it twice and check the existing files first. The following code is for plain Docker. (NVIDIA Container Toolkit Installation Document)

sudo apt install -y curl ca-certificates gnupg
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  -o /tmp/nvidia-container-toolkit-gpgkey
sudo gpg --dearmor \
  -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  /tmp/nvidia-container-toolkit-gpgkey
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  -o /tmp/nvidia-container-toolkit.list
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  /tmp/nvidia-container-toolkit.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update
sudo apt install -y nvidia-container-toolkit

Toolkit for Rocky Linux 9

In Rocky, the same Toolkit is installed from the RPM repository. Rather than running both the above Ubuntu command and this command, choose only one that matches your OS.

sudo dnf install -y curl
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo \
  -o /tmp/nvidia-container-toolkit.repo
sudo install -m 0644 /tmp/nvidia-container-toolkit.repo \
  /etc/yum.repos.d/nvidia-container-toolkit.repo
sudo dnf install -y nvidia-container-toolkit

Check common runtime settings and GPU

Now register the NVIDIA runtime with Docker. nvidia-ctk modifies /etc/docker/daemon.json, so keep the existing settings. Docker restart may affect other running containers, so the operation server will allow time for the operation before proceeding.

if sudo test -f /etc/docker/daemon.json; then
  sudo cp -a /etc/docker/daemon.json "/etc/docker/daemon.json.before-nvidia-$(date +%Y%m%d-%H%M%S)"
fi
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

sudo docker pull vllm/vllm-openai:v0.32.0
sudo docker run --rm --runtime nvidia --gpus all \
  --entrypoint nvidia-smi \
  vllm/vllm-openai:v0.32.0

The GPU name and driver information should also be visible within the container. If you pass this point, you have confirmed the connection of Host Driver → Toolkit → Docker. Model loading and inference have not yet been verified. (Docker runtime setting basis)

Running servers with small models on RTX

The first run may take some time as it downloads the weights and prepares them for execution. The model cache is stored in Docker’s named volume. It can also reduce label problems that can occur when bind mounting an arbitrary home directory in Rocky’s SELinux environment.

sudo docker volume create maruops-vllm-hf-cache
sudo docker volume create maruops-vllm-compile-cache

sudo docker run -d --name maruops-vllm \
  --runtime nvidia --gpus '"device=0"' \
  --shm-size=4g \
  -p 127.0.0.1:8000:8000 \
  -v maruops-vllm-hf-cache:/root/.cache/huggingface \
  -v maruops-vllm-compile-cache:/root/.cache/vllm \
  vllm/vllm-openai:v0.32.0 \
  --model Qwen/Qwen2.5-1.5B-Instruct \
  --served-model-name local-qwen \
  --host 0.0.0.0 --port 8000 \
  --dtype half \
  --max-model-len 2048 \
  --max-num-seqs 2 \
  --gpu-memory-utilization 0.80

sudo docker logs -f maruops-vllm

device=0 selects the first GPU. If you have multiple GPUs, check and replace the number in nvidia-smi on the host. --dtype half uses FP16, and 2048 is the maximum context length of input and output combined. --max-num-seqs 2 limits the number of sequences executing simultaneously. These values ​​are small experimental starting values ​​and are not minimum specifications that will guarantee operation on all cards.

--gpu-memory-utilization 0.80 is the percentage of the GPU memory budget that the engine will use. There is no option to compress the model to 80% size. --shm-size=4g also does not increase GPU VRAM. This is the upper limit on the shared memory space between processes, and requires free physical host RAM. (vLLM execution options, official container usage)

Inside the server, it listens on the container’s 0.0.0.0:8000, and on the host it only publishes 127.0.0.1:8000. This is a setting to avoid opening the practice API without authentication to the entire Internet. When you are ready to view the log, just quit viewing the log with Ctrl+C. The server launched with -d continues to run.

First question: Ask your GPU to work the night shift

View the model list from another terminal on the same server. If the model download or engine initialization has not finished, wait a moment and check the log. We do not determine that the API is ready simply because the container is in a Running state.

curl --fail-with-body -sS http://127.0.0.1:8000/v1/models

If you check local-qwen in the list, send the conversation. The alias specified as --served-model-name must match model in the request. This is a call to vLLM’s Chat Completions route and is not a request to an external AI service. (vLLM API document)

curl --fail-with-body -sS http://127.0.0.1:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  --data-binary @- <<'JSON'
{
  "model": "local-qwen",
  "messages": [
    {"role": "system", "content": "한국어로 간결하게 답하세요."},
    {"role": "user", "content": "너는 오늘부터 GPU 야간 근무 담당이야. 자기소개를 두 문장으로 해줘."}
  ],
  "temperature": 0.7,
  "max_tokens": 160
}
JSON

If successful, the answer is read from choices[0].message.content in the JSON response. There is no need to wait for a fixed answer phrase since the sentence content may vary from run to run. If usage is present, the number of input and output tokens is also checked. In this article, I did not include any unexecuted answers or speed figures as results.

For access from another PC during the lab, use an SSH tunnel. Run the following command on the client PC, replacing user and gpu-host with the actual SSH account and server address.

ssh -L 18000:127.0.0.1:8000 user@gpu-host

From the PC that opened the tunnel, connect to http://127.0.0.1:18000/v1/models. When changing to a public service, configure TLS, authentication, and request restrictions separately. Simply clearing the 127.0.0.1: portion of the port does not complete the operational configuration.

AMD GPU: Switch to ROCm path

AMD checks amdgpu driver·ROCm and device delivery instead of nvidia-smi and NVIDIA Container Toolkit. The vLLM document specifies the MI200·MI300·MI350, RX 7900·RX 9000 series, and some Ryzen AI GPUs. Not all products are eligible even if they use the same Radeon name. (vLLM ROCm requirement)

vLLM official document AMD ROCm tab displays gfx code of supported GPU and ROCm version conditions
The AMD tab collates not only the product name but also the gfx code · 2026-10-22 Screen capture of the actual document. Source: vLLM project / Apache-2.0. This is not an inference execution result screen. I have cut out and marked only the parts to be read.

The confirmed build history of vllm/vllm-openai-rocm:v0.32.0 is based on ROCm 7.2.3. The OS table for those versions has Ubuntu 24.04.4 and Rocky Linux 9, but no Ubuntu 26.04. Therefore, the commands below do not lead to officially supported combinations in 26.04. To maintain 26.04, you must separately select a newer ROCm image/host driver combination for which support is specified. (ROCm 7.2.3 Compatibility Table by Version)

We also compare exact GPU, OS minor version, and kernel conditions in Ubuntu 24.04 and Rocky 9. In particular, you should not mix tables for Radeon and tables for Instinct. Also check to see if Rocky 9’s support footnotes are specific to specific Instinct products. OS support in the latest table is not retroactively applied to older images. (AMD Latest GPU/OS Compatibility Selection Table)

Once you have installed the correct host drivers and ROCm, first check your device and GPU. You should have /dev/kfd and /dev/dri, find the name gfx... in rocminfo corresponding to your GPU. To install the package, follow the procedure for the distribution/GPU selected in the AMD support table above.

ls -l /dev/kfd /dev/dri
rocminfo

If you used the same host for the NVIDIA exercise, first release port 8000 with sudo docker stop maruops-vllm. The following example targets a single AMD GPU lab machine with a verified support combination. The host GPU and image’s supported kernel targets must match.

VLLM_RENDER_GID=$(stat -c '%g' /dev/dri/renderD128)
VLLM_KFD_GID=$(stat -c '%g' /dev/kfd)
sudo docker volume create maruops-vllm-amd-hf-cache

sudo docker run -d --name maruops-vllm-amd \
  --device /dev/kfd --device /dev/dri \
  --group-add "$VLLM_RENDER_GID" --group-add "$VLLM_KFD_GID" \
  --shm-size=4g \
  -p 127.0.0.1:8000:8000 \
  -v maruops-vllm-amd-hf-cache:/root/.cache/huggingface \
  vllm/vllm-openai-rocm:v0.32.0 \
  --model Qwen/Qwen2.5-1.5B-Instruct \
  --served-model-name local-qwen \
  --host 0.0.0.0 --port 8000 \
  --dtype half \
  --max-model-len 2048 \
  --max-num-seqs 2 \
  --gpu-memory-utilization 0.80

sudo docker logs -f maruops-vllm-amd

renderD128 is an example device name. If the previous ls result is different, replace it with your GPU device. Pass the device’s numeric group ID so that access permissions can be matched even if the group name is different on the container and host. SYS_PTRACE and seccomp=unconfined from the official ROCm example were first excluded, and when a security policy error occurs, the necessary scope is determined by comparing the log and the official example. Once you’re ready, you can just use the previous curl request. (vLLM official ROCm image and execution example)

Intel GPU: Use separate XPU image

Intel uses an XPU backend. The validation hardware documentation for vLLM v0.32.0 shows Intel Arc Pro B-Series. This validation list should be read separately from the broader reference to Arc and data center GPUs in the installation documentation. This does not mean that all general Intel integrated graphics have been verified. (vLLM Intel Verification Hardware/Model List)

vLLM official Intel XPU tab showing Intel GPU support path and Python 3.12 condition for XPU kernel
Intel’s direct installation of Python is also subject to the version conditions of the XPU package · 2026-10-22 Screen capture of the actual document. Source: vLLM project / Apache-2.0. This is not an inference execution result screen. I have cut out and marked only the parts to be read.

For any OS among Rocky 9·Ubuntu 24.04·26.04, first check the supported combination of GPU model and OS·kernel·runtime in the Intel GPU driver installation document. Containers do not replace host kernel drivers. When installing Python directly, the Python 3.12 conditions for the

The following is a startup command to verify device access on a single Intel GPU lab host with the supported drivers installed. If there are any NVIDIA/AMD containers launched earlier, stop them and clear port 8000.

ls -l /dev/dri
VLLM_RENDER_GID=$(stat -c '%g' /dev/dri/renderD128)
sudo docker volume create maruops-vllm-intel-hf-cache

sudo docker run -d --name maruops-vllm-intel \
  --device /dev/dri:/dev/dri \
  --group-add "$VLLM_RENDER_GID" \
  --shm-size=4g \
  -p 127.0.0.1:8000:8000 \
  -v maruops-vllm-intel-hf-cache:/root/.cache/huggingface \
  vllm/vllm-openai-xpu:v0.32.0 \
  --model Qwen/Qwen2.5-1.5B-Instruct \
  --served-model-name local-qwen \
  --host 0.0.0.0 --port 8000 \
  --dtype half \
  --max-model-len 2048 \
  --max-num-seqs 2 \
  --gpu-memory-utilization 0.80

sudo docker logs -f maruops-vllm-intel

Verify that renderD128 identifies your GPU device and change it if necessary. The official XPU example includes --privileged, host networking and a /dev/dri/by-path mount. The example above starts with fewer privileges for basic access to one GPU; it has not been verified across all Intel environments. For device discovery or communication failures, compare the official XPU run options and driver documentation.

Order of adjustment when VRAM is low

When you upload a large model, if the GPU gives OOM instead of the answer, OOM is an abbreviation for Out Of Memory, . Here, rather than changing the options all at once, let’s break down which space is lacking. (Official memory saving method)

  1. Check other GPU activity: NVIDIA looks at used processes and remaining memory in nvidia-smi. Don’t arbitrarily kill other people’s processes.
  2. Reduction from model: Failure during weight loading may not be resolved by simply reducing the context length. Review smaller models or quantized models supported by your GPU.
  3. Context length reduction: If KV cache space is insufficient, reduce it as --max-model-len 1024, and also adjust the input + output of the request to that range.
  4. Reduce the number of concurrent executions:Start with --max-num-seqs 1 and check for single requests first.
  5. CUDA Graph Impact Isolation: Temporarily compares --enforce-eager when NVIDIA encounters memory issues during graph capture. This is not automatically a better setting as performance characteristics will vary.

Lowering --gpu-memory-utilization reduces the engine’s memory budget. It can leave room for other programs, but it can also reduce an already insufficient KV cache. Raising it to 0.99 without checking other users can conflict with display or other GPU workloads. The setting does not create additional VRAM.

Quantization is a way to express weights with a lower number of bits. The scope of support for formats such as AWQ, GPTQ, and FP8 varies depending on the GPU generation and backend. Rather than copying the --quantization value from the successful example for another card, check the vLLM Quantization Hardware Support Table.

Narrow down the cause to the location of the failure

Stopping point/symptomsThings to check firstNext check
Host nvidia-smi failedDriver module, reboot, Secure BootCurrent Kernel·DKMS·GPU passthrough
Host succeeds, GPU selection fails in DockerInstall toolkit and register Docker runtimesudo docker info, whether to restart after setting the runtime
Error that CUDA driver is out of dateCUDA and host drivers in selected imageCUDA 13 image conditions in this article, drivers supported by GPU
no kernel image·invalid device functionKernel support for GPU architectures and imagesNVIDIA Compute Capability or AMD gfx target
Download model 401·403Model access rights/license consent/tokenHugging Face’s actual model page
Only request connection failed/port conflictInitialization log/port occupancy/connection locationsudo docker ps -a, ss -ltn, SSH tunnel
API error saying model not foundWhether local-qwen alias matches or not/v1/models list and request JSON

Model access errors are different from GPU computation errors. If you change the public model in this article to a model that requires approval, check the token and consent status first. The actual token is managed so that it is not exposed to text, screenshots, or command history. When troubleshooting, look at the first error and the initialization log before it, not just the last line. (vLLM Troubleshooting Document)

Quit/restart and next experiment

To stop or restart the NVIDIA example server, use the following command: For AMD and Intel, replace them with the container name specified above. Stopping and deleting are different, and the model cache volume is not deleted with the command below.

# 서버 중지
sudo docker stop maruops-vllm

# 기존 컨테이너를 같은 설정으로 재시작
sudo docker start maruops-vllm

# 실행 옵션을 바꾸려면 중지 후 컨테이너를 지우고 새로 생성
sudo docker stop maruops-vllm
sudo docker rm maruops-vllm

After the first response, keep one question fixed and change context length, concurrency or model size one at a time. Record initial loading separately from response time on a ready server. Evaluate quality and speed separately, since the same input can still produce different answers.

The next experiment can be continued with Measure loading time, first response, and generation speed separately. Once your GPU has started taking orders, it’s time to see how busy it is and where it’s waiting.

References and image sources

Chapter 3 of the document screen was captured from the vLLM official site in an actual browser. The content of the document was not changed, and only the necessary areas were cut and marked. © vLLM contributors, Apache License 2.0. Original license copy is also provided. The photographer, original source, and terms of use of representative photos are indicated below the photo.