Skip to main content

Command Palette

Search for a command to run...

👋 Everything about EKS & AI Infrastructure Newsletter "#85" ☁️❤👨‍💻

Memory, cold starts, and what infrastructure keeps forgetting — plus a big week for AWS User Group Vadodara.

Updated
•16 min read•View as Markdown
👋 Everything about EKS & AI Infrastructure Newsletter "#85" ☁️❤👨‍💻
A

I’m a Solution Architect at Lauren, AWS UG Vadodara Co-Organizer and HashiCorp Ambassador

Dear EKS & AI Infrastructure enthusiasts,

Welcome to Everything about EKS & AI Infrastructure #85.

A lot of what we build in AI infrastructure comes down to one simple problem: computers forget things they shouldn’t, and remembering the right things at the right time is expensive. A GPU forgets a model’s weights the moment it restarts, so it has to download them all over again. A load balancer forgets which server already “knows” your question, so it sends it somewhere that has to start from scratch. A crashed pod takes its own error logs down with it before anyone can even look at them.

This issue is full of people fixing exactly that. Amazon SageMaker’s new routing feature makes sure repeat requests land on the same server so it doesn’t have to redo work it already did. A new caching feature on SageMaker HyperPod keeps model files sitting locally on the machine, so restarting a server takes seconds instead of 30 minutes. A new AWS tool grabs a crashed pod’s evidence and saves it before it disappears, so someone (or something) can actually figure out what went wrong. We also cover a fresh GPU benchmark (the new G7 instances vs older ones), a deep look at splitting AI inference into two coordinated pieces on Kubernetes instead of one, a builder who rebuilt his entire AI-serving setup three times chasing lower cost, a tool that makes Spark run faster on GPUs without any code changes, a real security pattern for AI agents built around an actual hack that happened, and a good discussion on why specialized AI engines keep losing out to the popular ones like vLLM.

Performance Engineering in Modern AI Systems 🌩️

🌩️Prefix-aware routing on Amazon SageMaker Inference

Here’s the setup: every prompt to an LLM usually has a big fixed chunk at the start (system instructions, a document, chat history) and a small changing chunk at the end (the actual user message). Serving frameworks like vLLM can cache the computation for that fixed chunk so it doesn’t get redone on every request. But this only works if the same fixed chunk keeps arriving at the same machine. If you’re running multiple instances behind a load balancer and it spreads requests randomly, that same 3,000-token chunk shows up on a different machine each time, so none of them ever gets to reuse the cache. Amazon SageMaker’s new PREFIX_AWARE routing fixes exactly this: it looks at the start of each request and consistently sends matching ones to the same instance, so that machine’s cache actually gets used.

The results show why this matters: on Llama 3.1 70B, time to first response dropped by up to 77% and the cache started getting reused in over 80% of requests, up from about 25%. The one catch: this only works if your requests are formatted identically every time (same field order, no extra spaces), because the routing looks at the raw text of the request, byte for byte, to decide what counts as a “match.” If your app formats the same prompt slightly differently between requests, they’ll get routed to different machines and you’ll lose the benefit. Worth checking if you’re running chatbots, RAG apps, or coding assistants on SageMaker.

🌩️Benchmarking small LLM inference on SageMaker AI: G7 vs G5 and G6

This post benchmarks two 30B MoE models across the older G5/G6 GPU instances and the new Blackwell-based G7, and the interesting bit is that G7 wins even though it’s running on half the GPUs and less total memory than the others. The reason comes down to how MoE models actually work: when generating each token, they only wake up a small subset of “expert” sub-networks instead of the whole model. Because of this, the bottleneck isn’t how much raw compute the GPU has, it’s how fast it can move data in and out of memory. G7 simply has more memory bandwidth, so it doesn’t sit around waiting on data as much.

The second reason G7 pulls ahead is precision support. Models can be shrunk down to run in a very compact 4-bit number format (called NVFP4) to save memory and speed things up, but only Blackwell GPUs (G7) can actually run that format natively in hardware. On G5 and G6, the same 4-bit weights still work, but the GPU has to do extra work to handle them since it wasn’t built for that format, so the potential speedup mostly goes unused. The practical takeaway: if you’re picking GPU instances for a mixture-of-experts model, it’s not just about “more GPUs” or “more memory,” it’s about whether the hardware actually understands the number format your model is running in.

