SPLASH 2026: Arsitektur Switching Parallel Layouts of Attention (TP, DPA, CP, DOP), Decoupled Ownership Parallelism, dan Seamless Handoff pada LLM Serving Generasi Blackwell B200
Analisis arsitektur sistemik riset frontier LLM serving (arXiv:2609.37626, ICT CAS & SGLang ecosystem, September 2026): Mengapa tidak ada satu pun layout paralelisme attention (TP, CP, maupun DPA) yang optimal di seluruh variasi beban kerja reasoning, agentic multi-turn, dan RL rollouts. Workload modern memulai batch dengan banyak request pendek (menguntungkan DP-attention), namun berakhir dengan beberapa reasoning trace yang sangat panjang (menguntungkan CP atau TP). Mesin serving konvensional memaku satu layout statis sejak boot karena mengubah layout sebelumnya mengharuskan request draining dan worker restart. SPLASH memperkenalkan mekanisme live attention switching yang mampu mengubah layout paralelisme secara dinamis saat inferensi tengah berjalan dengan median overhead transisi hanya 0.51% per step. Melalui pengenalan Decoupled Ownership Parallelism (DOP)—yang men-shard bobot proyeksi seperti TP namun mempertahankan KV cache pada satu owner rank seperti DPA—SPLASH menghemat kapasitas KV sebesar 27–60% tanpa replikasi redundan. Pada pengujian hardware Blackwell B200 melayani GLM-5.3 dan DeepSeek-V3.2 pada H200, scheduler adaptif SPLASH meningkatkan throughput serving end-to-end hingga 1.30–1.73x lipat dibanding layout statis.

