KliqueContent HubReference architecturesDownload PDF
Klique AI · Reference architecture

GPU as a service reference architecture

This reference architecture covers the following scenario: an enterprise platform team offers GPUs as a service internally. Data scientists, engineers, application teams, portals and agents have several ways to provision compute resources, all through one Klique control plane, on the company's own estate with burst to the cloud. It shows the two kinds of GPU workload, how each is stood up on Kubernetes, bare-metal and HPC estates, the paths people and agents use to ask for them, and how every GPU-hour is governed, metered and attributed.

Control plane
One, on-prem, run by the platform team
GPU capacity
Kubernetes, bare-metal and HPC pools, cloud burst on demand
Provisioning
App catalogue, clone and enqueue, SDK, API, MCP, GitOps
Audience
IT architects and sales engineers

How to read the diagram: numbered badges are the provisioning paths; green lettered badges follow what happens underneath, which is the same for every path.

Provisioning paths1 · App cataloguesessions, endpoints, more2 · Clone and enqueuererun from the UI3 · SDK and CLIfrom a script or notebook4 · REST APIportals and automation5 · MCPtool calls from an agent6 · GitOpsa push runs CI, CI enqueuesKlique control planeAPI · MCPevery pathApp cataloguesessions, endpointsVaults · SSOidentity, secretsCompute resourceswhat users pickPolicies& schedulerExperimentscode, params, metricsPipelinesfan out stepsMeteringper user, per projectModel registryversions, lineageEnterprise GPU estate· on-prem, cloud burstPoolsKubernetesGPU nodesBare metalGPU hostsHPCSlurm, PBS, LSFCloud burston demandKlique worker daemon, in every poolpulls work, starts a pod, container or batch jobSessionnotebook, IDE, agentTasktraining, batchPipeline stepone per stepEndpointvLLM, NIM…logs, metrics,artifactsInternal routessessions, endpointsLLM gatewayone model endpointUSERS, IDES, APPS AND AGENTS123456ABCDEF
PathDetailLocationConnection
1App catalogueLaunch any catalogue app: a JupyterLab, VS Code or coding-agent session, a vLLM, SGLang or NIM endpoint, a Slurm or K3k cluster, a vector database, and more.UI → catalogueBrowser → API, HTTPS
2Clone and enqueueClone a past run, edit its parameters, enqueue it. Or let the task scheduler and trigger manager do it.UIBrowser → API, HTTPS
3SDK and CLITwo lines track a script; one more sends it to a GPU. clearml-task runs any repo without code changes.Laptop, notebook, CISDK → API, HTTPS
4REST APIEvery other path is built on it. Internal portals, platforms and automation call it directly, with a service user's keys.Portals, scriptsJSON over HTTPS
5MCPAn agent such as Claude Code calls the same platform as tools: list compute resources, enqueue, read metrics, launch apps.Agent → MCP serverMCP over HTTPS, OAuth
6GitOpsA push or pull request starts a CI job; the job runs the work on a compute resource and posts results back.CI runnerCI → API, keys in CI secrets
Underneath, for every path
AOne APIEvery path lands on the same API, under the caller's own identity, so the same policy applies.Control planeHTTPS
BAdmitThe request resolves to a compute resource; policy and the scheduler admit it to a pool.Control planeA scheduling decision
CPullThe Klique worker daemon in that pool pulls the work.GPU poolWorker daemon → control plane, outbound
DRunThe worker daemon starts the work: a pod on Kubernetes, a container on bare metal, a batch job on HPC (through the HPC submitter on the login node). The work is a session, a task, a pipeline step or an endpoint.GPU nodeStays on the node
ERecordLogs, metrics, artifacts and models flow back to experiment tracking and the model registry.Control planeOutbound HTTPS
FReachSessions and endpoints are reached through internal routes; model calls go through the LLM gateway.GatewaysHTTPS

Business value

01

Interactive and non-interactive GPU requests

Everything a GPU does here is one of two kinds. Non-interactive work runs to completion and gives the GPU back: training, fine-tuning, batch inference, optimisation trials, pipeline steps. Interactive work holds a GPU while someone, or something, uses it: notebooks, IDEs, coding agents, SSH sessions and model endpoints. Every provisioning path creates one or the other; the estate underneath decides how it is stood up.

