Papers › Splitwise: Efficient generative LLM inference using phase splitting

Splitwise: Efficient generative LLM inference using phase splitting

30 Nov 2023arXiv:2311.18677links table onlyarchive 2025-07-28

Pratyush Patel, Esha Choukse, Chaojie Zhang, Aashaka Shah, Íñigo Goiri, Saeed Maleki, Ricardo Bianchini

The archive published only this paper's code-link row. Authors, date and abstract are from arXiv's metadata (CC0), read from the Kaggle arXiv metadata snapshot of 2026-09-12 where its title matched the archive's; the title is the archive's.

Recent innovations in generative large language models (LLMs) have made their applications and use-cases ubiquitous. This has led to large-scale deployments of these models, using complex, expensive, and power-hungry AI accelerators, most commonly GPUs. These developments make LLM inference efficiency an important challenge. Based on our extensive characterization, we find that there are two main phases during an LLM inference request: a compute-intensive prompt computation, and a memory-intensive token generation, each with distinct latency, throughput, memory, and power characteristics. Despite state-of-the-art batching and scheduling, the token generation phase underutilizes compute resources. Specifically, unlike compute-intensive prompt computation phases, token generation phases do not require the compute capability of the latest GPUs, and can be run with lower power and cost. With Splitwise, we propose splitting the two phases of a LLM inference request on to separate machines. This allows us to use hardware that is well-suited for each phase, and provision resources independently per phase. However, splitting an inference request across machines requires state transfer from the machine running prompt computation over to the machine generating tokens. We implement and optimize this state transfer using the fast back-plane interconnects available in today's GPU clusters. We use the Splitwise technique to design LLM inference clusters using the same or different types of machines for the prompt computation and token generation phases. Our clusters are optimized for three key objectives: throughput, cost, and power. In particular, we show that we can achieve 1.4x higher throughput at 20% lower cost than current designs. Alternatively, we can achieve 2.35x more throughput with the same cost and power budgets.

PaperPDFCodeCode Syntology ran

In Syntology Open this paper in Syntology's Atlas, the map of the papers in Syntology's graph and their citations.

For agents, Syntology's MCP tool lists every function and class Syntology harvested from this paper and whether it ran (how to connect): get_harvested_code_for_paper(arxiv_id="2311.18677")

Code

Syntology Ran 6 of 12 code samples harvested from 3 repositories linked to this paper; 6 have no recorded run. Of those that ran: 6 ran with no contract checked.

By repository: official repository: 8 samples from 2 repositories, 6 ran; named in the paper: 4 samples from 1 repository, 0 ran. The run record, sample by sample. “Ran” means executed on a synthesized input, not that the code is correct or reproduces the paper.

microsoft/mscclpp officialmentioned in papermentioned on GitHubMIT report
Azure/AzurePublicDataset officialmentioned in paperCC-BY-4.0 report
Mutinifni/splitwise-sim mentioned in paperMIT report
efeslab/Nanoflow mentioned on GitHubpytorch report

Repository list and official/mentioned flags are the archive's, frozen 2025-07-28. Reachability, where shown, is from one Syntology probe window (2026-09-16 to 2026-09-18); repositories not probed show nothing. GitHub stars are not tracked.

Code Syntology ran Syntology

12 samples harvested; 6 ran; 0 honoured the contract we drafted; 6 have no recorded run. Read from Syntology's graph 2026-09-24; that is when this build read the record, not when the samples ran.

6ran
6unverified

Licence: 6 of the 12 samples are pointer only, meaning Syntology does not serve that copy's text. This page shows no code text for any sample; each one links to its file in the repository.

Harvested from 3 repositories linked to this paper, official or community; each sample names its own and says which. “Ran” means the sample executed on a synthesized input. It does not mean the output is correct, and nothing here reproduces the paper's results. “Honoured” and “violated” refer to a contract Syntology drafted from the code itself; “our draft was wrong” and “fixture could not drive it” are failures of Syntology's instrument, not of the code.

Each sample ends with its code_sha256, Syntology's identity for that exact code. An agent fetches the stored sample with Syntology's MCP tool get_code(code_sha256="…") (how to connect); click an identity to copy that call.

Repository labels, per sample. official repository: The archive marks this repository official for the paper. named in the paper: The archive records that the paper mentions this repository; it is not marked official. community (archive-listed): In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper. found in paper text by Syntology: Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted. community: Not in the archive's code links for this paper; a community repository Syntology harvested. Samples from a repository marked official are listed first. Licence labels name the repository's licence as recorded at harvest. “Pointer only” means Syntology does not serve that copy's text, for one of four reasons: no licence file was found; the licence was not identified; the licence is recorded as permissive but that copy's record is not marked cleared; or the licence is outside the permissive list Syntology serves text under (MIT, Apache-2.0, BSD and similar). Some licences outside that list permit redistribution, such as WTFPL, and GPL-3.0 under its conditions; they are simply not on the list. Hover a licence label for the reason. File links open the file on GitHub at the default branch, which may have changed since the harvest.

exponential_func Azure/AzurePublicDataset/analysis/GreenSKU-Framework/src/derate_curve.py official repository ran fingerprinted CC-BY-4.0 · pointer only · ad9d55a26906b5ea · report
get_dict_opex Azure/AzurePublicDataset/analysis/GreenSKU-Framework/src/carbon_model.py official repository ran CC-BY-4.0 · pointer only · 265acc16bd2f6830 · report
get_opex Azure/AzurePublicDataset/analysis/GreenSKU-Framework/src/carbon_model.py official repository ran CC-BY-4.0 · pointer only · 5f01c092abff1074 · report
get_opex_from_dict Azure/AzurePublicDataset/analysis/GreenSKU-Framework/src/carbon_model.py official repository ran CC-BY-4.0 · pointer only · 4289a7837d69706c · report
human_readable_size microsoft/mscclpp/python/mscclpp_benchmark/allreduce_bench.py official repository ran MIT (permissive) · 02639e1a8ca8fe63 · report
quadratic_func Azure/AzurePublicDataset/analysis/GreenSKU-Framework/src/derate_curve.py official repository ran CC-BY-4.0 · pointer only · 75e8bf267d221c4f · report
is_torch_tensor microsoft/mscclpp/python/mscclpp/utils.py official repository unverified MIT (permissive) · 74353330e86481bb · report
linear_func Azure/AzurePublicDataset/analysis/GreenSKU-Framework/src/derate_curve.py official repository unverified CC-BY-4.0 · pointer only · 70c2b2f7c128e238 · report
generate_samples Mutinifni/splitwise-sim/generate_trace.py named in the paper unverified MIT (permissive) · 506db674bec6177c · report
generate_trace Mutinifni/splitwise-sim/generate_trace.py named in the paper unverified MIT (permissive) · 4484b5133c7d2676 · report
get_exponential_scale Mutinifni/splitwise-sim/generate_trace.py named in the paper unverified MIT (permissive) · 000bada9d64375ba · report
get_processors_power Mutinifni/splitwise-sim/power_model.py named in the paper unverified MIT (permissive) · a902f7f41d56887f · report

Results from the paper archive 2025-07-28

No leaderboard rows for this paper in the archive.

Report a problem or propose a change · a person checks every report against the paper or source before anything changes; decisions are listed on /corrections