Skip to content

About

A Kubernetes-native GPU platform for teams training large models. GPU-aware job admission, RDMA/NVLink and parallel-filesystem operators, quotas and budgets, and a multi-tenant GPU service with a price catalog and metering, so placement is handled by operators instead of hand-tuned per cluster.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

644 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Gryvia - GPU is the new CPU. Gryvia is its scheduler.

Gryvia

Stop babysitting GPUs. Start shipping models.

GPU is the new CPU. Gryvia is its scheduler.

One Kubernetes-native platform to train, fine-tune and serve on shared GPU clusters. Open source, Apache 2.0.

Place every job on the right GPU · Share them by the half, the MIG slice or the gang · Bill every team by the GPU-hour

Docs site License Kubernetes Stars

Quickstart Book a demo 30-day PoC

Quickstart · Website · Docs · Architecture · What works today · License


See it in 30 seconds

./scripts/kind-demo.sh                                   # whole platform on kind, demo data, dashboard, no GPUs needed
gryvia submit --image pytorch/pytorch --gpu 0.5 -- python train.py   # half a GPU, queued and placed for you
gryvia status                                            # what is running, where, and what it costs

Full walk-through: Quickstart.


Why Gryvia

Every GPU, placed right

The ai-operator filters and scores nodes on GPU type, RDMA/SR-IOV, NVLink/NVSwitch, free GPUs and memory, and writes its choice into the job status. One GryviaAIJob replaces hand-written Pods, Services and PVCs.
Scheduling guide

Your scheduler, your choice

Hand placement to KAI Scheduler (hierarchical queues, gangs, GPU fractions), use Kueue for gang admission and fair sharing, or the built-in native queue scheduler. Every tenant gets its own queue.
KAI Scheduler

Half a GPU, or a hundred

--gpu 0.5 shares one GPU between jobs, --mig 1g.10gb takes a MIG slice, and --nodes 4 starts a multi-node gang that runs all at once or not at all. Elastic jobs grow and shrink live.
Submit without YAML

Notebooks and IDEs, one click away

JupyterLab and VS Code (code-server) open in the browser through the gateway with a signed, per-workspace session. Idle workspaces pause themselves and keep their volume.
Workspaces

Run it as a GPU cloud

Tenants with isolated namespaces, quotas and budgets, a GPU SKU price catalog, per-job GPU-hour metering and estimate invoices, with provider and tenant roles in the gateway and dashboard.
GPU as a Service

From laptop to cluster in minutes

scripts/kind-demo.sh brings up the whole platform on kind with demo data, the dashboard and a notebook. One Helm chart installs it on your cluster; one script turns a fresh GPU server into a node.
Quickstart

Capabilities at a glance: Admit, Tenants, Nodes, Models


Quickstart

Requirements: a Kubernetes 1.30+ cluster and Helm for an install; kind (with a container runtime) and kubectl for the demo. The CLI builds with cargo build --release in cli/.

Try it in five minutes (no GPUs)

scripts/kind-demo.sh creates a local kind cluster, installs Gryvia, loads fictional demo data (GPU nodes, a quota, a job), port-forwards the dashboard in the background and opens https://localhost:8443:

git clone https://github.com/zyvorai/zyvor-gryvia && cd zyvor-gryvia
./scripts/kind-demo.sh                          # published images
GRYVIA_LOCAL_IMAGES=1 ./scripts/kind-demo.sh    # build from this checkout; adds a Jupyter workspace you open from the dashboard

Sign in as admin / Admin@321. That is a well-known lab key: set your own (auth.apiKey) before sharing an install; the sign-in page shows the kubectl command that reads the key in use. See Authentication and TLS.

Install on your cluster

helm install gryvia oci://ghcr.io/zyvorai/charts/gryvia \
  --namespace gryvia-system --create-namespace \
  --set auth.apiKey='a-long-random-secret'

The chart installs the CRDs, the GPU, AI workload and quota operators, the API gateway and the dashboard; the storage and network operators are off by default, and network intelligence is a separate chart. Then submit work with the CLI or kubectl:

