Modelplane Modelplane docs
Version

Nemotron-3.5-Lightning

NVIDIA’s Nemotron-3.5-Lightning, an open 30B mixture-of-experts model with 3B active parameters built for the execution layer of long-running agents, served NVFP4 as a single Standalone vLLM engine on one H100 node on Nebius. The NVFP4 checkpoint (~20 GiB) fits a single GPU with headroom for the KV and Mamba caches, so the engine needs no tensor parallelism, no gang, and no prefill/decode disaggregation. Weights stage once to a ModelCache on a Nebius shared filesystem and mount at /mnt/models.

This recipe was run end to end on Nebius (eu-north): serving and tool calling validated on a single H100 node. nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-NVFP4 is a public repository (OpenMDW-1.1), so no Hugging Face token or Secret is needed. Apply the platform side first, then the ML side.

Platform

inference-class-nebius.yaml
# An InferenceClass describing a Nebius gpu-h100-sxm node with 1x NVIDIA
# H100 80GB. Nebius sizes nodes by platform + preset rather than an
# instance type; gpu-h100-sxm + 1gpu-16vcpu-200gb is one single-H100 SXM
# node. The devices block describes the hardware DRA-style; it is what
# the Nemotron ModelDeployment's nodeSelector matches on.
apiVersion: modelplane.ai/v1alpha1
kind: InferenceClass
metadata:
  name: nebius-h100-1x
spec:
  description: "Nebius gpu-h100-sxm, 1x NVIDIA H100 80GB"
  provisioning:
    provider: Nebius
    nebius:
      platform: gpu-h100-sxm
      preset: 1gpu-16vcpu-200gb
      diskSizeGb: 200
      driversPreset: cuda13.0
      accelerator:
        type: nvidia-h100
        count: 1
  devices:
  - name: gpu
    claim: DRA
    driver: gpu.nvidia.com
    deviceClassName: gpu.nvidia.com
    count: 1
    attributes:
      architecture: { string: Hopper }
      cudaComputeCapability: { version: "9.0.0" }
    capacity:
      # H100 80GB real usable VRAM (NVIDIA DRA driver), not nominal 80GB.
      memory: { value: "81559Mi" }
inference-cluster-nebius.yaml
# An InferenceCluster backed by a Nebius mk8s cluster with a single 1x
# H100 GPU node group. Modelplane provisions the full mk8s cluster (VPC,
# control plane, system + GPU node groups) and installs the inference
# stack. ModelCache RWX storage is auto-provisioned via a Nebius shared
# filesystem, so model-cache.yaml works unchanged.
#
# Auth is the Nebius ClusterProviderConfig named default (service-account
# key + projectID); Modelplane reuses that identity to reach the cluster.
#
# eu-north1 (Finland) keeps inference in the EU for data residency.
#
# Clean teardown - delete the ML resources first (they hold a usage on the
# cluster), then the cluster:
#   kubectl delete modeldeployment,modelservice,modelcache nemotron-lightning -n ml-team
#   kubectl delete inferencecluster nebius-eu-north --cascade=foreground
apiVersion: modelplane.ai/v1alpha1
kind: InferenceCluster
metadata:
  name: nebius-eu-north
  labels:
    modelplane.ai/region: eu-north
spec:
  cluster:
    source: Nebius
    nebius: {}

  nodePools:
  - name: gpu-h100
    className: nebius-h100-1x
    nodeCount: 1
    minNodeCount: 1
    maxNodeCount: 1

Deployment

model-cache.yaml
# The model weights, staged once per cluster on a Nebius shared filesystem
# (RWX) and mounted at /mnt/models in the serving pod, so the engine reads
# the NVFP4 weights (~20 GiB) locally instead of pulling them from Hugging
# Face on every start.
#
# nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-NVFP4 is a public repo, so no
# authSecret / HF token is needed. Add one only if you point this at a gated
# repo.
apiVersion: modelplane.ai/v1alpha1
kind: ModelCache
metadata:
  name: nemotron-lightning
  namespace: ml-team
spec:
  source: HuggingFace
  huggingFace:
    repo: nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-NVFP4
    sizeGiB: 50
model-deployment.yaml
# Nemotron-3.5-Lightning (30B total / 3B active MoE, hybrid
# Mamba-Transformer) served NVFP4 as a single Standalone vLLM engine on one
# H100 80GB, weights streamed from the shared ModelCache at /mnt/models. The
# NVFP4 checkpoint (~20 GiB) fits a single GPU with headroom for the KV and
# Mamba caches, so no tensor parallelism, no gang, and no prefill/decode
# disaggregation are needed.
#
# Notes on the engine flags:
#   Quantization needs no flag - the checkpoint auto-detects as
#     modelopt_mixed.
#   --moe-backend=humming and --linear-backend=humming are the cookbook's
#     base-configuration kernels.
#   The --mamba-* flags configure the hybrid model's state-space cache: the
#     flashinfer backend with an FP16 SSM cache, stochastic rounding, and
#     the cookbook's align mode and horizontal SSU algorithm.
#   --reasoning-parser=nemotron_v3 extracts the thinking block;
#     --tool-call-parser=qwen3_coder is the parser Nemotron ships with, and
#     --enable-auto-tool-choice turns on server-side tool selection.
apiVersion: modelplane.ai/v1alpha1
kind: ModelDeployment
metadata:
  name: nemotron-lightning
  namespace: ml-team
spec:
  replicas: 1
  template:
    spec:
      modelCacheRef:
        name: nemotron-lightning
      engines:
      - name: nemotron-lightning
        members:
        - role: Standalone
          nodeSelector:
            devices:
            - name: gpu
              count: 1
              selectors:
              - cel: |
                  device.driver == "gpu.nvidia.com" && device.capacity["gpu.nvidia.com"].memory.compareTo(quantity("79Gi")) >= 0
          template:
            spec:
              containers:
              - name: engine
                image: vllm/vllm-openai:v0.27.1
                command: ["vllm", "serve", "/mnt/models"]
                args:
                - --served-model-name=nemotron-3.5-lightning
                - --moe-backend=humming
                - --linear-backend=humming
                - --max-num-seqs=256
                - --max-model-len=65536
                - --max-num-batched-tokens=32768
                - --enable-prefix-caching
                - --async-scheduling
                - --mamba-backend=flashinfer
                - --mamba-ssm-cache-dtype=float16
                - --enable-mamba-cache-stochastic-rounding
                - --mamba-cache-philox-rounds=5
                - --mamba-cache-mode=align
                - --mamba-ssu-algorithm=horizontal
                - --reasoning-parser=nemotron_v3
                - --enable-auto-tool-choice
                - --tool-call-parser=qwen3_coder
model-service.yaml
# One OpenAI-compatible endpoint for the deployment. Read its public address:
#   kubectl get ms nemotron-lightning -n ml-team -o jsonpath='{.status.address}'
# then call it, e.g.:
#   curl "$ADDR/v1/chat/completions" -H 'Content-Type: application/json' \
#     -d '{"model":"nemotron-3.5-lightning","messages":[{"role":"user","content":"hello"}]}'
apiVersion: modelplane.ai/v1alpha1
kind: ModelService
metadata:
  name: nemotron-lightning
  namespace: ml-team
spec:
  endpoints:
  - selector:
      matchLabels:
        modelplane.ai/deployment: nemotron-lightning