Non-interactiveInteractive
ExamplesTraining, fine-tuning, batch inference, HPO trials, pipeline stepsJupyterLab, VS Code, SSH, coding agents, model endpoints
Created asA task on a compute resourceAn app instance, whose controller creates the session on a compute resource
LifecycleEnds when the run endsUntil stopped, or idle past its limit
Reached throughResults in the UI, API or MCPInternal routes (HTTPS or a TCP port), or an SSH tunnel from a laptop
On KubernetesA pod rendered from the compute resource's templateA session pod, with an internal ingress route
On bare metalA container on the GPUs the worker daemon picksA host-network container with an internal route
On HPCA batch job built from the compute resource's template (Slurm, PBS, LSF)Usually placed on a Kubernetes or bare-metal pool beside the cluster
Every estate, one control plane. The next sections show how each kind is stood up on Kubernetes, on bare metal and on an HPC cluster (Slurm, PBS or LSF), then how one estate mixes all three.
02

Kubernetes architecture

On Kubernetes the worker daemon runs as a controller in its own namespace, scoped to it by default. It never runs the work itself: for every task it renders a pod spec from a base template plus the compute resource's overrides, and the Kubernetes API does the rest. Whole GPUs, MIG slices and memory-capped fractions are all just different specs.

Klique control planeAPI · MCPevery pathApp cataloguesessions, endpointsApps worker daemonapp controllersComputeresourcesScheduler& policiesExperimentslogs, metricsMeteringper user, projectModel registryversionsworkloadKubernetes cluster· the platform team's ownUSERS, IDES, APPSKlique namespaceWorker daemonscoped to itPod templatesbase + overridesKubernetes APIcreates the podInternal routesingress, TCP portsGPU operatordevice plugin, MIGCSIvolumesGPU node poolGPU NODE · WHOLE GPUSTasktraining, batchPipeline stepone per steppersistent volumeGPU NODE · MIG OR FRACTIONSSessionJupyterLab, VS CodeSessioncoding agentpersistent volumeGPU NODE · WHOLE GPUSEndpointvLLM, NIMpersistent volume1234AB
The worker daemon generates the pod; Kubernetes runs it. Numbered: how any workload is stood up. Lettered: how people reach the interactive ones.
StepDetail
1PullThe worker daemon pulls work from its compute resources over an outbound connection.
2RenderBase pod template plus the compute resource's overrides: GPU limits, a MIG profile or a fraction label, node selectors, tolerations, volumes, priority.
3CreateThe Kubernetes API creates the pod on a GPU node; the GPU operator's device plugin hands it the GPUs. Persistent volumes come through CSI.
4ReportLogs, metrics and artifacts stream back to the control plane. A task pod exits when the run ends.
AReachUsers, IDEs and apps reach sessions and endpoints through internal routes: HTTPS through ingress, TCP through stream ports.
BRouteThe route reaches the session or endpoint pod, with access checked on every route. Idle sessions stop and free their GPU.
03

Bare-metal architecture

On bare metal, or VMs with GPU passthrough, the worker daemon runs on each GPU host, and how a task runs depends on the mode it was started in. In Docker mode it runs the task's container and executes the task inside it. In virtual environment mode it builds a Python environment on the host, installs the task's packages, clones the code, applies any uncommitted changes and runs the task natively, reusing cached environments between tasks. Either way the work lands on the GPUs the worker daemon assigns. One worker daemon can own all of a host's GPUs and hand each task the number its compute resource asks for, or one worker daemon can own each GPU set. Fractions need Docker mode: memory-capped containers, down to an eighth of a GPU.

Klique control planeAPI · MCPevery pathApp cataloguesessions, endpointsApps worker daemonapp controllersComputeresourcesScheduler& policiesExperimentslogs, metricsMeteringper user, projectModel registryversionsworkloadBare-metal GPU hosts· or VMs with GPU passthroughUSERS, IDES, LAPTOPSInternal routesDocker ComposeShared storageNFS, LustreRegistryimagesGPU HOST · ONE WORKER DAEMON, DYNAMIC GPUSWorker daemonDocker modeTask containerGPUs by sizeTask containerGPUs by sizeSessionhost networkone container per task; the worker daemon picks GPUs by the compute resource's sizeGPU HOST · ONE WORKER DAEMON PER GPU SETWorker daemonfirst GPU setContainertrainingWorker daemonsecond GPU setContainerendpointfractions: memory-capped containers, down to 1/8 of a GPUmountedinto containersFrom a laptopclearml-session opens an SSH tunnelto the session and forwards JupyterLabor VS Code to localhost123AB
Docker mode here: a container per task, on the GPUs the worker daemon picks. Sessions run on the host network and get internal routes from a router run on the same network with Docker Compose.
StepDetail
1PullThe worker daemon pulls work from the compute resources it serves, in priority order.
2StartIn Docker mode it starts a container with the task's image, packages and code; in virtual environment mode it builds the environment on the host and runs the task there. Either way on the assigned GPUs, with shared storage mounted.
3ReportLogs, metrics and artifacts stream back; the container or the process ends with the run.
AReachUsers reach sessions through internal routes, over HTTPS or a TCP port. One router serves each isolated network.
BRouteThe route reaches the session's address on the host. From a laptop, clearml-session tunnels over SSH instead.
04

