Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ docs/utils/webpack/node_modules

# Local superpowers planning artifacts (specs/plans/notes) — not repo content
docs/superpowers/
examples/
59 changes: 58 additions & 1 deletion apis/inferenceclasses/definition.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@ spec:
message: spec.provisioning.gke is required when spec.provisioning.provider is GKE.
- rule: "self.provider != 'EKS' || has(self.eks)"
message: spec.provisioning.eks is required when spec.provisioning.provider is EKS.
- rule: "self.provider != 'Nebius' || has(self.nebius)"
message: spec.provisioning.nebius is required when spec.provisioning.provider is Nebius.
properties:
provider:
type: string
enum: [GKE, EKS]
enum: [GKE, EKS, Nebius]
gke:
type: object
required: [machineType, accelerator]
Expand Down Expand Up @@ -110,6 +112,61 @@ spec:
type: integer
minimum: 1
maximum: 16
nebius:
type: object
required: [platform, preset, accelerator]
properties:
platform:
type: string
description: >-
Nebius compute platform (e.g. gpu-h100-sxm,
gpu-l40s-a). Together with preset this determines
the GPU model and count; the accelerator block
below is informational.
minLength: 1
maxLength: 63
preset:
type: string
description: >-
Resource preset within the platform (e.g.
8gpu-128vcpu-1600gb). Determines the GPU, vCPU,
and memory shape of each node.
minLength: 1
maxLength: 63
diskSizeGb:
type: integer
default: 100
minimum: 10
driversPreset:
type: string
default: cuda13.0
description: >-
NVIDIA driver stack mk8s preinstalls on the pool's
nodes. Valid values depend on the platform and
Kubernetes version. Defaults to the only preset
mk8s implements on the default Kubernetes version;
older presets remain for older versions.
enum: [cuda12, cuda12.4, cuda12.8, cuda13.0]
accelerator:
type: object
description: >-
GPU accelerator to attach when provisioning the node
group. Provisioning input only: the scheduler matches
against spec.devices, not this block.
required: [type, count]
properties:
type:
type: string
description: >-
GPU accelerator type (e.g. nvidia-h100,
nvidia-l40s). Informational - reported on
the consuming InferenceCluster's status.
minLength: 1
maxLength: 63
count:
type: integer
minimum: 1
maximum: 16
devices:
type: array
description: >-
Expand Down
85 changes: 71 additions & 14 deletions apis/inferenceclusters/definition.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,14 @@ spec:
message: spec.cluster.gke is required when spec.cluster.source is GKE.
- rule: "self.source != 'EKS' || has(self.eks)"
message: spec.cluster.eks is required when spec.cluster.source is EKS.
- rule: "self.source != 'Nebius' || has(self.nebius)"
message: spec.cluster.nebius is required when spec.cluster.source is Nebius.
properties:
source:
type: string
description: >-
Cluster provisioning method.
enum: [GKE, EKS, Existing]
enum: [GKE, EKS, Nebius, Existing]
existing:
type: object
description: >-
Expand Down Expand Up @@ -153,6 +155,23 @@ spec:
EKS cluster Kubernetes version. Defaults to a
version where Dynamic Resource Allocation (how GPUs
bind to pods) is generally available.
nebius:
type: object
description: >-
Nebius mk8s cluster configuration. Required when source
is Nebius; may be empty, since every field has a
default. The cluster is created in the project the
Nebius ClusterProviderConfig named default sets as its
projectID; Nebius projects are bound to a region, so
the project also determines where the cluster runs.
properties:
kubernetesVersion:
type: string
default: "1.34"
description: >-
mk8s cluster Kubernetes version. Defaults to a
version where Dynamic Resource Allocation (DRA)
is generally available.
nodePools:
type: array
description: >-
Expand Down Expand Up @@ -224,21 +243,59 @@ spec:
minLength: 4
maxLength: 64
fabric:
type: string
default: None
type: object
description: >-
High-performance node-to-node fabric for multi-node
engines. None uses standard VPC networking (ENA/TCP).
EFA attaches Elastic Fabric Adapter interfaces to each
node for GPUDirect RDMA across nodes, so a gang's
tensor-parallel traffic isn't capped by TCP. EKS only.
Only useful on EFA-capable instance types (e.g.
p5en.48xlarge). When any pool sets EFA, Modelplane
installs the EFA DRA driver on the cluster and the
gang's pods claim EFA devices alongside their GPUs.
enum:
- None
- EFA
engines, so a gang's tensor-parallel traffic isn't
capped by TCP. Omit for standard VPC networking.
x-kubernetes-validations:
- rule: "self.type != 'InfiniBand' || has(self.infiniband)"
message: fabric.infiniband is required when fabric.type is InfiniBand.
- rule: "!has(self.infiniband) || self.type == 'InfiniBand'"
message: fabric.infiniband is only valid when fabric.type is InfiniBand.
properties:
type:
type: string
default: None
description: >-
Fabric technology. None uses standard VPC
networking (TCP). EFA attaches Elastic Fabric
Adapter interfaces to each node for GPUDirect
RDMA across nodes; EKS only, and only useful on
EFA-capable instance types (e.g. p5en.48xlarge).
When any pool sets EFA, Modelplane installs the
EFA DRA driver on the cluster and the gang's pods
claim EFA devices alongside their GPUs.
InfiniBand places the pool's nodes in a GPU
cluster on a physical InfiniBand fabric for
GPUDirect RDMA across nodes; Nebius only, and
only useful on InfiniBand-capable platforms
(e.g. gpu-h100-sxm).
enum:
- None
- EFA
- InfiniBand
infiniband:
type: object
description: >-
InfiniBand fabric configuration. Required when
type is InfiniBand.
required:
- fabric
properties:
fabric:
type: string
description: >-
Identifier of the physical InfiniBand fabric
to join (e.g. fabric-2). This selects existing
Nebius infrastructure, not a name for a new
resource: fabrics are per-region - see
https://docs.nebius.com/compute/clusters/gpu#fabrics
- and multi-node GPU capacity is allocated on
specific fabrics, so use the fabric your
capacity lives on.
minLength: 1
maxLength: 63
status:
type: object
properties:
Expand Down
13 changes: 13 additions & 0 deletions apis/nebiusclusters/composition.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: nebiusclusters.infrastructure.modelplane.ai
spec:
compositeTypeRef:
apiVersion: infrastructure.modelplane.ai/v1alpha1
kind: NebiusCluster
mode: Pipeline
pipeline:
- functionRef:
name: modelplane-modelplanecompose-nebius-cluster
step: compose-nebius-cluster
Loading
Loading