Skip to content

Commit 14101c5

Browse files
implement list gpus endpoint
1 parent 343bfa1 commit 14101c5

File tree

1 file changed

+44
-7
lines changed

1 file changed

+44
-7
lines changed
Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,46 @@
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
66

7-
@router.get('/')
7+
router = APIRouter(prefix="/gpus")
8+
9+
10+
@router.get("/")
811
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

Comments
 (0)