HPC architecture: Slurm, PBS and LSF

On an HPC cluster, Klique works through the cluster's own scheduler rather than around it. A submitter on the cluster's login node turns each task into a batch job, using a batch template tied to the compute resource, and submits it with sbatch on Slurm. On Slurm, a user map (agent.slurm.user_map) submits each batch job as the user's own Linux account. PBS and LSF follow the same submitter pattern: a batch template, submitted with qsub or bsub. The scheduler places it; inside the job, a worker daemon builds the environment and runs the task, natively or in a Singularity, Apptainer or Pyxis/enroot container.

Klique control planeAPI · MCPevery pathApp cataloguesessions, endpointsApps worker daemonapp controllersComputeresourcesScheduler& policiesExperimentslogs, metricsMeteringper user, projectModel registryversionsworkloadHPC cluster· Slurm, PBS or LSFLOGIN OR SUBMIT NODEHPC submitterone per clusterBatch templatesdirectives per resourceUser mapSlurm: as the userSubmitsbatch, qsub, bsubHPC schedulerSlurm, PBS or LSFParallel filesystemLustre, GPFS, homeCompute nodesONE-NODE JOBWorker daemoninside the jobContainerSingularity, PyxisMULTI-NODE JOB · NODES FROM THE TASK'S PROPERTIESRank 0first nodeRank 1second nodeRank …more nodesRank Nlast nodeshared datanative, Singularity/Apptainer or Pyxis/enrootone batch job across several nodes; results report back the same wayNodes need only outbound access to the control plane. Interactive sessions usually run on a Kubernetes or bare-metal pool beside the cluster.12345
The cluster's scheduler; on Slurm, the user's own account. Task properties drive the template's directives, such as the node count. Interactive sessions and endpoints usually run on a Kubernetes or bare-metal pool beside the cluster.
StepDetail
1PullThe submitter on the login node pulls work from the compute resources mapped to it; one instance serves the cluster.
2RenderIt renders the batch script from the compute resource's template. On Slurm, the user map (agent.slurm.user_map) maps the Klique user to a Linux user.
3SubmitIt submits the batch job to the cluster's scheduler: sbatch on Slurm, as the mapped user; qsub on PBS; bsub on LSF.
4RunThe scheduler places the job on compute nodes; the worker daemon inside it runs the task on the parallel filesystem.
5ReportLogs, metrics and artifacts stream back over outbound connections, the same as on any other estate.
05

A mixed estate

Most estates are a mix: Kubernetes for sessions and endpoints, dedicated hosts for heavy training, an HPC cluster (Slurm, PBS or LSF) for multi-node runs, and the cloud for peaks. One control plane serves them all. Each compute resource lists its pools in order, so placement is a decision the platform team makes once. The Meta-Scheduler reference architecture shows how the scheduler places work across estates.

COMPUTE RESOURCE · WHAT USERS PICKFIRST POOLTHENWHYNotebook · a quarter GPUinteractiveKubernetes poolpods, MIG and fractionssessions need an internal route and a slice of a GPUServe · a few GPUsinteractive, long-runningKubernetes poolpods, MIG and fractionsCloud burston demand, when fullendpoints behind internal routes, extra capacity in the cloudTrain · whole hostsnon-interactiveBare-metal pooldedicated GPU hostsCloud burston demand, when fullwhole hosts, full bandwidth; burst when the hosts are busyTrain · multi-nodenon-interactiveHPC clusterSlurm, PBS or LSFHPC fabric and scheduler; on Slurm, the user's own accountBatch · CPUnon-interactiveKubernetes poolpods, MIG and fractionspreparation and pipeline controllers, no GPUEach compute resource's profile lists its pools in order. Reorder the list and every path follows: no change for users, code or agents.
The same compute resources, whatever sits behind them. Users choose a size; the platform team chooses where it runs.
06

