You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Allow a Model to be prefetched (downloaded into a cache) on declaration, independent of any InferenceService. Today a Model with a remote source (https://…, hf://…) is only a declaration: nothing is fetched until an InferenceService serving it spins up a model-downloader init container. A Model with no serving workload sits Ready having downloaded nothing.
Problem Statement
As an operator, I want to declare a Model and have its artifact pulled to the node cache ahead of time, so that the first InferenceService serves immediately and I can stage/validate large GGUFs without standing up a serving pod.
Two concrete pain points:
Surprise:kubectl apply a Model with a HuggingFace URL, see it go Ready, assume it's cached — but it isn't. The download only happens lazily at first serve.
No first-class staging: prefetching a 20–30 GB GGUF today requires hand-rolling a download Job + PVC and switching the source to pvc://… (this is how every Strix/AMD model is staged). That's exactly the manual loader-Job dance the operator could own.
Proposed Solution
A prefetch/refresh switch on Model that makes the operator run a download Job (the same init-container logic, hoisted to a standalone Job) into the model cache when the Model is created/updated, and reflect progress in status.
Then status.phase: Cached is a real readiness signal, and an InferenceService referencing it serves with a cache hit.
Alternatives Considered
Status quo (manual loader Job + pvc://): works but is undocumented tribal knowledge and easy to get wrong (PVC sizing, file layout, node placement, taint tolerations).
Eager-by-default: make every remote Model prefetch automatically. Simpler API but pulls artifacts you may never serve; an opt-in prefetch field is safer.
Additional Context
Download logic today lives in the InferenceService init container (internal/controller/model_storage.go, model-downloader), keyed off the serving pod — there is no Model-level download path.
Feature Description
Allow a
Modelto be prefetched (downloaded into a cache) on declaration, independent of anyInferenceService. Today aModelwith a remote source (https://…,hf://…) is only a declaration: nothing is fetched until anInferenceServiceserving it spins up amodel-downloaderinit container. AModelwith no serving workload sitsReadyhaving downloaded nothing.Problem Statement
Two concrete pain points:
kubectl applyaModelwith a HuggingFace URL, see it goReady, assume it's cached — but it isn't. The download only happens lazily at first serve.Job+ PVC and switching the source topvc://…(this is how every Strix/AMD model is staged). That's exactly the manual loader-Job dance the operator could own.Proposed Solution
A prefetch/refresh switch on
Modelthat makes the operator run a download Job (the same init-container logic, hoisted to a standalone Job) into the model cache when theModelis created/updated, and reflect progress instatus.Example YAML:
Then
status.phase: Cachedis a real readiness signal, and an InferenceService referencing it serves with a cache hit.Alternatives Considered
pvc://): works but is undocumented tribal knowledge and easy to get wrong (PVC sizing, file layout, node placement, taint tolerations).Modelprefetch automatically. Simpler API but pulls artifacts you may never serve; an opt-inprefetchfield is safer.Additional Context
internal/controller/model_storage.go,model-downloader), keyed off the serving pod — there is no Model-level download path.devic.es/dri-render-tainted node), so prefetch + a properly-tolerated download Job would also be the natural place to fix AMD staging.curlimages/curlJob (with the GPU-taint toleration) downloading into a pre-bound PVC, then apvc://source.Priority
Willingness to Contribute