nebari-dev / nebari-dev/llm-serving-pack

Design cloud-agnostic model storage for LLM serving

Open
#42 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

priority: low 🌱 type: enhancement 💅🏼
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.storageClassName is now configurable via Helm values (just merged)
  • Per-model storageClassName override 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:

  1. File storage (RWX) - one download shared by all replicas. Slower but cheaper.
  2. ReadOnlyMany from snapshot - download once to RWO, snapshot, mount as ROX to replicas.
  3. 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.