top of page

Amazon EKS NVRx Training Cuts GPU Fault Recovery From Minutes to Seconds

Sep 17
12 min read

Amazon EKS has integrated NVIDIA NVRx into a reproducible training stack that recovered injected GPU faults in roughly 10 to 17 seconds. The Amazon EKS NVRx training design also kept checkpoint efficiency above 99% in selected tests spanning 16 to 64 H100 GPUs. Those results challenge a costly assumption: reliable recovery must begin by restarting containers or rebuilding the entire Kubernetes job.

The system combines PyTorch Fully Sharded Data Parallel, or FSDP, with three separate NVRx capabilities. Async checkpointing moves storage writes away from the training loop. In-process restart rebuilds distributed state without replacing the Python process. The ft_launcher component starts fresh workers inside the existing job after harder failures.

The important contest is therefore not AWS against another cloud provider. It is application-aware recovery against infrastructure-only recovery. Kubernetes remains responsible for scheduling and node-level failures, but NVRx handles faults closer to the training process. AWS says that split sharply reduces the time that healthy, expensive GPUs spend waiting for a failed peer.

Amazon EKS NVRx Training Moves Recovery Inside the Job

The central change is that a worker failure no longer needs to become a full container lifecycle event.

AWS and NVIDIA built the reference environment around Amazon EKS, self-managed GPU node groups, and PyTorch FSDP. Their published benchmark used p5.48xlarge instances, each containing eight NVIDIA H100 GPUs with 80 GB of memory.

The tested cluster scaled from two to eight nodes, or 16 to 64 GPUs. Each instance also exposed 32 Elastic Fabric Adapter interfaces for high-bandwidth communication. Amazon FSx for Lustre provided shared checkpoint storage across the training pods.

NVRx, short for NVIDIA Resiliency Extension, is a Python package that adds recovery and checkpointing components to PyTorch workloads. It does not require a PyTorch fork, custom kernels, or recompilation. Teams can add its capabilities independently rather than replacing their complete training framework.

That modular design matters because checkpoint performance and fault recovery are different problems. A workload might need faster saves without process recovery. Another might need protection from process crashes while retaining its existing checkpoint implementation.

The reference architecture treats each layer according to its failure scope. In-process restart handles exceptions and communication hangs that leave the Python interpreter alive. ft_launcher handles events such as SIGKILL, out-of-memory termination, and some operating-system-level hangs.

Kubernetes remains the outer layer for failures that remove an entire node. This approach resembles a set of nested recovery zones. Each mechanism intervenes only when the failure crosses the boundary of the layer beneath it.

The training pods use headless Kubernetes Services for peer discovery. Workers find one another through DNS instead of fixed IP addresses. That arrangement helps replacement workers return without requiring operators to rewrite job configuration.

AWS previously described elastic distributed training on EKS using PyTorch tooling. The NVRx work narrows the recovery loop further. It focuses on keeping an active job productive when individual ranks fail, stall, or disappear.

That distinction creates the article’s central tension. Kubernetes can restore infrastructure, but infrastructure recovery lacks detailed knowledge about model state, process groups, and checkpoint timing. NVRx brings those decisions into the training application.

Blocking Checkpoints Were Consuming About 40% of Wall Time

The first performance problem was not GPU computation. It was the time every rank spent waiting for checkpoint data to reach storage.

A synchronous checkpoint pauses training until the required model and optimizer state has been written. In a distributed FSDP job, that pause affects every participating rank. Healthy GPUs remain allocated, but they perform no forward or backward computation during the write.

AWS reported that synchronous checkpointing produced only 57% to 61% training efficiency in its scaling tests. Storage writes took about 275 seconds, and that duration remained broadly constant between 16 and 64 GPUs. Adding compute therefore did not remove the storage-bound pause.

NVRx async checkpointing changes the write path. The training process stages state on the CPU and passes the work to a persistent background process. The main process then returns to the next training step while storage I/O continues.

The implementation uses TorchAsyncCheckpoint and its async_save() method. Before starting another save, or before exiting, the application finalizes the outstanding operation. That coordination prevents one unfinished checkpoint from silently colliding with the next.

FSDP local state dictionaries strengthen the design. Each rank writes its own shard, avoiding an all-gather operation and a single rank-zero write bottleneck. PyTorch’s FSDP documentation describes the broader sharding model that distributes parameters across participating workers.

At a checkpoint interval of 1,000 steps, AWS says NVRx async checkpointing reached 99.2% training efficiency on two nodes. Efficiency reached 99.8% on eight nodes. The synchronous comparison reached 60.3% at eight nodes.

