Rasa preview · EFA-native KV cache, built with AWS See the p99 numbers

KV cache in 56µs. TTFT at NIC speed.

Rasa keeps KV cache blocks in registered memory on EFA data nodes. Clients read them directly with one-sided RDMA: a full megabyte chunk in 56µs at p99. Prefixes you have already served come back over the wire, so your GPUs spend their time on new requests instead of repeating old ones.

Baseten-style Rasa architecture diagram showing clients, Valkey metadata, EFA, and a Rasa data node.

Rasa makes RDMA simple.

client.rs

p99s, by chunk size

Remote reads from a c8gn.16xl. Each row is one operating point: the connection count that reaches that size’s ceiling, and the tail you get there.

25-56µsp99, 4 KiB to 1 MiB
201 Gbpssingle-conn line rate, 4 MiB+
1.6%data-node CPU at line rate. The other 63 cores sit idle.

p99 by chunk size

size p99 throughput load
4 KiB 25µs
28Gbps
854k/s16 conn
32 KiB 37µs
159Gbps
607k/s16 conn
128 KiB 38µs
140Gbps
134k/s4 conn
1 MiB 56µs
168Gbps
20k/s1 conn
4 MiB 208µs
201Gbps
6k/s1 conn
16 MiB 758µs
201Gbps
1.5k/s1 conn

Your VPC. Your nodes.

Clients and a fleet of data nodes share an EFA placement group per AZ. Valkey is the control plane, not the data plane: it maps keys to descriptors, and the values never flow through it. The data path is libfabric RMA behind a small transport trait, so a second fabric is a provider swap rather than a rewrite.

Deployment topology: a VPC across two Availability Zones, each with clients and a fleet of data nodes on EFA, plus a shared Valkey control plane.
Built with on Valkey

A Valkey-powered control plane.

Valkey runs the exchange. Every read, write, and delete starts there: it maps each key to its Rasa descriptor and hands the client the address, rkey, and lease it needs, then coordinates slot allocation, node membership, and memory reclamation across the data nodes. Nothing on the read path talks to it except the client, once, before the read.

Read: one descriptor lookup in Valkey, then a one-sided RDMA pull straight from the data node's registered memory. The node's CPU is off the read path.

You never touch the fabric.

Doing RDMA by hand means libfabric, queue pairs, memory registration, remote keys, completion-queue polling, and getting EFA's SRD transport and security groups exactly right. Rasa keeps all of it behind a key/value API.

Rasa owns the fabric code

Memory registration, rkeys, descriptor refresh, leases, and completion polling all stay behind the client API. You never touch a fabric primitive.

EFA set up at deploy

Provider discovery, SRD, address exchange, and the security-group gotchas are configured when you stand it up.

Just three calls

The whole client API is get, put, delete. Addressing, leasing and fencing live behind it.

Throughput saturates the NIC.

The data node serves the full 200 Gbps line rate, at any value size, while sitting at 1.6% CPU utilization. To be precise about that 1.6%: it is a busy-polling progress loop. The NIC serves the reads out of registered memory and they never enter the process.

168Gbps
From a single 1 MiB connection, one read at a time, at p99 56µs.
201Gbps
The full EFA line rate. One connection saturates it from 4 MiB up.
184k/s
128 KiB reads at line rate (six connections), p99 44µs.
Near idleCPU
The NIC serves the reads.

What it is good at.

Large values, small latency

Built for 128 KiB to 16 MiB chunks, read in tens of microseconds to under a millisecond at p99.

Bandwidth, not cores

Reads bypass the server CPU entirely, so throughput scales with the NIC. One data node serves 200 Gbps of remote reads.

Simple and safe

Three calls: get, put, delete. Values are immutable and validated on every read; memory is reclaimed safely by lease and rkey rotation.

Where Rasa plugs in.

An early preview built in collaboration with AWS. Here is what is in flight and what is coming soon.

LMCache connector

Offload vLLM’s KV cache to Rasa as a remote backend. The existence check and the read address resolve together, so a prefix lookup and its load are one round trip. How it works →

In progress

vLLM connector

A direct connector for vLLM’s KV transfer interface, for deployments that do not run LMCache in front of it.

In progress

NVMe tiering

Capacity well beyond registered DRAM. The NIC cannot pull a block off NVMe, so the direction flips: the node RDMA-writes the value into your buffer and the completion is the reply. Still one round trip. The write-key path →

Shipping soon, with AWS

NIXL backend

Speak NIXL, so any inference engine that already does can reach Rasa without adopting an SDK. Integration should be a config change.

On the roadmap

GPUDirect RDMA

Land KV blocks straight in GPU HBM, skipping the hop through host memory and the copy across PCIe. The NIC can already register HBM; this wires it to the read path.

On the roadmap

What it gives up to go this fast.

One-sided reads are fast because the server is not involved, and that same fact decides what the system can promise.

Write-once, immutable

Values do not change in place; deletes are lazy. Durability is a cache contract: lose a node and you recompute. That immutability lets a one-sided read be served safely without a lock.

Reclaim by time, not locks

A one-sided read is invisible to the server, so in-flight readers cannot be counted. Memory is reclaimed only after leases expire and the remote key is rotated: a hardware fence, not a mutex.

One fabric, done well

Single-tenant, AWS with EFA on Linux, built in collaboration with AWS. We went deep on one fabric to get to production customers sooner. The technique is not EFA-specific: the same read path runs over RoCEv2 or InfiniBand once it is pointed at a different provider.

Try a Tbps+ remote-memory cache in your own AWS account.

Single-tenant, self-hosted, EFA-native. An early preview you benchmark in your own VPC.