gryvia -n gryvia-system submit --file examples/training/simple-pytorch-training.yaml
gryvia -n gryvia-system list jobs
gryvia status                      # platform report; `gryvia status <job-name>` for one job

The example requests storage from a StorageClass named vast-fast; edit or remove that line unless you have one.

Submit without YAML

The CLI writes Gryvia's custom resources, so everything it does is also plain YAML you can kubectl apply or keep in Git. Add --dry-run to gryvia submit to print the YAML it would create.

Task Command
Train on one GPU gryvia submit --image pytorch/pytorch --gpu 1 -- python train.py
Fractional GPU gryvia submit ... --gpu 0.5 [--gpu-memory 20480] [--isolation mps] (needs aiOperator.nativeQueueScheduler or aiOperator.kaiScheduler)
MIG slice gryvia submit ... --gpu 1 --mig 1g.10gb
Multi-node gryvia submit ... --gpu 8 --nodes 4
Team and queue -n team-a --queue team-a
Follow a job gryvia list jobs, gryvia status x, gryvia logs x -f, gryvia cancel x
Notebook gryvia workspace new nb --type jupyter --gpus 1, then gryvia workspace open nb or the dashboard's Workspaces page (needs workspaceProxy)

Pick your scheduler

Gryvia keeps the job lifecycle, tenants, metering and billing; the queueing engine is a Helm value.

Backend Turn it on What you get
Built-in placement default GPU-type-, interconnect- and capacity-aware node selection, recorded in the job status
KAI Scheduler aiOperator.kaiScheduler=true (+ quotaOperator.kaiIntegration=true) KAI places every pod: hierarchical queues, gangs, GPU fractions, a KAI queue per tenant, and KAI's reason in the job status while a job waits
Kueue kueue.enabled, aiOperator.kueueIntegration, quotaOperator.kueueIntegration Gang admission, quota borrowing, fair sharing and priority preemption, a ClusterQueue per tenant, and status.queueExplanation
Native queue scheduler aiOperator.nativeQueueScheduler=true Queue guarantees and ceilings with borrowing, gang admission, priority preemption and fractional-GPU accounting from one ConfigMap

How it fits together

Operators place the work; Kubernetes runs it

Architecture

 kubectl · gryvia CLI ─────────────────────────────┐
 Dashboard ──▶ API gateway (admin | tenant roles) ─┤──▶  Kubernetes API  (gryvia.io/v1alpha1 CRDs)
 Python SDK ──▶ API gateway      Go SDK ───────────┘            │
                                                                ▼
   Operators (helm/gryvia):  gpu · ai (+ admission webhook) · quota · [storage] · [network]
   Operator (helm/network-intelligence):  network-intelligence
   Scheduling backends (optional):  KAI Scheduler · Kueue · native queue gate
                                                                │
   GPU nodes:  NVIDIA GPU Operator (optional) ─▶ node labels ─▶ GryviaGpuNode (auto-registered)
   Observability:  DCGM exporter · optional eBPF collector DaemonSet · optional Netra flows

One cluster is managed per install; opt-in federation dispatches and fails over work across clusters through Kueue MultiKueue (federation failover).

Core components: six operators, 49 CRDs (43 with a runtime controller)