Those figures are vendor-reported benchmark results, not guarantees for every model or storage configuration. Still, the mechanism behind them is straightforward. If computation lasts longer than the storage write, the background operation can fit almost entirely behind useful training work.

The boundary became clear when AWS increased checkpoint frequency. At eight nodes and one checkpoint every 100 steps, synchronous efficiency dropped to 14.7%. Async efficiency also fell, but remained higher at 29.6%.

The reason was timing. One hundred training steps took roughly 280 seconds, while the checkpoint write took about 275 seconds. There was almost no spare compute window available to conceal the next storage operation.

This is the real limit of NVRx async checkpointing. Asynchronous I/O can hide a write behind computation, but it cannot make storage infinitely fast. When saves arrive as quickly as the filesystem can complete them, the queue eventually applies pressure.

Even with that constraint, the capability changes how teams can choose checkpoint intervals. Synchronous systems encourage fewer checkpoints because every save imposes visible idle time. Infrequent saves then increase the amount of training lost after a fault.

Async checkpointing weakens that tradeoff. Teams can save more often when sufficient computation exists between writes. A shorter interval reduces rollback distance, while overlapped I/O preserves more of the GPU investment.

The result is not simply a faster checkpoint API. It is a different balance between steady-state efficiency and recoverable progress. That balance becomes more valuable as jobs grow longer and involve more failure-prone components.

In-Process Restart Challenges the Kubernetes-Only Recovery Model

The fastest recovery path preserves the Python process and rebuilds only the distributed resources damaged by the fault.

In the reference implementation, NVRx wraps the main training function with an in-process restart controller. If a supported exception occurs, the wrapper interrupts the active attempt and prepares another call. The outer Python process remains alive throughout that sequence.

NVRx first aborts the damaged PyTorch distributed process group. It can collect flight-recorder traces, stop the NCCL backends, and destroy the invalid group. NCCL is NVIDIA’s communication library for collective operations across GPUs.

Health checks then examine resources associated with each rank. Those checks can cover the GPU, NVLink connections, network interfaces, and repeated rank failures. A retry controller limits restart attempts and determines how many active ranks must survive.

The system reassigns surviving ranks into a contiguous group and starts a new rendezvous. The wrapped training function recreates its FSDP model, loads the latest checkpoint, and resumes work. The Python interpreter and objects outside the wrapped function remain available.

This technique targets soft failures. Examples include unhandled application exceptions and NCCL hangs that the watchdog can detect. It does not assume that a Python exception will reliably emerge from every blocked native call.

Instead, a progress watchdog records activity between Python bytecode operations. A separate monitoring thread checks shared state and can request a restart when one rank stops progressing. The system then coordinates the interruption across participating workers.

AWS compared this approach with ft_launcher and baseline Kubernetes recovery. The experiment used two p5.48xlarge nodes, 16 H100 GPUs, and Llama 3.1 8B under FSDP. The job ran for 2,000 steps and saved every 500 steps.

Researchers injected five deterministic faults into each run using the same schedule. NVRx in-process restart recovered in about 10 seconds per fault without restarting containers. AWS measured 31% training goodput and 87% infrastructure goodput.

Training goodput measures time that produces valid training progress. Infrastructure goodput measures time when the allocated infrastructure remains operational and available. The gap between them includes work that does not advance the model, including rollback and checkpoint loading.

Baseline Kubernetes recovery took about 270 seconds per injected fault. It produced 11.5% training goodput and 35.8% infrastructure goodput in the reported experiment. That makes the comparison larger than a container startup optimization.

According to AWS, one failed rank triggered communication timeouts on surviving ranks. Pods then restarted out of sync, causing repeated timeout cycles and CrashLoopBackOff behavior. The orchestrator restored containers without understanding how the distributed training group needed to recover together.

Application-aware recovery has access to that missing context. It knows when progress stopped, which process group became invalid, and which checkpoint can restart training. Kubernetes sees pod state and node health, but not the complete semantics of an FSDP training step.

This does not make Kubernetes recovery unnecessary. A dead node cannot preserve its interpreter, CUDA state, or local processes. Node replacement still belongs to the cluster layer, and the recovered workers still require persistent checkpoint data.

The pressure falls on teams that rely on pod restarts as their only fault-tolerance policy. That approach remains simple, but its recovery window can waste substantial accelerator time. Larger clusters amplify the cost because one failure can idle many otherwise healthy workers.

NVRx Fault Tolerance Splits Soft and Hard Failures

No single restart mechanism covers every failure, so NVRx fault tolerance separates process-preserving recovery from worker replacement.

