Large-Scale GPU Infrastructure for Neural Web Search Training

exa.ai · Tech · 2025 · source Agentic: no · promotional bias: low · source-backed · extracted with prompt 0.5.6 (schema v2)

Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.

Problem

Domain: GPU infrastructure for neural search model training

Exa needed a repeatable GPU infrastructure stack that could turn bare-metal H200 and A100 clusters into reliable training and batch-processing capacity for neural web retrieval. The platform had to support embedding billions of pages, reranker training, checkpoint caching with S3 backups, concurrent ML workflows, multi-node PyTorch jobs, cloud bursting, developer debugging, priority scheduling, lineage, and reproducible environments without manual GPU juggling.

Constraints:

Architecture

Exa built Hephaestus, a five-layer cluster stack around Pulumi, Ansible/Kubespray, NVIDIA GPU and Network Operators, Alluxio, and Flyte. Pulumi provides typed infrastructure-as-code and orchestrates bare-metal and cloud resources. Ansible/Kubespray prepares servers and joins them into Kubernetes. NVIDIA operators install drivers, CUDA, container runtimes, device plugins, GPUDirect RDMA, RoCE, and metrics. Alluxio turns the fleet's NVMe into a distributed cache with S3 as the authority. Flyte schedules code-first ML workflows, multi-node PyTorch/MPI jobs, Ray/KubeRay batch jobs, cloud burst queues, checkpoint/resume, task caching, lineage, priority queues, developer pods, log routing, metrics, and artifact storage.

Diagram confidence: reconstructed (reconstructed from prose).

flowchart LR
  a100["A100 cluster"] --> k8s["Kubernetes fleet"]
  h200["H200 Exacluster"] --> k8s
  pulumi["Pulumi infrastructure code"] --> ansible["Ansible Kubespray automation"]
  ansible --> k8s
  k8s --> nvidia["NVIDIA operators"]
  k8s --> flyte["Flyte workflow platform"]
  k8s --> alluxio["Alluxio cache"]
  alluxio --> s3["S3 durable store"]
  flyte --> alluxio
  flyte --> s3
  flyte --> cloud["Cloud burst queues"]
  nvidia --> observability["Prometheus and Loki observability"]
  flyte --> observability
  pulumi --> cloud
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
A100 cluster Original 10-node cluster with 80 A100 GPUs used for neural retrieval work before the Exacluster expansion. Kubernetes fleet, Flyte workflow platform, Alluxio cache
H200 Exacluster New 18-node H200 fleet providing the larger compute pool for next-generation search-model training. Kubernetes fleet, NVIDIA operators, Alluxio cache, Flyte workflow platform
Pulumi infrastructure code Typed Python infrastructure-as-code layer that produces diffs, applies changes, rolls back, and orchestrates Ansible/Kubespray. Ansible Kubespray automation, Kubernetes fleet, Cloud burst queues
Ansible Kubespray automation Bare-metal build automation for BIOS, storage, OS, packages, kernels, Kubernetes components, CNI, labels, and node health. Pulumi infrastructure code, Kubernetes fleet
Kubernetes fleet Unified control plane for the bare-metal GPU nodes and higher-level ML services. A100 cluster, H200 Exacluster, NVIDIA operators, Flyte workflow platform, Alluxio cache
NVIDIA operators GPU and network operators managing drivers, CUDA, runtime components, device plugins, MIG, GPUDirect RDMA, RoCE, and DCGM metrics. Kubernetes fleet, H200 Exacluster, Prometheus and Loki observability
Alluxio cache Distributed NVMe cache exposing S3-compatible access while keeping S3 as durable source of truth. Kubernetes fleet, S3 durable store, Flyte workflow platform
S3 durable store Authoritative storage for datasets, checkpoints, and artifacts with Alluxio caching in front. Alluxio cache, Flyte workflow platform
Flyte workflow platform Code-first workflow scheduler for multi-node GPU jobs, batch jobs, cloud burst, checkpointing, caching, lineage, priority queues, and developer pods. Kubernetes fleet, Alluxio cache, S3 durable store, Cloud burst queues, Prometheus and Loki observability
Cloud burst queues Execution queues that let the same Flyte project target on-prem or cloud GPUs, including spot capacity. Flyte workflow platform, Pulumi infrastructure code
Prometheus and Loki observability Metrics and log backends receiving Flyte, GPU, network, and workflow observability signals. NVIDIA operators, Flyte workflow platform