Evolusi model bahasa modern menuju autonomous agentic workflows, multi-turn tool interaction, dan reinforcement learning rollout skala masif (seperti arsitektur DeepSeek-R1 dan OpenAI o1/o3) telah mengubah pola lalu lintas komputasi secara radikal. Jika beban inferensi chatbot konvensional bersifat homogen dan deterministik, beban kerja penalaran (reasoning workloads) justru memicu paradoks struktural: satu batch inferensi yang bermula dari ratusan request pendek independen akan bermutasi di tengah jalan menjadi segelintir reasoning traces ekstrem berukuran ratusan ribu token yang berjalan selama puluhan menit.
Dalam infrastruktur klaster GPU terdistribusi, mekanisme komputasi attention memaksa operator memilih satu dari tiga layout paralelisme utama: Tensor Parallelism (TP) untuk konkurensi rendah dengan latensi interaksi ketat, Data-Parallel Attention (DPA) untuk konkurensi request tinggi yang independen, atau Context Parallelism (CP) ketika panjang prompt melebihi kapasitas VRAM satu GPU. Namun hingga hari ini, mesin inferensi standar industri seperti vLLM, TensorRT-LLM, dan SGLang memaku konfigurasi layout tersebut secara statis sejak engine di-boot. Mengubah layout paralelisme di tengah jalan mengharuskan klaster melakukan request draining (menghentikan penerimaan request, menunggu seluruh request aktif selesai, dan me-restart worker)—sebuah prosedur mahal yang memakan waktu hingga puluhan detik persis di saat transisi layout paling dibutuhkan.
SPLASH: Switching Parallel Layouts of Attention with Seamless Handoff
Dipimpin oleh Chuan Liu, Shuoming Zhang, Zhicheng Li, Bersama tim peneliti Institute of Computing Technology Chinese Academy of Sciences (ICT CAS) dan kontributor inti ekosistem SGLang, riset ini memperkenalkan SPLASH—arsitektur sistem serving pertama di dunia yang mampu berpindah layout paralelisme attention secara dinamis saat inferensi berjalan tanpa membuang batch atau me-restart worker. Dengan median overhead switching hanya < 0.51% dari durasi satu step decoding dan pengenalan layout baru Decoupled Ownership Parallelism (DOP), SPLASH membukukan peningkatan throughput end-to-end serving hingga 1.30× – 1.73× lipat pada klaster NVIDIA Blackwell B200 melayani model GLM-5.3 dan DeepSeek-V3.2 pada H200.
Dekopling Kepemilikan State: Fondasi Matematis Pergantian Layout
Kunci mengapa sistem serving selama ini memaku layout statis adalah anggapan bahwa pemindahan live KV cache di tengah eksekusi terlalu mahal. Namun, arsitektur attention generasi terbaru—khususnya Multi-Head Latent Attention (MLA) yang diadopsi oleh DeepSeek dan GLM generasi terbaru—menggunakan proyeksi terkompresi berdimensi rendah ($d_c + d_r$) yang meniadakan sumbu head pada latent KV cache.
Observasi fundamental SPLASH adalah: arsitektur modern mendeskopel lokasi penyimpanan KV cache request dari cara bobot proyeksi attention di-shard. Konsekuensinya, sebuah layout paralelisme sebenarnya hanya ditentukan oleh dua keputusan ortogonal:
- Weight Sharding: Apakah bobot matriks proyeksi attention ($W_A$) di-shard ke seluruh $T$ ranks GPU ($W_A / T$, seperti pada TP) atau direplikasi penuh pada setiap rank ($W_A$, seperti pada CP dan DPA)?
- KV Cache Ownership: Rank mana yang menyimpan riwayat KV cache dari sebuah request? Apakah direplikasi pada setiap rank ($B cdot k cdot s$, seperti pada TP), di-shard per request ($B/T cdot k cdot s$, seperti pada DPA), atau di-shard melintasi panjang urutan konteks ($(B cdot k cdot s)/T$, seperti pada CP)?
Inovasi 1: Decoupled Ownership Parallelism (DOP)
Dengan memetakan ruang desain kepemilikan di atas, SPLASH menemukan kombinasi kuadran keempat yang selama ini luput dari seluruh mesin serving komersial: Decoupled Ownership Parallelism (DOP).
Dalam DOP, bobot proyeksi di-shard melintasi seluruh GPU persis seperti Tensor Parallelism ($W_A/T$), namun riwayat KV cache dari tiap request dipertahankan utuh pada satu owner GPU saja persis seperti Data-Parallel Attention. DOP tidak mereplikasi bobot proyeksi maupun KV cache:
- Ekstra Kapasitas KV 27% – 60%: Karena bobot proyeksi di-shard $1/T$, DOP membebaskan ruang VRAM sebesar $(1 - 1/T)W_A$ per GPU. Pada model skala besar seperti GLM-5.3 (78 layer FP8), penghematan ini setara dengan gigabytes ruang HBM tambahan yang langsung dialokasikan untuk menampung KV cache, meningkatkan batas admission request hingga 60% dibanding DPA murni.
- Komputasi Melalui Variable-Size All-to-All: Agar setiap GPU dapat mengeksekusi attention lokal atas riwayat KV yang lengkap, DOP menyisipkan operasi komunikasi all-to-all sebelum blok attention untuk mendistribusikan baris query $N_r$ ke owner yang sesuai, diikuti oleh reverse all-to-all setelah attention untuk mengembalikan slice aktivasi ke rank asalnya. Berbeda dengan DeepSpeed-Ulysses yang membagi urutan berdasarkan head (sehingga mewajibkan KV cache dipecah per head), DOP mengelompokkan baris berdasarkan request sehingga seluruh KV cache laten MLA tetap utuh di satu GPU tanpa fragmentasi.
Inovasi 2: Seamless Handoff & Overlapped Pipelining
Tantangan terbesar live switching adalah mencegah terjadinya bubble atau stall saat status state berpindah. SPLASH merekayasa mekanisme Seamless Handoff yang berjalan tepat pada batas batch step decoding autoregresif ($t o t+1$):
SPLASH mengevaluasi state manifest: jika beralih dari TP ke DOP, setiap rank cukup mempertahankan subset KV miliknya dan mengeksekusi discard lokal pada salinan KV yang berlebih—membebaskan VRAM secara instan dengan nol overhead transmisi jaringan.
Kolektif transfer bobot atau KV untuk layer $i$ dieksekusi secara asinkron pada background CUDA stream bersamaan dengan komputasi forward layer $i-1$. Hanya transfer layer pertama yang ter-ekspos, memangkas latensi transisi hingga ke level mikrodetik.
Fungsi scheduler $\pi(x; \theta)$ memprediksi kurva latensi per-step dari 4 layout kandidat secara real-time. Transisi hanya dipicu jika layout baru mengungguli layout lama di atas ambang histeresis batas stabilitas.
Hasil profiling mikrobenchmarks membuktikan bahwa median overhead transisi SPLASH berada di bawah 0.51% dari durasi satu langkah decoding reguler, menjadikannya nyaris tanpa biaya (virtually free) dalam siklus serving produksi.
Hasil Uji Komparatif pada NVIDIA Blackwell B200 & H200 (2026)
SPLASH diimplementasikan di atas engine serving performa tinggi SGLang 0.5.10 dan dievaluasi melayani model GLM-5.3 (78 layer FP8) pada 2 node 16x GPU NVIDIA Blackwell B200 (arsitektur prefill/decode terpisah) serta model DeepSeek-V3.2 pada klaster NVIDIA H200 SXM5:
| Serving Layout Strategy | Mekanisme Switching | KV Memory Capacity | Median Transition Overhead | Serving Throughput Speedup |
|---|---|---|---|---|
| Fixed Tensor Parallelism (TP) | Statis (No Switch) | Baseline (Replicated KV) | N/A | 1.00× (Ref) |
| Fixed DP-Attention (DPA) | Statis (No Switch) | +35% vs TP | N/A | 1.18× |
| Naive Dynamic (Draining & Restart) | Request Draining | +45% vs TP | 12.4s – 38.0s (Stall) | 0.89× (Degraded) |
| SPLASH (Adaptive 4-Layout) | Seamless Handoff | +60% vs DPA (DOP Mode) | < 0.51% Step Duration | 1.30× – 1.73× |
Data empiris membuktikan bahwa mencoba beralih layout secara konvensional (draining) justru menurunkan throughput agregat menjadi 0.89x karena GPU menganggur menunggu antrean request panjang selesai. Sebaliknya, SPLASH mengeksekusi transisi antar-keempat layout secara kontinu pada level per-step, menghasilkan lonjakan throughput serving bersih sebesar 30% hingga 73% melintasi aneka ragam kurva distribusi konteks token.
Implementasi Referensi TypeScript: SPLASH Transition & Scheduler Engine
Di bawah ini adalah implementasi sistematis algoritma Transition-Aware Scheduler dan kalkulator footprint layout memori yang merefleksikan arsitektur SPLASH:
// Production Implementation: SPLASH Dynamic Attention Layout Switching & DOP Engine
// Berdasarkan Arsitektur ICT CAS & SGLang Core (arXiv:2609.37626 - September 2026)
//
// Karakteristik Desain:
// 1. Decoupled Ownership Parallelism (DOP): Weights sharded ala TP, KV cache request-owned ala DPA
// 2. Seamless Handoff: Overlapping transfer layer i dengan komputasi layer i-1 (<0.51% overhead)
// 3. Transition-Aware Scheduler π(x; θ): Dynamic layout adaptation mengikuti profil batch reasoning
export type AttentionLayout = 'TP' | 'CP' | 'DPA' | 'DOP';
export interface ClusterHardwareProfile {
totalRanks: number; // T (misal: 8 rank B200 per node)
deviceMemoryBytes: number; // H_r (misal: 192GB HBM3e)
nvlinkBandwidthBytesSec: number; // Bandwidth inter-rank
collectiveLatencySec: number; // Latensi fixed all-gather / all-to-all
}
export interface RequestBatchState {
activeRequests: number; // B (konkurensi request)
averageContextLength: number; // s (panjang token KV cache)
queryChunkLength: number; // q (prefill chunk / 1 decode token)
kvBytesPerToken: number; // k (d_c + d_r) * b * L
projectionSizeBytes: number; // W_A (total tensor weights proyeksi attention)
}
export interface LayoutFootprintEvaluation {
layout: AttentionLayout;
weightBytesPerRank: number;
kvBytesPerRank: number;
totalMemoryBytes: number;
isFeasible: boolean;
estimatedStepLatencyMs: number;
}
export class SplashLayoutScheduler {
constructor(
private hw: ClusterHardwareProfile,
private switchHysteresisMargin: number = 0.08 // Margin 8% mencegah osilasi switching liar
) {}
/**
* Menghitung alokasi memori per rank untuk masing-masing dari 4 layout attention (Persamaan 1 arXiv:2609.37626)
*/
public evaluateLayouts(batch: RequestBatchState): LayoutFootprintEvaluation[] {
const T = this.hw.totalRanks;
const { activeRequests: B, averageContextLength: s, kvBytesPerToken: k, projectionSizeBytes: W } = batch;
const layouts: AttentionLayout[] = ['TP', 'CP', 'DPA', 'DOP'];
return layouts.map((layout) => {
let weightBytes = 0;
let kvBytes = 0;
switch (layout) {
case 'TP':
// TP: Bobot proyeksi di-shard 1/T, namun KV cache MLA direplikasi penuh pada semua rank
weightBytes = W / T;
kvBytes = B * k * s;
break;
case 'CP':
// CP: Bobot direplikasi pada semua rank, sequence KV di-shard 1/T per request
weightBytes = W;
kvBytes = (B * k * s) / T;
break;
case 'DPA':
// DPA: Bobot direplikasi pada semua rank, request didistribusikan B/T per rank
weightBytes = W;
kvBytes = Math.ceil(B / T) * k * s;
break;
case 'DOP':
// DOP: Bobot di-shard 1/T (ala TP), KV cache dipegang 1 owner rank tanpa replikasi (ala DPA)
weightBytes = W / T;
kvBytes = Math.ceil(B / T) * k * s;
break;
}
const totalMemory = weightBytes + kvBytes;
const isFeasible = totalMemory <= this.hw.deviceMemoryBytes * 0.92; // 8% headroom untuk aktivasi & workspace
// Per-step cost analytical model: komputasi + komunikasi all-to-all / all-gather
const stepLatencyMs = this.estimateStepLatency(layout, batch, isFeasible);
return {
layout,
weightBytesPerRank: weightBytes,
kvBytesPerRank: kvBytes,
totalMemoryBytes: totalMemory,
isFeasible,
estimatedStepLatencyMs: stepLatencyMs,
};
});
}
/**
* Memilih layout optimal berikutnya dengan margin histeresis transisi
*/
public selectOptimalLayout(
currentLayout: AttentionLayout,
batch: RequestBatchState
): { targetLayout: AttentionLayout; shouldSwitch: boolean; reason: string } {
const evaluations = this.evaluateLayouts(batch);
const feasibleLayouts = evaluations.filter((e) => e.isFeasible);
if (feasibleLayouts.length === 0) {
throw new Error('FATAL: Semua layout attention melebihi kapasitas HBM device. Trigger KV eviction!');
}
// Urutkan berdasarkan latensi langkah terendah
feasibleLayouts.sort((a, b) => a.estimatedStepLatencyMs - b.estimatedStepLatencyMs);
const bestCandidate = feasibleLayouts[0];
const currentEval = evaluations.find((e) => e.layout === currentLayout);
if (!currentEval || !currentEval.isFeasible) {
return {
targetLayout: bestCandidate.layout,
shouldSwitch: true,
reason: 'Current layout OOM or infeasible under active context expansion',
};
}
const performanceGain = (currentEval.estimatedStepLatencyMs - bestCandidate.estimatedStepLatencyMs) / currentEval.estimatedStepLatencyMs;
if (bestCandidate.layout !== currentLayout && performanceGain > this.switchHysteresisMargin) {
return {
targetLayout: bestCandidate.layout,
shouldSwitch: true,
reason: `Candidate ${bestCandidate.layout} outperforms ${currentLayout} by ${(performanceGain * 100).toFixed(1)}% (exceeding ${this.switchHysteresisMargin * 100}% threshold)`,
};
}
return {
targetLayout: currentLayout,
shouldSwitch: false,
reason: 'Current layout remains optimal within stable execution margin',
};
}
private estimateStepLatency(layout: AttentionLayout, batch: RequestBatchState, feasible: boolean): number {
if (!feasible) return Infinity;
const T = this.hw.totalRanks;
const { activeRequests: B, averageContextLength: s, queryChunkLength: q } = batch;
// Latensi komputasi dasar (FLOPs/Bandwidth)
const computeBase = 0.8 + (q * s * 1e-6);
let commOverhead = 0;
switch (layout) {
case 'TP':
// All-reduce pada output projection: 2 * (T - 1)/T * payload
commOverhead = (2 * (T - 1) / T) * (q * 4096 * 2) / (this.hw.nvlinkBandwidthBytesSec * 1e-3);
break;
case 'CP':
// Ring attention / All-to-all KV exchange sepanjang head/sequence
commOverhead = (T - 1) * this.hw.collectiveLatencySec * 1e3 + 0.12 * (s / 1024);
break;
case 'DPA':
// Zero attention comms, namun menanggung replikasi bobot & redundansi
commOverhead = 0.02;
break;
case 'DOP':
// Variable-size All-to-all query rows sebelum attention + output rows setelah attention
const dopPayloadBytes = (1 - 1 / T) * (B * q) * 4096 * 2;
commOverhead = (2 * dopPayloadBytes / (this.hw.nvlinkBandwidthBytesSec * 1e-3)) + (2 * this.hw.collectiveLatencySec * 1e3);
break;
}
return computeBase + commOverhead;
}
}
/**
* Eksekutor Handoff Transisi: Memindahkan KV & bobot secara non-blocking di background stream
*/
export class SplashSeamlessHandoffController {
public static calculateHandoffManifest(
sourceLayout: AttentionLayout,
targetLayout: AttentionLayout,
totalLayers: number = 78
): { weightTransferPrimitive: 'discard' | 'all-gather' | 'none'; kvTransferPrimitive: 'discard' | 'all-to-all' | 'all-gather' | 'none' } {
let weightPrim: 'discard' | 'all-gather' | 'none' = 'none';
let kvPrim: 'discard' | 'all-to-all' | 'all-gather' | 'none' = 'none';
// Transisi matriks sesuai Gambar 3 (arXiv:2609.37626)
if ((sourceLayout === 'TP' || sourceLayout === 'DOP') && (targetLayout === 'CP' || targetLayout === 'DPA')) {
weightPrim = 'all-gather'; // Memulihkan bobot replikasi penuh dari sharded shards
} else if ((sourceLayout === 'CP' || sourceLayout === 'DPA') && (targetLayout === 'TP' || targetLayout === 'DOP')) {
weightPrim = 'discard'; // Membuang shard bobot non-lokal (nol beban jaringan)
}
if (sourceLayout === 'TP' && targetLayout === 'DOP') {
kvPrim = 'discard'; // Setiap rank hanya mempertahankan request miliknya, buang replika
} else if (sourceLayout === 'DOP' && targetLayout === 'TP') {
kvPrim = 'all-gather'; // Replikasi KV cache ke semua rank
} else if (sourceLayout === 'DPA' && targetLayout === 'CP') {
kvPrim = 'all-to-all'; // Re-shard sequence context antar worker
}
return { weightTransferPrimitive: weightPrim, kvTransferPrimitive: kvPrim };
}
}
Implikasi Strategis bagi Industri Infrastruktur AI 2026
Munculnya arsitektur seperti SPLASH menandai peralihan fundamental dari era statically-allocated inference clusters menuju fluid dynamic-topology serving. Di era di mana beban kerja reasoning agentic mendominasi konsumsi daya GPU data center, memaksakan satu konfigurasi paralelisme statis adalah pemborosan modal infrastruktur bernilai jutaan dolar.
Dengan mengadopsi Decoupled Ownership Parallelism dan live attention switching, penyedia layanan cloud AI hyperscaler dan enterprise self-hosted stack dapat memeras efisiensi maksimum dari hardware generasi baru seperti NVIDIA Blackwell B200 dan GB200 NVL72. SPLASH membuktikan bahwa fleksibilitas topologi di level software mampu menghasilkan percepatan throughput setara lompatan generasi arsitektur silikon fisik tanpa menambah satu watt pun konsumsi energi data center.
Referensi & Sumber Terverifikasi
- [1]SPLASH: Switching Parallel Layouts of Attention with Seamless Handoff for LLM Serving(arXiv:2609.37626 [cs.DC / cs.AI] — Chuan Liu, Shuoming Zhang, Zhicheng Li, Qianqi Sun, Ruiyuan Xu, Qiuchu Yu, Xiyu Shi, Huimin Cui, Jiacheng Zhao (ICT CAS, SGLang Team))
- [2]SGLang: Efficient Execution of Structured Language Model Programs and Decoupled Attention(LMSYS Org & SGLang Open-Source Architecture Reports)
- [3]DeepSeek-V3.2 & Multi-Head Latent Attention (MLA) Distributed Serving Specifications(DeepSeek-AI Architecture Whitepaper)
- [4]DeepSpeed-Ulysses: System Optimizations for Enabling Training of Extreme Long Sequences on GPUs(Microsoft Research & IEEE IPDPS Proceedings)
- [5]NVIDIA Blackwell B200 Architecture & NVLink 5 Multi-GPU Interconnect Microbenchmarking(NVIDIA Enterprise Technical Documentation)
Butuh Arsitektur Web & AI Berkualitas Tinggi?
Tim engineering NEWSAINT siap membantu merancang website berkecepatan tinggi, sistem AI autonomous, dan solusi SaaS terukur untuk bisnis Anda.
Artikel Terkait Lainnya