🌩️Deploying Disaggregated LLM Inference Workloads on Kubernetes

When an LLM answers a prompt, it actually does two very different jobs: first it reads and understands your whole prompt (this is called “prefill,” and it’s compute-heavy, like a burst of hard math), then it generates the answer one word at a time (this is “decode,” and it depends more on fast memory access than raw compute). Normally both jobs run on the same GPU, which is wasteful because the GPU is never great at both at once. “Disaggregated serving” means splitting these into two separate services, each running on hardware suited to its actual job, so nothing sits idle waiting on the wrong kind of work.

The tricky part is coordinating these two services so they still work as one system. The post compares two ways to do this on Kubernetes. The simple way (using something called LeaderWorkerSets) treats the “prompt-reading” service and the “answer-generating” service as two totally separate things, so Kubernetes doesn’t know they’re supposed to work together, meaning you have to manually keep them in balance yourself, or things break, like if you scale up the prompt-reading side but forget to scale up the answer-generating side, the answers have nowhere to go and everything backs up. NVIDIA’s newer tool called Grove fixes this by treating both services as parts of one system from the start, so scaling and coordination happen automatically and safely, without needing someone to manually keep the two halves in sync.

  1. Starred Content ⭐

⭐EKS Node Diagnostics MCP with DevOps Agent Integration

AWS DevOps Agent is good at investigating things it can already see, like a crashing pod or a CloudWatch metric spike. But a lot of what actually goes wrong on an EKS node lives outside that view: kubelet logs, container runtime logs, firewall rules, network config, kernel messages. None of that is visible through the Kubernetes API or CloudWatch. This solution builds a bridge for that: a custom MCP server that tells the agent how to reach into the node itself (using SSM, AWS’s remote command tool) and pull over 20 different log sources.

The interesting part is how the pipeline is built, not just the idea. The agent asks for logs from a specific instance, an SSM script grabs everything and zips it into S3 (encrypted), and then a processing step goes through the logs, tags each error with a severity level, and gives it a stable ID before handing it back to the agent. That last step matters a lot: dumping raw logs on an AI agent doesn’t work well, but handing it pre-sorted, labeled findings does. It’s still a proof of concept, so test it somewhere safe before pointing it at anything that matters.

⭐Multi-Model LLM Inference on EKS, Across Three Generations of Silicon — Chris Jaimon

Chris Jaimon built a system to serve LLMs cheaply on spot instances, and rebuilt it three times as he ran into real problems. Round one used AWS’s Inferentia2 chips because they’re cheap and easy to find on spot, but he hit two walls: each user only got about 8 tokens/sec of output (he wanted 10+), and whenever a spot instance got killed, bringing a new one back online took almost an hour, because it had to re-download the model and recompile it for the chip. His fix for the cold start was simple but effective: pre-load the already-compiled model into S3 ahead of time, so a new instance just pulls the ready-made version instead of rebuilding it from scratch. That took the recovery time from an hour down to minutes.

Since scaling up Inferentia2 further would’ve gotten too expensive, he switched chips instead. He moved a big mixture-of-experts model (Llama 4 Maverick) to Trainium2, which has enough onboard memory to hold the whole model without needing to shrink it, and added a third setup using regular NVIDIA GPUs (L40S) for a smaller, faster model. Now traffic gets split between the two live models through a single gateway (Envoy AI Gateway): about 80% goes to the fast small model, 20% to the bigger one, and if a spot instance running either model goes down, the gateway automatically shifts traffic away without the app noticing. The thing that stands out most: every throughput number in the post came from him actually running the benchmark himself (using a tool called LLMPerf), not from trusting whatever the chip vendor claims.

  1. Announcements 📢

📢Ray Serve Deep Learning Containers on Amazon EKS

