homelab: runpod-lazy v5.1 background catalog prefetch

dd7afa40571a8e5595fafd436b033e4cc1020086

permissionBRICK <40219477+permissionBRICK@users.noreply.github.com>

1 files changed, +27 -1Showing whitespace changes
homelab/runpod-lazy-proxy.py+27 -1
@@ -107,6 +107,27 @@ def needed_files(values):
107107 return files
108108
109109
110+def all_catalog_files():
111+ files = []
112+ for entry in load_catalog().get('models', []):
113+ files.extend(entry.get('files') or [])
114+ return files
115+
116+
117+def prefetch_rest(pod_id):
118+ """Queues every catalog file on the pod (background, non-priority) so later
119+ model switches find the files already on disk."""
120+ files = all_catalog_files()
121+ if not files:
122+ return
123+ try:
124+ res = mm_request(pod_id, 'POST', '/ensure', {'files': files}, timeout=20)
125+ if res.get('queued'):
126+ log('background prefetch queued:', ', '.join(res['queued']))
127+ except Exception:
128+ pass # old image without a model manager
129+
130+
110131def api(method, path, body=None):
111132 req = urllib.request.Request(
112133 f'https://rest.runpod.io/v1{path}',
@@ -251,7 +272,7 @@ def ensure_pod(values=None, wait=True):
251272 state['last'] = time.monotonic()
252273 if not ensured:
253274 try:
254275 mm_request(pod_id, 'POST', '/ensure', {'files': files, 'priority': True})
255276 ensured = True
256277 state['model'] = values_key(key_values(state['model']) | set(values))
257278 log(f'in-place ensure requested: {key}')
@@ -286,6 +307,11 @@ def ensure_pod(values=None, wait=True):
286307 state['phase'] = 'green'
287308 state['since'] = time.time()
288309 log('pod ready:', pod_id)
310+ # Green on the needed set; everything else in the catalog
311+ # downloads in the background for instant later switches.
312+ if state.get('prefetch_pod') != pod_id:
313+ state['prefetch_pod'] = pod_id
314+ threading.Thread(target=prefetch_rest, args=(pod_id,), daemon=True).start()
289315 return pod_id
290316 if state['phase'] == 'green':
291317 state['phase'] = 'orange' # in-place download in progress