// components/GpuMonitor.tsx import React, { useState, useEffect } from 'react'; import { GPUApiResponse } from '@/types'; const GpuMonitor: React.FC = () => { const [gpuData, setGpuData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [lastUpdated, setLastUpdated] = useState(null); useEffect(() => { const fetchGpuInfo = async () => { try { const response = await fetch('/api/gpu'); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const data: GPUApiResponse = await response.json(); setGpuData(data); setLastUpdated(new Date()); setError(null); } catch (err) { setError(`Failed to fetch GPU data: ${err instanceof Error ? err.message : String(err)}`); } finally { setLoading(false); } }; // Fetch immediately on component mount fetchGpuInfo(); // Set up interval to fetch every 1 seconds const intervalId = setInterval(fetchGpuInfo, 1000); // Clean up interval on component unmount return () => clearInterval(intervalId); }, []); // Helper to format memory values const formatMemory = (mb: number): string => { if (mb >= 1024) { return `${(mb / 1024).toFixed(2)} GB`; } return `${mb} MB`; }; // Helper to determine background color based on utilization const getUtilizationColor = (percent: number): string => { if (percent < 30) return 'bg-green-100'; if (percent < 70) return 'bg-yellow-100'; return 'bg-red-100'; }; // Helper to determine text color based on utilization const getUtilizationTextColor = (percent: number): string => { if (percent < 30) return 'text-green-800'; if (percent < 70) return 'text-yellow-800'; return 'text-red-800'; }; // Helper to determine temperature color const getTemperatureColor = (temp: number): string => { if (temp < 50) return 'text-green-600'; if (temp < 80) return 'text-yellow-600'; return 'text-red-600'; }; if (loading) { return (
); } if (error) { return (
Error! {error}
); } if (!gpuData) { return (
No GPU data available.
); } if (!gpuData.hasNvidiaSmi) { return (
No NVIDIA GPUs detected! nvidia-smi is not available on this system. {gpuData.error &&

{gpuData.error}

}
); } if (gpuData.gpus.length === 0) { return (
No GPUs found, but nvidia-smi is available.
); } return (

GPU Monitor

Last updated: {lastUpdated?.toLocaleTimeString()}
{gpuData.gpus.map(gpu => (

{gpu.name}

GPU #{gpu.index}

Temperature:

{gpu.temperature}°C

GPU Utilization

{gpu.utilization.gpu}%

Memory Utilization

{formatMemory(gpu.memory.used)} / {formatMemory(gpu.memory.total)} {((gpu.memory.used / gpu.memory.total) * 100).toFixed(1)}%

Power

{gpu.power.draw.toFixed(1)}W / {gpu.power.limit.toFixed(1)}W

Memory Clock

{gpu.clocks.memory} MHz

Graphics Clock

{gpu.clocks.graphics} MHz

Driver Version

{gpu.driverVersion}

))}
); }; export default GpuMonitor;