The ft_launcher component handles faults that in-process restart cannot survive. These include SIGKILL, out-of-memory kills, and failures that leave no usable Python interpreter. It replaces torchrun while retaining familiar rendezvous concepts.

Each training rank creates a RankMonitorClient after distributed initialization. The client sends heartbeats during training. Per-rank monitor servers compare those signals with timeouts configured for normal and initial startup conditions.

The AWS configuration used a 900-second rank heartbeat timeout. Its initial heartbeat timeout was 1,200 seconds, allowing more time for first-time model loading. A five-second monitor interval controlled how often the launcher checked worker status.

These values are configuration examples rather than universal recommendations. A heartbeat timeout must exceed the longest legitimate delay between signals. If it is too short, slow checkpoints or model initialization can look like failed workers.

When a worker dies or stops responding, ft_launcher terminates the remaining workers. It reclaims GPU memory, runs another rendezvous, and starts fresh processes inside the same job. The new workers restore state from the most recent checkpoint.

The launcher guide shows the same general pattern in NVIDIA’s NeMo RL stack. That broader integration suggests NVRx is intended as a reusable resilience layer, not an EKS-only utility.

AWS measured about 17 seconds of recovery per injected fault with ft_launcher. The reported run reached 25.5% training goodput and 85.9% infrastructure goodput. That was slower than in-process recovery but far faster than the 270-second Kubernetes baseline.

The difference reflects how much state each method preserves. In-process restart keeps the interpreter and outer process alive. ft_launcher must create new workers, initialize distributed state, rebuild the model, and reload a checkpoint.

Checkpoint loading can dominate the recovery interval at larger scales. Faster process creation does not eliminate the need to read model and optimizer shards. Shared filesystem throughput therefore remains part of the fault-tolerance design.

The Amazon EKS NVRx training architecture used an FSx for Lustre SCRATCH_2 filesystem in the same Availability Zone as its GPU nodes. This placement aimed to reduce checkpoint read latency. All workers could reach the same persisted state after recovery.

NVRx async checkpointing is orthogonal to both restart paths. It reduces write-related idle time and controls how much progress is at risk. The restart layer determines how quickly workers return after a fault.

That separation gives operators more choices, but it also adds policy work. They must decide which exceptions can trigger in-process recovery, how many retries are safe, and which health checks should remove a rank. They must also set heartbeat and rendezvous timeouts.

NVIDIA labels the NVRx project experimental and under active development. Its documentation warns that features and interfaces can change. Production teams should treat version selection and upgrade testing as part of the resilience plan.

AWS used NVRx 0.4.1 to reproduce its benchmark. The post recommends version 0.6.0 with updated launcher configuration for a current deployment. That version distinction matters because fault-tolerance systems sit directly on critical startup and recovery paths.

A failed recovery mechanism can be worse than no automation if it repeatedly restarts an unrecoverable job. Retry limits, minimum world size, and fault counters prevent unlimited loops. Operators still need alerts that distinguish successful recovery from recurring failure.

The 99% Result Has Important Boundaries

The benchmark supports a strong mechanism, but it does not establish 99% efficiency for every distributed training workload.

AWS tested one principal model configuration, Llama 3.1 8B with PyTorch FSDP, on H100-based p5 instances. It used EFA networking and FSx for Lustre storage. Different model sizes, storage paths, checkpoint formats, and step durations will change the overlap window.

The 99% figure applies to async checkpoint efficiency at selected intervals. It does not describe end-to-end goodput under repeated faults. In the injected-fault tests, training goodput remained 31% for in-process recovery and 25.5% for ft_launcher.

Those lower results do not contradict the checkpoint measurements. They answer a different question. Async efficiency measures the checkpoint overhead during ordinary training, while goodput includes fault injection, rollback, loading, and other recovery work.

Checkpoint frequency also has an unavoidable limit. At one checkpoint every 100 steps, async training reached 29.6% efficiency rather than 99%. The storage system was almost continuously occupied because compute and write durations were similar.

Memory pressure deserves attention as well. Async checkpointing stages data outside the immediate GPU operation and gives a background process responsibility for writes. Teams should measure CPU memory, queue depth, and storage backlog under their actual state dictionaries.

Recovery coverage is another boundary. In-process restart cannot help when the operating system kills the worker or the node disappears. ft_launcher can replace a dead process, but it still depends on the job, cluster network, rendezvous service, and checkpoint store.

Node loss remains a Kubernetes concern. A regional storage interruption or corrupted checkpoint can defeat every recovery layer simultaneously. The architecture reduces several common failure costs, but it does not remove shared dependencies.

