GPU Acceleration

Run GPU-accelerated workloads inside hardware-isolated microVMs. Enables Vulkan-based rendering, ML inference, and browser automation with access to the host GPU.

Self-hosted only

GPU acceleration works **only when you self-host smolvm on your own GPU hardware**. The hosted smolmachines cloud does **not** offer GPU machines β€” the cloud API has no `gpu` field, so `resources.gpu` is silently ignored there. Everything on this page assumes you are running smolvm on a host that has a physical GPU.

Quick Start

# Headless Chromium screenshot with GPU
smolvm machine run --gpu --net --image fedora:42 -- bash -c '
  dnf install -y chromium-headless mesa-vulkan-drivers vulkan-tools
  /usr/lib64/chromium-browser/headless_shell \
    --no-sandbox --screenshot=/tmp/shot.png \
    --window-size=1920,1080 https://example.com'

Enable GPU

CLI

smolvm machine run --gpu -- vulkaninfo
smolvm machine create --name my-vm --gpu --net

Smolfile

image = "fedora:42"
gpu = true
net = true
cpus = 4
memory = 4096

SDK

const machine = await Machine.create({
  name: 'gpu-workload',
  resources: {
    cpus: 4,
    memoryMb: 4096,
    gpu: true
  }
});
config = MachineConfig(
    name="gpu-workload",
    resources=ResourceSpec(
        cpus=4,
        memory_mb=4096,
        gpu=True
    )
)

HTTP API

curl -X POST http://localhost:8080/machines \
  -H 'Content-Type: application/json' \
  -d '{"name": "gpu-vm", "gpu": true, "network": true, "cpus": 4, "memoryMb": 4096}'

Packed Binary

GPU can be embedded in a .smolmachine:

# Smolfile for packing
image = "fedora:42"
gpu = true
smolvm pack create -s gpu.smolfile -o gpu-app
./gpu-app run -- vulkaninfo

Host Setup

macOS (Apple Silicon)

No host dependencies to install. virglrenderer and MoltenVK are bundled inside the smolvm distribution β€” GPU works out of the box.

The GPU pipeline on macOS: Guest Vulkan β†’ Venus β†’ MoltenVK β†’ Metal β†’ Apple GPU.

Guest requirement (macOS only): Standard Mesa has a page alignment bug on Apple Silicon. Install the patched Mesa inside Fedora guests:

dnf copr enable slp/mesa-libkrun-vulkan
dnf install --allowerasing mesa-vulkan-drivers

Linux

# Debian/Ubuntu
apt install virglrenderer0 mesa-vulkan-drivers

# Fedora
dnf install virglrenderer mesa-vulkan-drivers

No patched Mesa needed on Linux. Standard distro packages work.

Self-hosting on a cloud GPU instance

To get GPU inside smolvm on a cloud provider, you self-host smolvm on your own GPU instance (GCP, AWS, etc.) β€” this is not the hosted smolmachines cloud, which has no GPU. On a cloud GPU instance (NVIDIA T4, A100, L4, etc.):

# Host VM setup
apt install virglrenderer0 nvidia-driver-XXX

# Then use smolvm normally
smolvm machine run --gpu --net --image fedora -- vulkaninfo

Requirements:

  • GPU instance type (e.g., GCP n1-standard-4 + NVIDIA T4)
  • Nested virtualization enabled (GCP: --enable-nested-virtualization)
  • Host NVIDIA/AMD driver installed
  • virglrenderer installed on the host VM

On non-GPU cloud instances, --gpu has no effect β€” there’s no physical GPU to accelerate.

How It Works

Guest App (browser, ML framework)
    ↓
Mesa Venus driver (Vulkan inside VM)
    ↓  virtio-gpu transport
libkrun virtio-gpu device
    ↓
virglrenderer Venus (host)
    ↓
Host Vulkan driver
    ↓
Physical GPU (Apple Silicon / NVIDIA / AMD / Intel)

Each VM gets its own Vulkan instance and GPU context through Venus. However, multi-tenant GPU sharing is not security-validated: VRAM and GPU state may be observable across VMs that share the same physical GPU. Treat GPU access as single-tenant and experimental β€” run only workloads you trust on a shared GPU, and do not rely on the VM boundary to isolate GPU memory between tenants. (This is one reason the hosted smolmachines cloud does not offer GPU machines.)

Use Cases

Browser Automation (Playwright/Puppeteer)

# Start browser with Chrome DevTools Protocol
smolvm machine create --name browser --gpu --net --image fedora:42 -p 9222:9222
smolvm machine start --name browser
smolvm machine exec --name browser -- bash -c '
  /usr/lib64/chromium-browser/headless_shell \
    --no-sandbox --remote-debugging-port=9222 \
    --remote-debugging-address=0.0.0.0 about:blank'

# Connect Playwright from host
# ws://localhost:9222

Each browser session runs in its own hardware-isolated microVM with GPU acceleration. Stronger isolation than Docker containers.

ML Inference

smolvm machine run --gpu --net --image fedora:42 -- bash -c '
  pip install llama-cpp-python
  # llama.cpp uses Vulkan for GPU inference
  python3 -c "from llama_cpp import Llama; ..."'

Headless Screenshots

smolvm machine run --gpu --net --image fedora:42 -- bash -c '
  /usr/lib64/chromium-browser/headless_shell \
    --no-sandbox --screenshot=/tmp/shot.png \
    --window-size=1920,1080 https://example.com'

Limitations

  • macOS: Requires patched Mesa in the guest (16KB page alignment)
  • No native Metal/CUDA in the VM β€” GPU access is through Vulkan only
  • No Apple Neural Engine β€” ANE is not virtualizable
  • Video decode: Software only (no VA-API passthrough yet)

Resource Options

OptionTypeDefaultDescription
gpubooleanfalseEnable GPU acceleration

GPU is opt-in. Without --gpu, no GPU device is created and the VM runs with zero GPU overhead.