henrygd/beszel · warning

no GPU found - see https://beszel.dev/guide/gpu

Error message

no GPU found - see https://beszel.dev/guide/gpu

What it means

The beszel agent's GPU manager returns this error when no GPU collector could be configured or started. It is thrown from NewGPUManager when the system exposes no GPU capabilities the agent can use, and the message points to the beszel GPU setup guide because resolution almost always requires installing drivers or setting GPU_COLLECTOR.

Source

Thrown at agent/gpu.go:778

	gm.GpuDataMap = make(map[string]*system.GPUData)

	// Jetson devices should always use tegrastats (ignore GPU_COLLECTOR).
	if caps.hasTegrastats {
		gm.startTegraStatsCollector("3700")
		return &gm, nil
	}

	// Respect explicit collector selection before capability auto-detection.
	if collectorConfig, ok := utils.GetEnv("GPU_COLLECTOR"); ok && strings.TrimSpace(collectorConfig) != "" {
		priorities := parseCollectorPriority(collectorConfig)
		if gm.startCollectorsByPriority(priorities, caps) == 0 {
			return nil, fmt.Errorf("no configured GPU collectors are available")
		}
		return &gm, nil
	}

	if !hasAnyGpuCollector(caps) {
		return nil, fmt.Errorf(noGPUFoundMsg)
	}

	// auto-detect and start collectors when GPU_COLLECTOR is unset.
	if gm.startCollectorsByPriority(gm.resolveLegacyCollectorPriority(caps), caps) == 0 {
		return nil, fmt.Errorf(noGPUFoundMsg)
	}

	return &gm, nil
}

View on GitHub (pinned to b38fb7dafa)

Solutions

  1. Install vendor drivers so a collector is detectable (NVIDIA driver/NVML, Intel i915/xe sysfs, AMD).
  2. Set GPU_COLLECTOR env var explicitly to a supported collector (e.g. nvml) to bypass auto-detection.
  3. Verify the GPU is visible to the container/VM (device passthrough, /sys/class/drm mounted).
  4. If the host genuinely has no GPU, remove GPU monitoring expectations or ignore the error; agent runs without GPU stats.
  5. Consult https://beszel.dev/guide/gpu for supported collectors and setup.

Example fix

// before (docker run without device access)
docker run beszel/agent
// after
docker run --gpus all beszel/agent
Defensive patterns

Strategy: fallback

Validate before calling

// on the host, before relying on GPU stats:
which nvidia-smi || ls /sys/class/drm/card0/device  # confirm GPU visible
GPU_COLLECTOR=nvml beszel-agent  # force a collector explicitly

Try / catch

gm, err := NewGPUManager(...)
if err != nil && strings.Contains(err.Error(), "no GPU found") {
    slog.Warn("GPU monitoring disabled; continuing without GPU stats")
    gm = nil
}

Prevention

When it happens

Trigger: Called via NewGPUManager when hasAnyGpuCollector(caps) is false (no collector is usable on this host), or when GPU_COLLECTOR is unset and the auto-detection path startCollectorsByPriority(resolveLegacyCollectorPriority(caps), caps) starts 0 collectors.

Common situations: Running the agent on a machine with no GPU (VMs, containers without /dev/dri, cloud instances without GPU passthrough); NVIDIA drivers or NVML library missing so NVML collector can't load; missing intel-gpu-tools/sysfs access; GPUs hidden by cgroup device restrictions in Docker.

Related errors


AI-assisted analysis of henrygd/beszel@b38fb7dafa (2026-08-31). Data as JSON: /api/errors/4dd9ed63b6d30f8e. Report an issue: GitHub.