Data flow

Pulumi provisions infrastructure and runs Ansible/Kubespray to transform powered-on bare-metal servers into Kubernetes nodes. NVIDIA operators install and maintain the GPU/network runtime layer. Training data and checkpoints are addressed through S3 URLs; Alluxio serves hot objects from distributed NVMe and flushes or fetches to S3 as needed. Flyte registers Docker-image, requirements, and source-code-hashed tasks, then schedules workflows onto on-prem or cloud queues with topology-aware multi-node placement. Logs route to Loki, metrics to Prometheus, artifacts to S3 with Alluxio caching, and lineage links inputs, outputs, and exact code versions.

4 supporting quotes
“Pulumi provisions everything → Ansible/Kubespray lays kube-roots → NVIDIA operators light up the accelerators → Alluxio feeds them at warp speed → Flyte keeps the assembly line humming.”article, stated
“Existing code keeps its S3 URLs; no refactor needed.”article, stated
“Each registration hashes the Docker image, requirements, and source code; every run is traceable and re-runnable.”article, stated
“Flyte orchestrates node affinity, GPU topology, log routing to Loki, metrics to Prometheus, and artifact storage on S3”article, stated

Why this architecture

Exa built a Kubernetes-centered, code-first stack because the team needed one repeatable path from bare metal to production ML workflows, not ad-hoc scripts or manual GPU scheduling. Pulumi and Kubespray make provisioning auditable and reproducible; NVIDIA operators prevent node drift; Alluxio keeps hot training data local while retaining S3 durability; and Flyte matched the full workflow requirement list, including multi-node training, cloud burst, checkpoint/resume, lineage, and priority queues.

4 supporting quotes
“Managing 28 bare-metal nodes, high-speed networks, and core services requires a repeatable process—not ad-hoc scripts.”article, stated
“no manual SSH sessions, no node-specific scripts.”article, stated
“The result is a unified, high-bandwidth data layer that lets GPUs stream training data at aggregate local‑disk speeds”article, stated
“Flyte was the only one that covered the full list without extensive custom work.”article, stated

Models used: retrieval models · reranker · 7B parameter pre-train · PyTorch DDP · PyTorchJob · MPIJob · Ray · KubeRay · Flyte

Scale

6.4 TB

20 TB

26.4 TB"

— article, stated

80 TB

270 TB

350 TB"

— article, stated

Alternatives considered (roads not taken)

Manage cluster setup with ad-hoc scripts

Rejected because: Exa needed a repeatable, auditable process for 28 bare-metal nodes, high-speed networks, and core services.

“requires a repeatable process—not ad-hoc scripts.”article, stated
“Using Pulumi keeps the system consistent, auditable, and straightforward to evolve”article, stated

Manually manage GPU and network drivers on each node

Rejected because: NVIDIA operators provide uniform driver, CUDA, runtime, GPUDirect, RoCE, and metrics management without manual SSH or node-specific scripts.

“NVIDIA's Kubernetes operators give us a clean, uniform way to manage every accelerator and NIC in the fleet”article, stated
“no manual SSH sessions, no node-specific scripts.”article, stated

Serve all training data directly from S3

Rejected because: Alluxio caches hot data on local NVMe to avoid upload/download bottlenecks and egress costs while preserving S3 as source of truth.

“Alluxio first looks for the object in its distributed NVMe cache.”article, stated
“Hot data stays on-prem, cutting on egress bills.”article, stated

Use Kubeflow, Airflow, Prefect, Dagster, or similar schedulers