TorchServe is officially unmaintained now, no more security patches, no more compatibility fixes as PyTorch and CUDA move forward. That leaves any team still on it fully responsible for keeping the GPU stack, framework, and serving layer aligned themselves. AWS’s answer is the new Ray Serve DLC: a prebuilt, tested container that already bundles PyTorch, the CUDA runtime, and Ray Serve together, the same “pull and run” model DLCs already offered for training, now extended to inference.

The walkthrough deploys Qwen3-VL-2B on a single g5.xlarge (one A10G, 24GB VRAM), loading the model in float16 specifically to fit that memory ceiling, and the whole endpoint is one @serve.deployment-decorated class with ray_actor_options={"num_gpus": 1}, no archiver, no handler hierarchy. The gotcha worth flagging for anyone reproducing this: the pod reports Ready a minute or two before Ray Serve actually starts answering requests, since the model is still loading onto the GPU, so a failed first curl doesn’t mean the deployment is broken. It’s single-node only here; multi-node model parallelism or replica autoscaling means layering KubeRay on top.

📢Model caching for Amazon SageMaker HyperPod inference

Every time an inference pod scales out on HyperPod, it has to pull the container image from ECR and then download the model weights, both over the network, before it can serve a single request. For a big model like DeepSeek-R1 that’s 30+ minutes, and it happens all over again for every new pod during a scale-out event, which means your autoscaler can react in seconds but your actual capacity doesn’t show up for half an hour. Model caching fixes this by pre-loading both the weights and the image onto node-local NVMe ahead of time, so a pod reads from local disk at ~7 GB/s instead of pulling over the network.

The mechanism worth understanding: it’s two independent caches (weights and image), each backed by its own CRD, and both use “preferred” rather than “required” scheduling, so a pod that lands on a node without a warm cache just falls back to the normal download path instead of failing. Benchmarks show ~60% faster scale-out for 57–145GB models. The catch to watch for: weights are cached per-node, so NVMe usage scales with node count, not a shared cache, and your instance’s NVMe capacity has to actually exceed your model size or caching silently won’t fit.

Community & Career 🤝

🤝Run Apache Spark up to 10x faster with DataPelago on Amazon EKS

Spark was built for CPU-only execution, so even when infra teams provision GPU nodes alongside their EKS clusters, Spark itself has no path to actually use them without a rewrite. DataPelago’s Nucleus engine solves this by inserting a hardware-abstraction layer right after Spark’s Catalyst optimizer produces its physical plan: it inspects each operation (scans, joins, aggregations, sorts) and decides at runtime whether that specific operation runs faster on GPU or on vectorized CPU, with automatic fallback to standard Spark if a stage can’t be accelerated.

The mechanism that actually earns the speedup numbers is kernel fusion: Nucleus fuses multiple Spark operations into single GPU kernels, which is why it beats even NVIDIA’s own cuDF library by 3.7–10.5x on projection/filtering and up to 38.6x on string-heavy hash joins, since cuDF pays the cost of separate kernel launches and memory copies that Nucleus avoids. It deploys as a JAR plugin with zero code changes and no data migration, which is the detail that matters for anyone evaluating this: production customers report 2–10x speedups and 50–80% cost cuts without touching cluster topology, security config, or data formats.

🤝Secure Agentic AI Deployment on Kubernetes — Kashish Verma

Kashish Verma grounds the whole piece in the real May 2025 GitHub MCP attack: an attacker planted hidden instructions in a public repo’s issue, and when a user asked their agent to “address the issues,” the agent pulled private repo data into context and leaked it via a public PR, fully authorized, using a completely legitimate tool call. That’s the core problem this piece addresses: least-privilege Kubernetes RBAC (ServiceAccounts, Roles) stops an agent from touching resources it shouldn’t, but it says nothing about an agent being tricked by content it’s allowed to read.

The architecture worth studying is the sidecar pattern applied to secrets: instead of the agent’s own code holding a long-lived token, a sidecar container fetches credentials from a secrets manager (e.g., Vault) and exchanges them for short-lived tokens at call time, so a compromised agent process never holds anything long-lived. A custom ToolPermission CRD extends this to tool-level granularity Kubernetes RBAC has no native concept of (e.g., read_balance allowed, make_payment not), and an LLM-as-a-judge step in the same sidecar screens tool responses for injected instructions before they reach the agent’s context, the piece Kubernetes RBAC alone can’t provide since the GitHub attack succeeded through a fully permitted tool call. GitOps (ArgoCD/Flux) ties it together org-wide by making the reviewed pipeline the only path to deploy any of this, closing the gap where a manually configured agent gets one step wrong.

  1. Highlights ✨

