diff --git a/src/dstack/_internal/core/compatibility/gpus.py b/src/dstack/_internal/core/compatibility/gpus.py new file mode 100644 index 0000000000..3885001273 --- /dev/null +++ b/src/dstack/_internal/core/compatibility/gpus.py @@ -0,0 +1,13 @@ +from typing import Optional + +from dstack._internal.core.compatibility.runs import get_run_spec_excludes +from dstack._internal.core.models.common import IncludeExcludeDictType +from dstack._internal.server.schemas.gpus import ListGpusRequest + + +def get_list_gpus_excludes(request: ListGpusRequest) -> Optional[IncludeExcludeDictType]: + list_gpus_excludes: IncludeExcludeDictType = {} + run_spec_excludes = get_run_spec_excludes(request.run_spec) + if run_spec_excludes is not None: + list_gpus_excludes["run_spec"] = run_spec_excludes + return list_gpus_excludes diff --git a/src/dstack/_internal/server/services/gpus.py b/src/dstack/_internal/server/services/gpus.py index c2ddcd2fd8..c5eee4b65c 100644 --- a/src/dstack/_internal/server/services/gpus.py +++ b/src/dstack/_internal/server/services/gpus.py @@ -79,8 +79,8 @@ def _process_offers_into_backend_gpus( """Transforms raw offers into a structured list of BackendGpus, aggregating GPU info.""" backend_data: Dict[BackendType, Dict] = {} - for backend, offer in offers: - backend_type = backend.TYPE + for _, offer in offers: + backend_type = offer.backend if backend_type not in backend_data: backend_data[backend_type] = {"gpus": {}, "regions": set()} diff --git a/src/dstack/api/server/_gpus.py b/src/dstack/api/server/_gpus.py index b30ae8a894..f7bff4d49e 100644 --- a/src/dstack/api/server/_gpus.py +++ b/src/dstack/api/server/_gpus.py @@ -2,6 +2,7 @@ from pydantic import parse_obj_as +from dstack._internal.core.compatibility.gpus import get_list_gpus_excludes from dstack._internal.core.models.runs import RunSpec from dstack._internal.server.schemas.gpus import GpuGroup, ListGpusRequest, ListGpusResponse from dstack.api.server._group import APIClientGroup @@ -17,6 +18,6 @@ def list_gpus( body = ListGpusRequest(run_spec=run_spec, group_by=group_by) resp = self._request( f"/api/project/{project_name}/gpus/list", - body=body.json(), + body=body.json(exclude=get_list_gpus_excludes(body)), ) return parse_obj_as(ListGpusResponse, resp.json()).gpus