Rejected because: Exa says Flyte was the only evaluated framework covering their full workflow list without extensive custom work.

“We evaluated several frameworks—Kubeflow, Airflow, Prefect, Dagster, etc”article, stated
“Flyte was the only one that covered the full list without extensive custom work.”article, stated

Patterns

durable-execution (workflow)

Flyte provides checkpointing, partial-run resume, task caching, and re-runnable versioned workflow registrations for long-running ML jobs.

“Built-in task cache and partial-run resume; failed jobs can restart from the last saved state.”article, stated
“every run is traceable and re-runnable.”article, stated

batch-offline-processing (training)

The platform runs large embedding, reranking, hyperparameter sweep, pre-training, and cloud-burst batch jobs across GPU fleets.

“Large batch jobs that can overflow to cloud GPUs on demand”article, stated
“Queue 30 hyper-parameter sweeps in parallel—no manual GPU juggling.”article, stated

semantic-caching (storage)

Alluxio acts as a distributed cache for training objects while S3 remains the durable source of truth.

“Alluxio first looks for the object in its distributed NVMe cache.”article, stated
“S3 remains the single source of truth.”article, stated

observability-tracing (operations)

The platform routes logs and metrics while NVIDIA operators publish DCGM metrics for GPU health and Flyte tracks lineage.

“Handles MIG partitioning and publishes DCGM metrics to Prometheus.”article, stated
“Automatic tracking links inputs, outputs, and the exact code version that produced them.”article, stated

cost-aware-routing (capacity)

Flyte can route the same project to on-prem or cloud queues, and Alluxio keeps hot data on-prem to reduce egress.

“A single project can target on-prem or cloud execution queues; scaling to thousands of spot GPUs is a configuration flag”article, stated
“Hot data stays on-prem, cutting on egress bills.”article, stated

tool-use-orchestration (platform)

The stack composes Pulumi, Ansible/Kubespray, Kubernetes, NVIDIA operators, Alluxio, Flyte, Ray/KubeRay, PyTorchJob, MPIJob, Loki, Prometheus, and S3 into a unified ML platform.

“Here's the five-layer stack that turns these bare servers into a compute beast we can control.”article, stated
“Flyte orchestrates node affinity, GPU topology, log routing to Loki, metrics to Prometheus, and artifact storage on S3”article, stated

Tradeoffs

Infrastructure-as-code format

Chose Pulumi with Python over YAML-only or ad-hoc scripts.

Rationale: Python gives engineers familiar control flow and tests, while Pulumi provides typed validation, diffs, and rollback.

“configuration is written in Python, so engineers can use familiar control flow—loops, functions, tests—and quickly extend the setup.”article, stated
“Pulumi's plan → apply workflow produces a clear diff of intended actions for every change”article, stated

Data cache authority

Chose Alluxio local NVMe cache with S3 as source of truth over Refactor code away from S3 URLs or use only local ephemeral storage.

Rationale: The team gets local-disk-speed hot data, cost control, transparent S3-compatible access, and durable S3 backing.

“Buckets are pre-mounted and exposed through an S3-compatible endpoint.”article, stated
“We can evict the cache at any time—S3 remains the single source of truth.”article, stated

Workflow orchestrator

Chose Flyte over Kubeflow, Airflow, Prefect, Dagster, or custom orchestration.

Rationale: Flyte met the broad set of code-first, local, distributed, batch, cloud-burst, checkpoint, lineage, queue, and developer-debug requirements without extensive custom work.

“We evaluated several frameworks—Kubeflow, Airflow, Prefect, Dagster, etc”article, stated
“Flyte was the only one that covered the full list without extensive custom work.”article, stated

Capacity placement

Chose On-prem GPU clusters with optional cloud burst over Only local execution or only cloud execution.

Rationale: The same project can use on-prem queues for owned capacity or scale to thousands of spot GPUs with a configuration change.

“A single project can target on-prem or cloud execution queues”article, stated
“scaling to thousands of spot GPUs is a configuration flag, not a rewrite.”article, stated

