1
- from fastapi import APIRouter
2
- from . models import GetGpusResponse
3
- router = APIRouter (
4
- prefix = '/gpus'
5
- )
1
+ import shutil
2
+ import subprocess
3
+ from fastapi import APIRouter , HTTPException
4
+ from pydantic import ValidationError
5
+ from . models import GetGpusResponse , GpuState
6
6
7
- @router .get ('/' )
7
+ router = APIRouter (prefix = "/gpus" )
8
+
9
+
10
+ @router .get ("/" )
8
11
async def get_gpus () -> GetGpusResponse :
9
- pass
12
+ """Get GPU information"""
13
+
14
+ nvidia_smi = shutil .which ("nvidia-smi" )
15
+ if nvidia_smi is None :
16
+ raise HTTPException (status_code = 500 , detail = "nvidia-smi not found" )
17
+
18
+ gpus : list [GpuState ] = []
19
+
20
+ try :
21
+ output = subprocess .check_output (
22
+ [nvidia_smi , "--query-gpu=index,utilization.gpu,power.draw,memory.total,memory.used" , "--format=csv,noheader,nounits" ],
23
+ encoding = "utf-8" ,
24
+ )
25
+ except subprocess .CalledProcessError as e :
26
+ raise HTTPException (status_code = 500 , detail = f"nvidia-smi failed: { e .output } " )
27
+
28
+ for line in output .splitlines ():
29
+ if not line or line .startswith ("#" ):
30
+ continue
31
+
32
+ try :
33
+ index , utilization , power , total , used = line .split ("," )
34
+ gpus .append (
35
+ GpuState (
36
+ id = index ,
37
+ total_vram = float (total ),
38
+ used_vram = float (used ),
39
+ utilization = float (utilization ),
40
+ power_consumption = float (power ),
41
+ )
42
+ )
43
+ except (ValidationError , ValueError ):
44
+ continue
45
+
46
+ return GetGpusResponse (gpus = gpus )
0 commit comments