The app catalogue, by how it uses a GPU

The catalogue is the fastest path: a form in the UI, and the same call in the API or over MCP. Grouped by how each app consumes a GPU, which is what matters for planning pools and policies:

Development and agents

Interactive sessions, until stopped or idle: JupyterLab, VS Code, SSH sessions, a remote desktop; Claude Code, Codex and OpenCode as coding agents, each in its own container. Often a slice of a GPU is plenty.

Model serving

Long-running endpoints: vLLM, SGLang and Llama.cpp model deployment, embedding models, NVIDIA NIM, NVIDIA Dynamo and NIM RAG, and an MCP server deployment.

Training and automation

Batch work, until done: the multi-node trainer, hyperparameter optimisation (one trial per task), the task scheduler and the trigger manager.

Platforms for teams

Clustering services: Slurm on Kubernetes for HPC-style teams, and K3k, Kubernetes in Kubernetes, for a virtual cluster with its own API.

Vector databases

Data alongside the models: Milvus and Qdrant sessions for retrieval and RAG, next to the models and the data.

App builders and custom apps

Apps for end users: Gradio and Streamlit launchers, the containerized application launcher, and any app the platform team uploads, such as AMD Inference Microservices.

Every launch form exports and imports as JSON, so a team's standard session or endpoint can be kept in git and relaunched the same way.

07

GPU provisioning paths

The catalogue suits point and click. The other paths suit code, portals, agents and pipelines. All of them create the same objects, so each lands on the same compute resources, policies and ledger.

PathWhoCreatesLifecycleReached throughTypical GPU size
1 · App catalogueAnyone, point and clickAn app instance: a session, endpoint, cluster…Until stopped or idleInternal routes, browser or laptopA slice or a whole GPU
2 · Clone and enqueueAnyone in the UIA cloned task, or scheduled runsUntil the run completesProgress in the UIWhole GPUs
3 · SDK and CLIDevelopersA tracked task, pipeline stepsUntil the run completesProgress in the UIA slice to many nodes
4 · REST APIPortals, platforms, automationAny of these objectsAs the call madeThe calling systemAs requested
5 · MCPAgents, on a user's behalfThe same tasks and app instancesAs the path it mirrorsThe agent's answerAs requested
6 · GitOpsCI pipelinesA task per push or pull requestUntil the run completesResults on the pull requestWhole GPUs

SDK and CLI

Two lines track a script; one more hands it to a GPU. clearml-task wraps any repository without changing its code.

from clearml import Task
task = Task.init(project_name='AI Engineering', task_name='train')
task.execute_remotely(queue_name='compute resource')

REST API

Every other path is built on the API. Internal portals, platforms and automation call it directly with a service user's keys: to create and enqueue tasks, launch catalogue apps, and read usage.

MCP

The platform ships an MCP server that fronts the API. Agents such as Claude Code connect to it over HTTPS with OAuth, and every tool call runs under the user's own identity and permissions: the same compute resources, policy and ledger as the UI. Registering it takes one command, claude mcp add --transport http klique https://<host>/mcp.

EngineerCoding agentKlique MCP serverControl planeWorker daemon · GPU pool“fine-tune on the new data, serve the best run”list_queuesclone_taskenqueue_tasksame API, same policy, the user's identitypulls the task, runs it on a GPUget_task_metric_valuesdownload_task_loglaunch_app_instance (vLLM)klique://serving/endpoints“done: endpoint, metrics, cost”the compute resources this user may usea past run, as a new draftonto a GPU compute resourcecompare runs on their metricsread why a run failedan app instance is a task tooa resource: the endpoint URL
An agent drives the whole loop. Every call is an ordinary platform action, tracked and metered like any other.
Tool groupExamplesWhat an agent does with them
Computelist_queuesFind the compute resources the user may use
Taskscreate_task, clone_task, enqueue_taskStart and rerun work on a compute resource
Resultsget_task_metric_values, download_task_logCompare runs on their metrics, read why one failed
Appslaunch_app_instance, the klique://apps resourceOpen a session or deploy an endpoint from the catalogue
Models and servinglist_models, get_serving_endpoint_metricsFind a registered model, track an endpoint's latency and GPU use