Reconciled by a runtime controller (43; some opt-in). GPU operator: GryviaHealthCheck (opt-in health/remediation flags), GryviaGpuNode (also auto-created from GPU feature-discovery labels), GryviaGpuMemoryOptimizer, GryviaGPUSharingPolicy (opt-in --enable-gpu-sharing, chart gpuOperator.gpuSharing: writes the node labels for time-slicing and MIG) · AI operator: GryviaAIJob, GryviaCheckpointGuard, GryviaLiveExperiment, GryviaModelLineage, GryviaTrainingProfiler, GryviaTrainingTimeMachine, and the ML kinds GryviaWorkspace, GryviaInferenceService, GryviaModelRegistry, GryviaWorkflow, GryviaAutoTuner, GryviaPriority, GryviaTemplate (on by default, --enable-ml-controllers), plus GryviaModelWatch (only with --enable-model-watch, see Model factory), GryviaVectorIndex (only with --enable-rag, see RAG), GryviaAgent (only with --enable-agents, see Agents), GryviaJobHook (only with --enable-job-hooks, see Job hooks), GryviaFederation (only with an administrator server allowlist), GryviaFabricSignal (only with --merge-fabric-signals) · Quota operator: GryviaQuota, GryviaTenant, GryviaUsageRecord, GryviaCostPredictor, GryviaBudget, GryviaChargeback, GryviaReservation (only with --enable-reservations) · Storage operator: GryviaStorage, GryviaDataset (only with --enable-datasets, see Datasets) · Network operator: GryviaNetwork · Network-intelligence operator: GryviaFlowPolicy, GryviaTrafficInsight, GryviaAutoPolicy, GryviaTraceSession, GryviaServiceGraph, GryviaNetworkAnomaly, GryviaSecurityPolicy, GryviaNetworkCost, GryviaTrainingInsight, GryviaInferenceInsight.

Data kinds without a controller (6). GryviaGpuSku, GryviaNetworkRate, GryviaNetworkUsageRecord and GryviaNodeFabric are catalog/telemetry data read by other controllers. GryviaLedgerEntry (appended by the quota-operator for each sealed usage record) and GryviaInvoice (written by the API gateway) are the opt-in immutable billing records, see Billing ledger. The legacy kinds GryviaAutoScaler, GryviaRetryPolicy, GryviaSLA, GryviaAudit, GryviaQuotaPolicy, GryviaMetric, GryviaBenchmark and GryviaDRTest, which never had a runtime, were removed; see the CHANGELOG for the upgrade steps.