Bellman Language Models (arXiv:2610.24871): Discretize-Then-Decide, Eliminasi Redundant LLM Invocations hingga 98%, dan Optimal Control pada Agentic Workflows
Analisis arsitektur sistemik riset frontier arXiv:2610.24871 (Adarsh Vatsa & William Eiers): Mengapa workflow agen otonom terus-menerus memboroskan komputasi untuk mendeduksi ulang keputusan yang berulang pada setiap turn? Memperkenalkan Bellman Language Models (BLM) dan paradigma "Discretize, Then Decide" yang memodelkan interaksi agen sebagai Markov Decision Process (MDP) diskret dan menyelesaikannya via persamaan optimalitas Bellman. Pada benchmark tau^2-bench telecom, controller mandiri tanpa model LLM mampu menyelesaikan 79% tugas; dipasangkan dengan Qwen3.8-27B, akurasi melonjak dari 29% menjadi 96% dengan pemangkasan 93% panggilan model; serta memangkas 98% biaya Claude Opus 5.5. Artikel ini membedah teori saturasi ruang keputusan, formulasi Bellman controller, batasan pada open synthesis, dan implementasi TypeScript produksi.

Acceptance Is Not Speed (arXiv:2610.23818): Ilusi Akselerasi Lossy Speculative Decoding, Mengapa Relaxed Sampling Memperpanjang Reasoning Trace 1.54x, dan Solusi Length-Corrected Verification
Investigasi empiris komprehensif arXiv:2610.23818 (Chiatzen Wang, Bill Xu, Haochen Gu, Hongyang Zhang — University of Waterloo): Mengapa peningkatan rasio penerimaan token (accepted length) pada lossy speculative decoding gagal menghasilkan akselerasi wall-clock? Evaluasi 360 konfigurasi lintas 12 pasangan target-drafter (GPT-OSS-20B, Qwen3-8B, Llama-3.1-8B dengan EAGLE-3, DSpark, dan standalone drafter) membuktikan fenomena sistemik "Length Inflation": relaksasi verifikasi menerima token probabilitas rendah yang mendeformasi lintasan penalaran, menyebabkan model berpikir 1.54x lebih panjang (bahkan 3.3x pada EAGLE-3). Lebih dari 90% token ekstra terbuang di dalam reasoning trace (<think>), memicu kehabisan token budget pada AIME24 dan evaluasi redundan pada GSM8K. Artikel ini membedah taksonomi 5 metode lossy (CACTUS, Mentored Decoding, rFSD, Speculative Cascades), batas matematis net-win, serta implementasi TypeScript Length-Corrected Speculative Harness.

DLite (arXiv:2610.23787): History-Free Speculative Decoding untuk Agentic AI, Eliminasi Draft KV Cache, dan Akselerasi 2.74x pada SWE-bench
Bedah arsitektur dan evaluasi empiris riset frontier arXiv:2610.23787 (Jiaming Xu, Guohao Dai et al. — SJTU, Tsinghua, Shanghai Innovation Institute): Mengapa metode speculative decoding konvensional seperti EAGLE-3, DFlash, dan DSpark mengalami degradasi acceptance length hingga 80% pada beban kerja agen otonom? DLite memperkenalkan paradigma History-Free Speculative Decoding yang sepenuhnya mengeliminasi draft KV cache, menggunakan parallel backbone berbasis reuse hidden state target model dengan learnable depth embeddings, lightweight low-rank RNN sequential head di ruang representasi tersembunyi, serta two-stage distillation training (isomorphic teacher warm-up dan total variation alignment). Evaluasi pada Qwen3-4B dan Qwen3-8B via SGLang membuktikan lonjakan acceptance length hingga 3.19 token dan akselerasi end-to-end 2.74x pada SWE-bench tanpa kehilangan kualitas generasi.