App launches can be refused, by an admin lock or the company's running-apps quota, and the agent gets a readable reason rather than a raw failure.

GitOps

Training belongs in the same loop as the code. A push or a pull request starts a CI job in GitHub Actions or GitLab CI; the job uses clearml-task or the SDK, with API keys held as CI secrets, to run the work on a compute resource. ClearML's own GitHub actions cover the common steps: train a model on a comment, post a run's metrics to the pull request, and flag a model that got worse.

Developerpush or PRGit repositorycode and configCI job · GitHub Actions, GitLab CIclearml-task or the SDK, with API keysheld as CI secretsClearML actions: train a model,post metrics, detect degradationCompute resourcesame policy as any pathTask on a GPUtracked like any runMetricscompared with the bestresults posted back to the pull requestEvent-driventhe trigger manager starts a run or pipeline when a dataset,model or task changes, is tagged, or a metric crosses a thresholdConfig as codeapp launch configurations export as JSON, and the platformdeploys from Helm values: both can live in git beside the code
Code, config and results in one place. The run is an ordinary task, so it is tracked, compared and metered like any other.
08

Experiments and pipelines

Whichever path starts a run, the platform records it the same way: the code and uncommitted changes, packages, parameters, console output, metrics, models and artifacts. That record makes any run reproducible and comparable, and it is the record an agent reads when it compares runs over MCP.

A pipeline chains runs. Each step names its own compute resource, so preparation lands on CPUs, training on many GPUs and evaluation on a slice, and outputs pass between steps as artifacts.

Dataset versionversioned, inthe data storePreparea CPU resourcetracked taskTrainmulti-node GPUstracked taskEvaluatea GPU slicetracked taskRegistermodel registrytracked taskServevLLM endpointtracked taskPipeline controller · itself a taskeach step names its own compute resource; outputs pass as artifacts; unchanged steps can be cachedEvery step records its code, parameters, metrics, artifacts and the dataset version it read, so the model traces back to its data.
A step per compute resource. The pipeline controller is a task too; it can run on a small services compute resource.
@PipelineDecorator.component(execution_queue='CPU')
def prepare(url): ...

@PipelineDecorator.component(execution_queue='multi-node GPUs')
def train(data): ...

@PipelineDecorator.component(execution_queue='GPU slice')
def evaluate(model): ...

Where the work lives

Task record

The repository, commit, uncommitted changes, parameters, packages and owner sit on the control plane.

Code

Cloned on the node from git, which needs a route and credentials, or baked into the image.

Secrets

Held in vaults on the control plane and injected when the work starts. Never in images or launch parameters.

Output destination

Defaults to the control plane's file server. Each project can point it at other storage, such as an in-region bucket or on-prem storage.

Datasets

Metadata on the control plane, files in storage.

Logs and metrics

Stream home to the control plane as the work runs. Secrets stay out of printed output.

09

Model serving

For most application teams, GPU as a service means a model endpoint. The serving apps (vLLM, SGLang and NVIDIA NIM) take a model from the registry or from Hugging Face by name, request the compute resource, and set the number of GPUs for tensor parallelism. The endpoint is OpenAI-compatible and sits behind an authenticated internal static route.

Putting that endpoint in front of callers follows the same order each time. The platform team creates a static route, a fixed address that outlives any one endpoint. The serving app is launched against that route, so the endpoint it stands up answers there. The route is then registered with the LLM gateway under an alias, and the alias is what applications call. The model behind the route can be swapped, and a second instance added for capacity, with client code left as it is.

Routing rules, guardrails, budgets and token metering sit behind that alias; the LLM Gateway and Tokenomics reference architecture covers them.

Model registrya ClearML modelHugging Facea model nameServing appvLLM, SGLang or NVIDIA NIMcompute resource, GPUs(tensor parallel), idle timeGPU poolEndpoint podone or several GPUsStatic routeOpenAI-compatibleLLM gatewayan alias, weightedApps, agentsone endpointEndpoint metricsrequests, latency, GPU useMeteringtokens per user, projectEndpoints stop when idle. More capacity means another instance behind the LLM gateway, which balances across weighted endpoints.
One endpoint for callers, many behind it. Put the LLM gateway in front: callers use an alias, and the platform team can add capacity or swap models without touching a client.
10

One governed path underneath

