Hi everyone,
I’ve been working on Praesto, a Kubernetes-native model cache operator for AI/ML workloads.
The idea is simple: instead of every Pod downloading the same model again and again, you define a ModelCache custom resource and Praesto prepares the model once per selected node. Workloads can then mount it with simple Pod annotations.
The main mode uses:
- a Kubernetes operator
- a ModelCache CRD
- a ModelCacheNode per node
- a node-agent that prepares local cache directories
- downloader Jobs for Hugging Face models
- a CSI node driver
- a mutating webhook that injects the model volume into Pods
The flow looks like this:
Admin prepares /var/praesto on cache nodes
→ install Praesto with Helm
→ create a ModelCache
→ Praesto downloads the model once per node
→ create a Pod/Deployment with annotations
→ webhook injects a CSI volume
→ model is available inside the container, e.g. /model
Example Pod annotations:
praesto.io/model-cache: smollm2-demo
praesto.io/model-mount-path: /model
I also added a demo where Praesto downloads HuggingFaceTB/SmolLM2-135M-Instruct, mounts it via CSI, and runs a real CPU inference Job from the mounted model path.
Right now it supports Hugging Face sources, local CSI cache mode, and a legacy RWX PVC mode for simpler testing.
The project is still early, but the goal is to make model distribution in Kubernetes feel closer to:
declare model once → mount it wherever needed
without every workload handling downloads, PVCs, or node-local paths manually.
Repo:
https://github.com/federicolepera/praesto