feat: add queue-aware adaptive scheduling

This commit is contained in:
CoolBoy
2026-08-04 20:22:08 +08:00
parent ccae7ff8f3
commit 882479e43e
12 changed files with 1586 additions and 95 deletions

View File

@@ -85,11 +85,18 @@ class ModelHubClient:
current: int = 1,
page_size: int = 50,
only_mine: bool = True,
begin_time: datetime | None = None,
end_time: datetime | None = None,
begin_time: datetime | str | None = None,
end_time: datetime | str | None = None,
gpu_type: str | None = None,
model_id: str | None = None,
status: str | None = None,
verify_result: int | None = None,
) -> dict[str, Any]:
def query_time(value: datetime | str | None) -> str | None:
if isinstance(value, str):
return value
return format_modelhub_datetime(value) if value else None
return self._request(
"GET",
"/api/adapt/task/page",
@@ -97,13 +104,44 @@ class ModelHubClient:
"current": current,
"pageSize": page_size,
"onlyMine": str(only_mine).lower(),
"beginTime": format_modelhub_datetime(begin_time) if begin_time else None,
"endTime": format_modelhub_datetime(end_time) if end_time else None,
"beginTime": query_time(begin_time),
"endTime": query_time(end_time),
"gpuType": gpu_type,
"modelId": model_id,
"status": status,
"verifyResult": verify_result,
},
)
def list_machine_info(self) -> list[dict[str, Any]]:
payload = self._request("GET", "/api/computility/power/machine/list/machine-info")
data = payload.get("data") or []
if not isinstance(data, list):
raise ModelHubAPIError("Machine info response is invalid", payload=payload)
return [item for item in data if isinstance(item, dict)]
def list_framework_stats(self, task_type: str, target_gpu: str) -> list[dict[str, Any]]:
payload = self._request(
"GET",
"/api/computility/driver/images/frameworks",
query={"taskType": task_type, "gpuTypeName": target_gpu},
)
data = payload.get("data") or []
if not isinstance(data, list):
raise ModelHubAPIError("Framework statistics response is invalid", payload=payload)
return [item for item in data if isinstance(item, dict)]
def get_build_config(self, task_type: str, target_gpu: str, framework: str) -> str:
payload = self._request(
"POST",
"/api/adapt/task/build-config",
query={"taskType": task_type, "gpuType": target_gpu, "framework": framework},
)
data = payload.get("data")
if not isinstance(data, str) or not data.strip():
raise ModelHubAPIError("Official build config response is invalid", payload=payload)
return data
def list_tasks(
self,
*,
@@ -747,6 +785,15 @@ class ModelHubClientPool:
"""Single-page task listing via the reader client (no fanout)."""
return self._reader.list_tasks_page(**kwargs)
def list_machine_info(self) -> list[dict[str, Any]]:
return self._reader.list_machine_info()
def list_framework_stats(self, task_type: str, target_gpu: str) -> list[dict[str, Any]]:
return self._reader.list_framework_stats(task_type, target_gpu)
def get_build_config(self, task_type: str, target_gpu: str, framework: str) -> str:
return self._reader.get_build_config(task_type, target_gpu, framework)
def find_recent_task_id(self, model_id: str, gpu_type: str, submitted_after: datetime) -> str | None:
for client in self.clients:
task_id = client.find_recent_task_id(model_id, gpu_type, submitted_after)