Whatever the path, the same controls apply, because every path ends at a compute resource:

  1. Compute resources are what people pick. Name them by what they give (a whole GPU, half a GPU, a node), never by where they run.
  2. Resource policies decide which teams may use which compute resources, and give each team a reservation, a limit and a priority. The Meta-Scheduler reference architecture covers how the scheduler applies them.
  3. Pools behind each compute resource are tried in order: on-prem first, cloud burst when full. The Cloud Autoscaler reference architecture shows how cloud capacity scales up from zero and back.
  4. Metering records every run with an owner and a project. Sessions and endpoints also report their runtime, and model calls report tokens.

Identity comes from the company's single sign-on: OIDC, SAML or LDAP. Agents over MCP act under their user's identity, and CI acts as its own service user, with the same policy and attribution as anyone else. Every task carries its owner.

One ledger, every path. Usage is attributed to the user and project that created the work, whether it came from a browser, a script, a CI job or an agent.
11

Design considerations

Decide these before opening up GPU access, rather than finding them out in production.

Offer sizes, not hardware

Publish a few compute resources per size (a whole GPU, half, a quarter, a node) and let each one's pool order decide where it runs.

Set idle limits

Sessions and endpoints hold GPUs until stopped. Idle limits on time, GPU and network activity hand them back.

One router per isolated network

Internal routes must reach the sessions they serve. Kubernetes gets one per namespace; each bare-metal network gets one run with Docker Compose.

Choose the bare-metal worker daemon model

One worker daemon per host with dynamic GPUs packs work by size; one worker daemon per GPU set is simpler and more predictable.

Map HPC users

On Slurm, batch jobs run as the user's own Linux account through the user map (agent.slurm.user_map). Unmapped users are refused unless a default account is set. PBS and LSF follow the same submitter pattern.

Keep sessions beside the cluster

Interactive work holds its allocation until idle. Run it on Kubernetes or bare metal and keep the HPC cluster for batch and multi-node.

Size the apps worker daemon

It runs every app's controller. It needs CPU, not GPUs, and should never be the bottleneck for a launch.

Pre-bake images

Cold starts are image pulls. Keep standard images in a local registry, the same on every estate.

Give CI its own identity

A service user with its own keys, held as CI secrets, scoped to the compute resources CI should use.

Agents act as the user

MCP calls use the user's identity and permissions. An agent can only do what its user can.

Plan endpoint capacity

Serving apps don't autoscale. Add instances behind the LLM gateway, which balances across weighted endpoints.

Multi-node needs wider rights

On Kubernetes, multi-node training needs cluster-wide worker daemon permissions. Grant them only where multi-node runs.

12

Glossary

Compute resource
What a user sends work to, from any path. It names a size, never a location. Under the hood it is a queue.
Profile
The allocation behind a compute resource (a fraction, a GPU or several GPUs, which can be specified by GPU memory) and its ordered pool links. Reordering the links changes placement for every path at once.
Resource pool
A set of nodes running worker daemons in one place: an on-prem Kubernetes cluster, bare-metal hosts, a Slurm partition or an autoscaled cloud account.
Resource policy
Which teams may use which compute resources, with a reservation, a limit and an execution priority.
Task
One tracked run: its code, environment, parameters, outputs and owner. Sessions and endpoints are tasks too.
App instance
A launched catalogue app, stored as a task of type application.
Apps worker daemon
Runs each app's controller, which creates the app's workload on the chosen compute resource.
Klique worker daemon
The worker in each pool that pulls work and stands it up: a pod on Kubernetes, a container on bare metal, a batch job on HPC.
Pod template
On Kubernetes, the base pod spec plus each compute resource's overrides, from which the worker daemon renders every pod.
Worker daemon on bare metal
The worker daemon process on a GPU host, running each task as a container in Docker mode or in a Python environment it builds on the host, on the GPUs it assigns.
HPC submitter
On an HPC cluster, the process on the login node that turns tasks into batch jobs for Slurm, PBS or LSF, one batch template per compute resource.
Internal routes
Authenticated routes to sessions and endpoints.
LLM gateway
One endpoint for model calls: aliases, routing, budgets and metering.
MCP server
The platform's Model Context Protocol server: the API as tools for agents, under the user's identity.
Pipeline
A chain of tasks, each on its own compute resource, run by a controller task.
Model registry
Registered models with their versions and the runs that produced them.