nebari-dev / nebari-dev/llm-serving-pack
Design cloud-agnostic model storage for LLM serving
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 3
- Forks
- 3
- Avg merge
- 16h 31m
- Merged PRs (30d)
- 11
Description
Problem
Model downloads need persistent storage that is:
- Independent of node ephemeral disk size (models can be 5GB-200GB+)
- Persistent across pod restarts to avoid re-downloading
- Eventually multi-cloud (AWS, GCP, Azure, k3s)
Currently, emptyDir fails on nodes with limited disk (e.g. g6.xlarge has ~20GB). Longhorn PVCs are limited by node disk. We need storage backed by cloud-native block or file storage.
Current state
defaults.storage.storageClassNameis now configurable via Helm values (just merged)- Per-model
storageClassNameoverride already exists in the LLMModel CR - The operator applies the default when a model doesn't specify one
Storage options by cloud
| Provider | Block (RWO) | File (RWX) | Notes |
|---|---|---|---|
| AWS | EBS gp3 via CSI | EFS via CSI | EBS is AZ-locked, EFS is cross-AZ |
| GCP | Persistent Disk via CSI | Filestore via CSI | PD is zone-locked |
| Azure | Azure Disk via CSI | Azure Files via CSI | |
| k3s/bare metal | Longhorn, local-path | NFS | Need larger disks or dedicated storage nodes |
Design considerations
Single-replica models
Block storage (EBS, PD, Azure Disk) works well. Fast, cost-effective, and the PVC persists across pod restarts.
Multi-replica models sharing downloads
Block storage is RWO - each replica needs its own PVC and download. Options:
- File storage (RWX) - one download shared by all replicas. Slower but cheaper.
- ReadOnlyMany from snapshot - download once to RWO, snapshot, mount as ROX to replicas.
- OCI modelcar images - pre-package model into an OCI image, no download needed.
What nebari-infrastructure-core needs to provide
- EBS CSI driver addon enabled when GPU node groups exist (AWS)
- A StorageClass (e.g.
ebs-gp3) created and passed to the LLM serving pack - Equivalent for GCP/Azure when those providers are implemented
Open questions
- Should the LLM serving pack have an opinion about storage class, or always defer to what's configured?
- For multi-replica, should we default to RWX (simpler) or RWO-per-replica (faster)?
- Should model downloads be decoupled from pod lifecycle entirely (e.g., a separate download Job that populates the PVC)?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing the existing defaults.storage.storageClassName, the per-model storageClassName override in the LLMModel CR, and how the operator applies them. Compare the listed block, file, snapshot, and OCI options, then resolve the open questions and define what nebari-infrastructure-core and the LLM serving pack must provide for each supported cloud.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- aws, azure, gcp, helm, kubernetes
- Domain
- cloud, devops, infrastructure
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 30/100