Six operators: GPU (registers GryviaGpuNodes and reports readiness, driver/CUDA versions and DCGM health; NVIDIA's GPU Operator installs the drivers) · AI workload (GryviaAIJob placement and Job/StatefulSet workloads, the admission webhook, the ML controllers, the KAI, Kueue and native scheduling integrations, and the profiler, checkpoint-guard, live-experiment, lineage and time-machine CRDs) · Quota (quotas and per-namespace budgets, tenants, usage metering, node reservations, tenant RBAC and per-tenant Kueue or KAI queues) · Storage and Network (optional; parallel-filesystem CSI backends, and RDMA/SR-IOV device plugins with Multus attachments) · Network Intelligence (Cilium policy actions and insights; its own chart).

GPU-aware node selection: the AI operator lists nodes and their running GPU pods, filters out nodes that are not ready, have the wrong gryvia.io/gpu type, lack the requested RDMA/SR-IOV label or the free GPUs, then scores the rest (GPU type match +50, RDMA +30, NVSwitch +40 or NVLink +30 for multi-GPU jobs, +5 per free GPU, +1 per 10 GB of GPU memory, plus CPU/memory) and takes the top distributed.nodes. It records that choice in status.nodesAllocated; the pods are constrained by node selector and placed by the Kubernetes scheduler (or by KAI when it is on). Detail: Scheduling guide.

Gryvia vs plain Kubernetes + GPU Operator, in four rows

You want Plain Kubernetes Gryvia
To run a training job Write Pods, Services and PVCs One GryviaAIJob, or gryvia submit
Half a GPU or a gang Manual time-slicing, no gangs --gpu 0.5, --nodes 4
Fair queues per team Build it yourself KAI, Kueue or the native queue, one per tenant
To know who used what Not built in GPU-hour metering, budgets, estimate invoices
Gryvia vs Kubernetes + GPU Operator: the full table

Gryvia vs Kubernetes + GPU Operator: one job spec, GPU-aware, metered per tenant

Gryvia runs on Kubernetes and uses NVIDIA's GPU Operator for drivers; this is what it adds on top.

Capability Vanilla K8s + GPU Operator Gryvia
Job spec Pods, Jobs and StatefulSets you write One GryviaAIJob (type, gpus, gpuType, distributed); the operator creates the Indexed Job (or a StatefulSet for inference), the headless Service and the PVC
Job placement Default scheduler (first-fit) Nodes filtered and scored on GPU type, RDMA/SR-IOV, NVLink, free GPUs and memory; gangs and queues through KAI Scheduler, Kueue or the native queue gate
GPU sharing Whole GPUs, or manual time-slicing --gpu 0.5 through KAI GPU fractions or the native scheduler (MIG, MPS, DRA)
RDMA/NVLink setup Manual Network operator creates device plugins and Multus attachments
Storage for training Standard CSI Storage operator for VAST, Weka, DDN, Lustre and CephFS backends
GPU failure handling Manual intervention Per-GPU health on GryviaGpuNode (DCGM), quarantine and an escalating reset, driver-reload, reboot ladder
Cost tracking Not built in GPU-hour metering, SKU catalog, estimate invoices, per-team quotas and budgets, chargeback
Multi-tenancy Namespaces and your own RBAC GryviaTenant namespaces with quota, NetworkPolicy, per-tenant queues and RBAC
What's new

From the Unreleased section of the changelog; each entry there says how it was tested.

Feature What it does
KAI Scheduler backend aiOperator.kaiScheduler: KAI places every GryviaAIJob pod, with gangs, GPU fractions, a KAI queue per tenant and KAI's reason in the job status (guide)
Workspaces in the browser JupyterLab and VS Code through the gateway with signed launch links, per-workspace cookies and idle pause (guide)
Submit without YAML gryvia submit --image ... --gpu 0.5 -- cmd, plus gryvia workspace commands
Native queue scheduler --native-queue-scheduler: queue guarantees and ceilings with borrowing, atomic gang admission, priority preemption and fractional-GPU accounting, without Kueue (guide)
Workload intelligence Preflight, training evidence, useful-work cost, inference SLO recommendations, model benchmarking, capacity simulation and sovereign placement, with reviewed, reversible operations (guide)
Operator copilot Plain-language questions about jobs, models, datasets and lineage over read-only tools, with your own LLM key
Data catalog, lineage and audit Searchable GryviaDatasets with markings, dataset → job → model → service lineage, durable audit with CSV export
Scale to zero GryviaInferenceService.spec.scaleToZero, woken by the LLM gateway on the next request
Slurm on Kubernetes Slinky slurm-operator sub-chart, per-tenant partitions, gryvia submit --sbatch
GPU servers: drivers, CUDA and the device plugin

On a fresh Ubuntu 22.04/24.04 server with an NVIDIA GPU, one command installs k3s, Gryvia and NVIDIA's GPU Operator (driver, container toolkit, device plugin, DCGM):

sudo ./scripts/install-k3s-gpu.sh server

On an existing cluster, add --set nvidia.enabled=true to the Helm install. Gryvia then registers every GPU node automatically. It does not install a CNI, Multus or InfiniBand drivers. The checklist for a real machine is in docs/gpu-validation.md. Details: GPU nodes · Deployment guide · Complete deployment guide.

GPU as a Service

Run the cluster as a multi-tenant GPU cloud: the provider (API key or an OIDC admin group) creates GryviaTenants (namespace tenant-<name> with quota and optional NetworkPolicy) and publishes GryviaGpuSku prices; tenants sign in with OIDC and see only their own jobs, usage and catalog; the quota operator meters GPU hours into GryviaUsageRecords.

gryvia catalog                         # SKUs and hourly rates
gryvia tenant list
gryvia usage --group-by tenant
gryvia invoice --month 2026-09         # estimate: JSON or CSV, no payments

Also in the dashboard (Catalog, Usage, Tenants, Invoices) and under /api/skus, /api/tenants, /api/usage, /api/invoices. See GPU as a Service and GPU cloud platform.

Admission, recovery and inference serving

Optional strict tenant Kueue admission, distributed worker spreading and cooperative checkpoint hooks are described in docs/admission-recovery.md. Checkpoint hooks require a compatible trainer and persistent storage.

Explicit GPU/RPS autoscaling targets use custom per-pod HPA metrics, and opt-in Gateway API routing adds weighted canary traffic and accepted-route promotion gating. Opt-in Prometheus SLO analysis blocks promotion on missing telemetry and rolls back measured error-rate/p95 breaches. See docs/inference-serving.md.


What works today

Gryvia is alpha: APIs (gryvia.io/v1alpha1 CRDs) may change between releases and there is no upgrade guarantee yet. Everything below is the repository's own statement of what has been tested and where; the changelog and each guide say how. Nothing has run on GPU hardware yet: GPU paths are tested with simulated GPUs (fake-gpu-operator), fake clients and kind clusters, and the GPU validation checklist in docs/gpu-validation.md is still to be run on a real machine.

State What
Implemented and tested in CI (unit tests, chart rendering, a kind install with demo data read back through the API and CLI) The Helm chart; GPU, AI workload and quota operators; GryviaAIJob placement, run-to-completion Job and StatefulSet creation and the admission webhook; per-namespace quotas and budgets; tenants, SKU catalog, usage metering and estimate invoices; the API gateway with API-key, session and OIDC roles; the dashboard; the CLI
Run end to end on kind (simulated GPUs or CPU pods) KAI Scheduler backend (scripts/e2e-kai.sh: placement, half-GPU sharing, a 3-pod gang, tenant queues, KAI's reason in job status; KAI v0.18.5 and fake-gpu-operator); JupyterLab and code-server workspaces through the proxy (scripts/e2e-workspaces.py); Kueue gang admission and fair sharing (CPU pods); elastic resize and node-loss recovery of torchrun jobs (CPU); MultiKueue federation failover across three kind clusters
Implemented, unit tests or a CPU-only kind e2e; unverified on real clusters, GPUs and services The ML controllers for workspaces, inference services, the model registry, workflows and the auto tuner, and the opt-in model factory (no real fine-tune has run); the native queue scheduler (unit tests and a CPU-only k3s cluster); opt-in admission gate for quotas and hard budgets, node reservations, per-tenant RBAC and the signed invoice webhook; Prometheus metrics, dashboards, alerts and runbooks (never rendered against a live Prometheus or Grafana); the network-intelligence operator's collector and Netra sources (fake collector only); NVIDIA GPU Operator sub-chart, install-k3s-gpu.sh and node auto-registration (GPU-less k3s in CI only); storage and network operators (off by default); OIDC (fake identity provider only); GPU health remediation (fake runners); anything that needs GPUs, RDMA or a parallel filesystem
Experimental The eBPF collector, the 47 eBPF programs (verifier-load on x86_64 and arm64, attached on one Linux 7.0 x86_64 host only), fabric signals and the Flight Recorder; the network-intelligence operator
Removed legacy APIs SLA, audit, auto-scaler, retry policy, DR tests, benchmarks, metrics and quota policies (the CHANGELOG has the upgrade steps)
Not implemented Payments or tax invoices, a multi-cluster scheduler of its own (dispatch and failover go through Kueue MultiKueue), a mutating quota-pacing eBPF program

Performance. The only measured numbers are the eBPF collector's overhead on one shared x86 host (docs/ebpf-overhead.md). The following are design targets, to be validated with benchmarks/suite.yaml on real hardware before they are quoted as results:

Metric Target
Job scheduling latency < 500 ms (8-GPU job)
Fault recovery time < 60 s (node failure)
Concurrent queued jobs 10,000+

Security. Two roles in the API gateway: the API key and dashboard sessions are the provider admin; OIDC users (JWT validation, PKCE in the dashboard) are tenant users limited to the namespaces of their GryviaTenant. State-changing requests are audited. HTTPS for the dashboard and gateway, non-root read-only containers, per-tenant namespaces with ResourceQuotas, LimitRanges and optional NetworkPolicies, and cosign-signed release images and charts with SBOM and provenance. The eBPF collector is privileged, hostNetwork and off by default. Read the threat model and known limits before exposing an install beyond a lab, and report vulnerabilities privately as described there.

The CRD reference lists every kind with the operator that reconciles it (or none); platform completion lists the remaining integration and hardware limits.


Documentation

Topic Doc
Project website (overview, how it works, install) zyvorai.github.io/zyvor-gryvia
Full documentation index website/docs/intro.md
Quick start website/docs/getting-started/quickstart.md
Bare-metal / complete deployment DEPLOYMENT_GUIDE.md · COMPLETE_DEPLOYMENT_GUIDE.md
Authentication and TLS guides/AUTH_AND_TLS.md
Cluster setup (admin) admin-guide/cluster-setup.md
Job management (user) user-guide/jobs.md
Scheduling internals guides/SCHEDULING.md
KAI Scheduler, Kueue, native queue scheduler docs/kai-scheduler.md · docs/kueue-integration.md · docs/native-scheduler.md
Workspaces in the browser docs/workspaces.md
Storage & network operators guides/STORAGE_NETWORK_OPERATORS.md
Network Intelligence (NetPredator) guides/NETWORK_INTELLIGENCE.md
CLI guide guides/CLI_GUIDE.md
API reference developer-guide/api-reference.md
ML workflows, integrations, playbooks guides/ML_WORKFLOWS.md · guides/INTEGRATIONS.md · guides/OPERATIONAL_PLAYBOOKS.md
GPU as a Service (tenants, catalog, usage, invoices) guides/GPU_AS_A_SERVICE.md
Gryvia as a GPU cloud's platform docs/gpu-cloud-platform.md
GPU nodes (NVIDIA GPU Operator, k3s bootstrap) guides/GPU_NODES.md · docs/gpu-validation.md
NVIDIA one-click (RDMA, GDS, MIG, Network and NIM operators) guides/NVIDIA_ONE_CLICK.md
Admission and recovery docs/admission-recovery.md
Job submission preflight docs/job-submission-preflight.md
Inference serving docs/inference-serving.md
Operations (upgrade, uninstall, backup) guides/OPERATIONS.md
CRD reference (all kinds and their controllers) reference/crds.md
eBPF programs, collector, Flight Recorder ebpf/README.md · collector/README.md · docs/flight-recorder.md
Helm charts helm/gryvia · helm/network-intelligence
Advanced features, FAQ, roadmap guides/ADVANCED_FEATURES.md · guides/FAQ.md · guides/ROADMAP.md
Examples & tutorials examples/README.md

Part of the Zyvor stack

Product Role next to Gryvia
Gryvia Kubernetes GPU platform: GPU-aware admission, tenants, quotas, metering
Netra Real network flows for Gryvia's gateway and network-intelligence operator (apiGateway.netra.url)
Zyntra Sovereign AI OS loop: an agent proposes in Zyntra, a person approves, and Zyntra writes the GryviaPriority (docs/sovereign-aios.md)
Duvora DPU fleet control plane; pairs with Gryvia on accelerated clusters
Gryvia for Apple Silicon Native Swift Mac worker, SwiftUI desktop app and fleet console; runs independently of the Kubernetes GryviaAIJob path (validation notes)

→ zyvor.dev

Support

Free under Apache-2.0. If it helps you, you can donate any amount you like: https://rzp.io/rzp/utwdYh3. A donation is voluntary and supports development and maintenance. It is not a purchase: it buys no support, SLA, features, priority or license, and it is not tax-deductible (Zyvor AI Labs Private Limited is a company, not a charity). Zyvor Enterprise (supported releases, SLAs, a named contact and enterprise features) is separate: sales@zyvor.dev.

Contributing

We welcome contributions: see CONTRIBUTING.md.

License

Gryvia is free and open source under the Apache License 2.0. That does not change.

Zyvor Enterprise adds what production teams ask for: supported releases, deployment and upgrade guidance, priority incident triage, a named technical contact and 24x7 critical intake. Plans and terms: docs/SUBSCRIPTION-MODEL.md · Pricing · sales@zyvor.dev.


Every GPU busy. Every team billed. Five minutes to try.

Quickstart Book a demo 30-day PoC Pricing Contact sales Star on GitHub

About

A Kubernetes-native GPU platform for teams training large models. GPU-aware job admission, RDMA/NVLink and parallel-filesystem operators, quotas and budgets, and a multi-tenant GPU service with a price catalog and metering, so placement is handled by operators instead of hand-tuned per cluster.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages