Build1 distinct publisher3 min readPublished
Perplexity's 4 September thread splits request preparation, batch scheduling and CUDA execution across two languages so each can change alone, with a 512-token fill threshold deciding when its batcher is worth the hop.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Divide 512 by the token count of a typical request and you have the number of requests the batcher must collect before the GPU is actually busy [22]. The threshold comes from the thread itself: runtime for the smaller embedding models is driven mainly by token count rather than by the number of individual queries, and roughly 512 tokens can be enough to fill the hardware [7][8]. Short requests mean a lot of gathering, and gathering is what Tulip exists to do [6]. A single 512-token document fills the batch on its own, at which point Tulip is scheduling a batch of one across a gRPC boundary [22].
The other half of batching is the wait. Tulip merges small requests until it has enough tokens to use the hardware efficiently, while trying not to pay the latency penalty of waiting too long for a batch to fill [9]. The retrieval design bounds what that wait can cost: Perplexity's published search architecture starts retrieval through both lexical and semantic modalities and merges the results into a hybrid candidate set, so the pipeline is not wholly blocked on the query embedding [14]. Semantic retrieval still sits on a latency-sensitive path for every live search [15]. The same models also serve indexing and scoring, where the workload is large and throughput is the thing that matters [16].
The language boundary is placed where it costs least. Ivy and Tulip are Rust, and the only Python is ROSE, the layer that runs forward passes and manages CUDA graph execution [23][10]. Batch size is adjusted twice on the way down, since Ivy splits requests that arrive too large and Tulip merges the ones that arrive too small [24].
Inside ROSE, the two workload families share more than they differ. The engine reuses many of the same kernels for large language models and embedding models [11]. Divergence is confined to the cache and the attention path: embedding skips the key-value cache used in autoregressive generation and relies on ragged attention instead of paged attention, and the engine can pick an attention backend from model shape and sequence length [12][13]. That confinement is what makes one engine plausible for both, rather than two runtimes with a shared changelog.
The scheduling instinct fits the house. Founding president Andy Konwinski helped create Apache Mesos and Spark before co-founding Databricks [20]. The resourcing fits too: TechCrunch reported in September 2025 that Perplexity had raised another $200 million at a $20 billion valuation, taking reported funding to roughly $1.5 billion [19], which is the budget that makes bringing embedding, ranking, classification, scoring and language model serving in-house a reasonable thing to attempt [17]. The 512-token number is a fact about Perplexity's smaller embedding models and its own traffic mix. On traffic whose requests already saturate a batch, the same three services add a hop and change nothing.
Ranked by verification strength, evidence, and original report placement.
Perplexity published the architecture behind the embedding and ranking workloads that feed its search product.
A September 4 thread names the three layers of Perplexity's internal serving stack Ivy, Tulip and ROSE, covering the path from an incoming search query to the transformer models that embed, retrieve, rank and score information.
The three-layer internal stack is designed to prevent request preparation, batch scheduling and GPU execution from holding one another up, so each layer can be tuned without forcing changes through the entire system.
Ivy is the Rust HTTP gateway: it parses incoming requests, tokenizes text, applies templates and splits batches that are too large before sending work over gRPC.
Keeping CPU-heavy preparation outside the inference server lets Perplexity change request formatting and tokenization without modifying the GPU-facing components.
Tulip is a lightweight Rust gRPC server that gathers requests and schedules batches for the GPU.
Distinct publishers with included, body-backed reporting in this cluster.
1 article · September 4, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Rust's from_str waves through a tenth of the JSON that RFC 8259 says to reject1 distinct publisher
invest
Nvidia's Perplexity talks move its money one layer further from its own chips1 distinct publisher
product
AI writes the Dockerfile, and the pipeline is still checking the app code1 distinct publisher
build
Mojo's compiler went Apache 2.0 fifty-five days after Qualcomm's $3.92bn deal1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One outlet, one company thread
The 512-token fill threshold, the ragged-attention choice, the Rust and Python division: every technical detail traces to Perplexity's own thread, relayed by runtimewire.com and by nobody else. The descriptions are specific enough to be checkable in principle, but there is no code, no repository and no third-party measurement to check them against. The most solid finding in the reporting concerns an absence, namely that no production benchmarks accompany the performance claim.
In production at one company only
These layers are not a product; they are what answers Perplexity searches, and the company puts its production infrastructure at 200 million queries a day. That is genuine use at genuine volume, and it is also the boundary: Ivy, Tulip and ROSE exist inside one company, with no release, license, external user or second deployment described anywhere in this reporting.
Cost win asserted, never sized
Perplexity's summary claim is that the combination improves latency and throughput while costing less than off-the-shelf serving. Nothing sizes that: no per-query cost, no GPU utilization, no requests per second, and the systems it beats are unnamed. The gap stays modest rather than wide because runtimewire.com says so on the record and declines to borrow the 200-million-queries figure as proof, leaving the overstatement with the company rather than the coverage.
A hiring post with a valuation behind it
An architecture thread from a company that has just taken $200 million at a $20 billion valuation does two jobs beyond documentation: it recruits infrastructure engineers who like this class of problem, and it tells investors the capital is buying owned technology rather than rented inference. That does not make the layer descriptions wrong, but it does explain why the flattering comparison against off-the-shelf serving arrives without a number attached.
Firm on structure, silent on scale
Companies are rarely wrong about the structure of their own systems; a team knows which language its gateway is written in and whether its embedding path keeps a key-value cache. So the layer map, the token-based batching rule and the attention choices can be read at face value. Statements about magnitude cannot, and with one outlet, one primary source and no outside instrumentation, that keeps our reading in the middle of the range.