Gotchas (what bit them)

Bare-metal GPU fleets drift if setup is handled manually.

Root cause: Many nodes, high-speed networks, and core services create too much state for ad-hoc scripts and SSH sessions.

Resolution: Use Pulumi with Ansible/Kubespray and NVIDIA operators so provisioning, driver management, and upgrades are repeatable.

“Managing 28 bare-metal nodes, high-speed networks, and core services requires a repeatable process—not ad-hoc scripts.”article, stated
“Because everything is containerized, each node runs exactly the same stack and survives reboots or upgrades without drift.”article, stated

Training data throughput can bottleneck expensive GPUs.

Root cause: Direct object-store access and upload speed are too slow for hot training data at aggregate local-disk speeds.

Resolution: Use Alluxio to cache objects on distributed NVMe while keeping S3 durable and authoritative.

“flushes the blocks to S3 immediately (sync) or (b) uploads them in the background (async), so we don't get bottlenecked by our upload speed.”article, stated
“GPUs stream training data at aggregate local‑disk speeds while preserving the durability and simplicity of S3.”article, stated

A GPU scheduler has to support research iteration and production-scale jobs at the same time.

Root cause: ML engineers need local debugging, multi-node training, cloud burst, lineage, checkpoints, and fair-share policies in one workflow system.

Resolution: Adopt Flyte because it covered the full requirement list without extensive custom work.

“When we listed what the scheduling layer had to deliver, the list was long:”article, stated
“Flyte was the only one that covered the full list without extensive custom work.”article, stated

Hardware/software upgrades can disrupt training if rolled out fleet-wide.

Root cause: CUDA and driver changes affect GPU workloads and can create incompatibility with network operators.

Resolution: Use Kubernetes operators with version-aligned upgrades, cordon and drain one node at a time, then test before advancing.

“Aligns driver versions with the GPU Operator to avoid incompatibilities.”article, stated
“nodes are cordoned and drained one at a time, upgraded and tested, then put back into service before the rollout advances.”article, stated

Evaluation

Exa evaluates the platform through reproducible infrastructure diffs, type checking with mypy, Kubernetes node-health verification, driver/operator rollout testing, Flyte traceability and lineage, Prometheus/DCGM metrics, and concrete throughput outcomes such as pre-training launches, parallel sweeps, cloud-burst jobs, and full-cluster rebuild time.

Metrics: mypy validation of Pulumi parameters · node health verification after Kubernetes join · DCGM metrics · Prometheus metrics · Loki logs · dataset and artifact lineage · 7B pre-train on 16 nodes · 30 hyperparameter sweeps in parallel · 100-node AWS batch job · under-one-hour rebuild to 224 ready GPUs

4 supporting quotes
“Pulumi's typed API, validated with mypy, flags incorrect parameters before any provisioning begins.”article, stated
“label the nodes, verify health, and return control to Pulumi”article, stated
“Automatic tracking links inputs, outputs, and the exact code version that produced them.”article, stated
“Rebuild the entire cluster—from bare metal to 224 GPUs ready—in under one hour.”article, stated

Outcomes

The infrastructure includes a $5M cluster, 28 nodes, 224 total GPUs, 26.4 TB GPU RAM, 46 TB system RAM, 350 TB local NVMe, roughly 168 FP16 PFLOPs, 100 KW operating power, billion-page embedding workflows, 7B parameter pre-training on 16 nodes, 30 concurrent sweeps, and 100-node cloud-burst jobs.

5 supporting quotes
“it's running nearly 24/7, powering all concurrent workflows of our ML team.”article, stated
“a run that used to take a week to complete can now finish in ~1 day.”article, stated
“Launch a 7B parameter pre-train on 16 nodes with a single command.”article, stated
“Spin up a 100-node AWS batch job as easily as running the workflow on your laptop”article, stated
“Rebuild the entire cluster—from bare metal to 224 GPUs ready—in under one hour.”article, stated