Fault detection can also create false positives. A long compilation phase, data-loading pause, or filesystem stall might exceed an aggressive heartbeat timeout. The launcher would then restart healthy workers and discard valid progress.

Teams need workload-specific timeout data before enabling automatic recovery. They should capture the longest model initialization, checkpoint, validation, and data-input intervals. Testing should include failures during those phases, not only failures inside a regular training step.

The AWS benchmark used deterministic injected faults. That approach supports repeatable comparisons, but production failures are less orderly. Real clusters can experience simultaneous network degradation, storage slowdown, thermal issues, and process crashes.

The reference implementation gives teams a useful starting point for reproducing the configuration. Reproduction on different instance families and model scales will determine how portable the reported advantages are.

Operational complexity is the final tradeoff. The stack includes Kubernetes Jobs, DNS-based peer discovery, EFA resources, shared storage, NVRx wrappers, monitor clients, and multiple timeout layers. Each component creates another configuration surface.

That complexity can still be justified when a large GPU fleet spends minutes idle after one rank fails. However, smaller jobs might accept a simpler pod restart strategy. The relevant calculation is recovery cost multiplied by fault frequency, not benchmark prestige.

Teams evaluating the design should track both training and infrastructure goodput. GPU utilization alone can look healthy while the model repeatedly reloads old checkpoints. A useful dashboard must show completed steps, rollback distance, checkpoint freshness, and restart cause.

Engineering organizations also need durable records of these experiments. A searchable engineering knowledge base can connect timeout changes, fault traces, and benchmark results. That context helps teams avoid repeating failed recovery configurations.

What to Watch After the Amazon EKS NVRx Benchmark

The next evidence should show whether the design retains its advantage across larger models, real faults, and changing NVRx releases.

The first signal is independent reproduction beyond 64 H100 GPUs. AWS tested scaling from two to eight nodes, but fault frequency and coordination costs rise with cluster size. Results across hundreds of accelerators would better expose rendezvous and checkpoint-loading limits.

A larger test should report more than average recovery time. The distribution matters because rare five-minute recoveries can dominate the economics of a long run. Reports should include tail latency, failed restart attempts, and progress lost per incident.

The second signal is adoption inside major training frameworks. NVRx already connects with PyTorch-based workloads and appears in NVIDIA’s broader software stack. More native integrations would reduce the amount of custom wrapper and launcher code that teams maintain.

Framework adoption would strengthen the case that NVRx fault tolerance can become a standard application layer. Fragmented integrations would weaken it, especially if every framework requires different timeout, checkpoint, and rendezvous logic.

The third signal is evidence from uncontrolled production failures. Deterministic fault injection is necessary for comparison, but field incidents test combinations that laboratories rarely reproduce. Operators should publish recovery rates for GPU errors, NCCL stalls, OOM kills, and node loss separately.

Successful recovery should mean more than restarting a process. The job must restore valid state, continue producing correct updates, and avoid silent checkpoint corruption. Model convergence after repeated recovery deserves the same scrutiny as recovery speed.

For teams considering Amazon EKS NVRx training now, the practical first step is a controlled shadow benchmark. Use the actual model, checkpoint size, filesystem, and step duration. Compare synchronous saves, async saves, launcher recovery, and Kubernetes-only recovery under one fault schedule.

Then tune checkpoint intervals using observed computation and storage times. If a checkpoint takes almost as long as the interval between saves, async overlap will remain incomplete. If compute provides a wider window, the reported 99% efficiency becomes more plausible.

Recovery policies should start with conservative retry limits. Record every restart reason and preserve diagnostic traces. A job that repeatedly fails on the same rank or checkpoint needs escalation, not an endless recovery loop.

The AWS and NVIDIA work makes one conclusion difficult to ignore. Distributed training reliability cannot remain only an infrastructure concern. The application understands progress, checkpoint validity, and process-group state in ways that an orchestrator does not.

Amazon EKS still provides the essential scheduling and node-replacement foundation. NVRx adds a faster response inside that boundary. Together, they offer a credible path from four-minute recovery cycles to second-scale restarts for several important fault classes.

The open question is now operational rather than conceptual. Can teams reproduce those gains with their own models, storage systems, and real failure patterns? That is the test that should guide the next Amazon EKS NVRx training deployment.

Give every agent the context to do better work

Connect your agents to the knowledge, decisions, and history already organized in remio.

remio currently supports Windows 10+ (x64) and Macs with Apple silicon.

Your AI Partner at Work
Get more done with remio

Plan. Create. Deliver.
All in one place.

bottom of page