fix: recover eligible model GPU routes

This commit is contained in:
CoolBoy
2026-09-20 10:47:22 +08:00
parent 3077b169c5
commit 75c034d588
13 changed files with 436 additions and 29 deletions

View File

@@ -86,7 +86,7 @@ class HuggingFaceDiscovery:
self._model_last_modified_cache: OrderedDict[str, datetime | None] = OrderedDict()
self._model_last_modified_lock = threading.Lock()
self._model_page_cache: OrderedDict[
tuple[str, int, int], tuple[float, list[dict[str, Any]]]
tuple[str, str, int, int], tuple[float, list[dict[str, Any]]]
] = OrderedDict()
self._model_page_cache_ttl = max(
0.0,
@@ -108,6 +108,8 @@ class HuggingFaceDiscovery:
self._unsupported_task_filters: dict[str, float] = {}
self._model_card_cache: OrderedDict[str, dict[str, Any]] = OrderedDict()
self._model_card_lock = threading.Lock()
self._popular_page_lock = threading.Lock()
self._popular_page_cursor = 0
@staticmethod
def _remember_lru(cache: OrderedDict, key: Any, value: Any, limit: int) -> None:
@@ -124,6 +126,8 @@ class HuggingFaceDiscovery:
min_downloads: int,
updated_after=None,
read_concurrency: int = 1,
sort: str = "last_modified",
rotate_pages: bool = False,
) -> list[HFModelSummary]:
if not pipeline_tags:
return []
@@ -132,6 +136,17 @@ class HuggingFaceDiscovery:
del read_concurrency
per_tag_limit = limit if len(pipeline_tags) <= 1 else max(10, (limit + len(pipeline_tags) - 1) // len(pipeline_tags))
start_page = 1
if rotate_pages and sort == "downloads":
window_pages = max(1, min(60, (per_tag_limit + 49) // 50))
window_count = max(1, 60 // window_pages)
with self._popular_page_lock:
start_page = 1 + (self._popular_page_cursor % window_count) * window_pages
self._popular_page_cursor += 1
print(
f"[modelscope] popular_window=start_page:{start_page} pages:{window_pages}",
flush=True,
)
for pipeline_tag in pipeline_tags:
for model in self._query_recent_models(
@@ -139,6 +154,8 @@ class HuggingFaceDiscovery:
limit=per_tag_limit,
min_downloads=min_downloads,
updated_after=updated_after,
sort=sort,
start_page=start_page,
):
current = deduped.get(model.repo_id)
if current is None or (model.last_modified or parse_datetime("1970-01-01")) > (
@@ -156,6 +173,8 @@ class HuggingFaceDiscovery:
limit: int,
min_downloads: int,
updated_after=None,
sort: str = "last_modified",
start_page: int = 1,
) -> list[HFModelSummary]:
# ModelScope OpenAPI rejects values above 50 with InputParameterError.
page_size = min(max(1, limit), 50)
@@ -163,8 +182,9 @@ class HuggingFaceDiscovery:
task_tag = MODELSCOPE_TASK_TAGS.get(pipeline_tag, pipeline_tag)
filter_disabled = self._unsupported_task_filters.get(task_tag, 0.0) > time.monotonic()
models: list[HFModelSummary] = []
for page_number in range(1, (max_items + page_size - 1) // page_size + 1):
cache_key = ("*" if filter_disabled else task_tag, page_number, page_size)
page_count = (max_items + page_size - 1) // page_size
for page_number in range(start_page, min(61, start_page + page_count)):
cache_key = (sort, "*" if filter_disabled else task_tag, page_number, page_size)
cached = self._model_page_cache.get(cache_key)
if cached is not None and time.monotonic() - cached[0] < self._model_page_cache_ttl:
self._model_page_cache.move_to_end(cache_key)
@@ -177,7 +197,7 @@ class HuggingFaceDiscovery:
query = {
"page_number": page_number,
"page_size": page_size,
"sort": "last_modified",
"sort": sort,
}
if not filter_disabled:
query["filter.task"] = task_tag
@@ -201,6 +221,8 @@ class HuggingFaceDiscovery:
limit=limit,
min_downloads=min_downloads,
updated_after=updated_after,
sort=sort,
start_page=start_page,
)
print(
f"[modelscope] list_models_error task={task_tag} page={page_number} "