✨The oldest architecture in computing — Werner Vogels

Vogels uses his time with Kiro Crew (AWS’s open-source agent workspace) as a jumping-off point to compare agent memory design to how brains manage memory: distributed storage across specialized units, background consolidation, and graceful decay of what isn’t reinforced. The one concrete architectural detail worth noting is that Kiro Crew’s memory system spans markdown files, a local vector database, and a key-value index together, with recent memories kept in full detail while older ones compress or get pruned, which is the same “active forgetting” principle any long-running agent system eventually needs or it spends more cycles sorting old context than doing useful work.

✨Kaichao You on why specialized inference engines keep losing to vLLM

Alex Cheema’s viral complaint was that at least five specialized inference engines shipped in a single month, and asked why fragment the ecosystem instead of building on vLLM or SGLang. Kaichao You’s response reframes what vLLM actually is: not just a way to run a model on a chip, but a unified interface sitting at the intersection of models, hardware, and inference techniques, all three of which move fast independently. A specialized engine optimizes one point in that space; vLLM has to keep tracking all three simultaneously, which is a much harder, more durable problem to solve.

The concrete example he gives is TileRT, a megakernel engine built specifically for decode. Rather than competing head-on, TileRT ended up pairing with vLLM in a prefill-with-vLLM, decode-with-TileRT split, the pattern You says he’s watched repeat for three years: specialized projects either get their techniques absorbed into vLLM or they disappear, because the ecosystem’s gravity is stronger than any single optimization. Worth remembering next time a new “vLLM killer” makes the rounds: the interesting question isn’t whether it’s faster at one thing, it’s whether it plugs into the ecosystem or tries to replace it.

🎉 Sponsor Section

At the moment, we don’t have a sponsor for this edition, but we look forward to working with companies and organizations that support the EKS & AI Infrastructure community in future editions. If you or your company is interested in sponsoring, please contact us at 📧 thecloudtechforall@gmail.com

📝 Words from the AuthorWe organized our 5th AWS Community Day Vadodara this year, and I still can’t quite believe we’re here.

Six years ago this started as a small monthly meetup with a handful of people in a room. Yesterday we had Darko MesaroĹĄ, an AWS Distinguished Developer Advocate, standing on our stage, talking to over 700 people who showed up on a weekend.

Darko spoke about Kiro Crew, and honestly it connected with something I’d already been chewing on. If you read Werner Vogels’ piece in this issue, he’s circling the exact same idea from his side of the world: what does it actually mean for an agent to remember something well, to consolidate what matters and let the rest fade instead of dragging every bit of old context forward forever. Hearing Darko talk through it live, in the same week I was putting this issue together, made that whole thread click in a way reading it alone hadn’t.

Dhaval Nagar’s keynote, “The Model Is Not the System,” was the one that’s stuck with me the most since. His point was simple but it landed hard: AI coding agents mean engineers might not need to remember every CLI flag or Terraform syntax anymore, but that doesn’t mean the job gets smaller, it means the job moves up a level. You still have to understand what’s actually being built, where the permission boundaries are, what happens when something fails, what data is flowing where. He walked through real AWS architecture examples showing how to let an agent move fast without quietly handing it architectural ownership along with the keyboard. It’s the kind of talk that reframes something you’ve been vaguely uneasy about into something you can actually name and design against.

But I need to say this plainly: this wasn’t a one-day thing. This was three months of work. Planning started back in June, and it did not let up until people were walking through the doors on Saturday. I did not do this alone, not even close. Every single organizer and volunteer on this team gave up weekends, stayed late, chased down a hundred small things that nobody in the audience will ever see, and made sure it all just worked. Three months of that kind of effort is what a single day of “wow, that was amazing” is actually built on.

So to everyone who put in that time: thank you. This one is yours as much as it’s mine.

Happy building. 😎