<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Rollout Data | KVCache.AI</title>
    <link>https://kvcache.ai/tag/rollout-data/</link>
      <atom:link href="https://kvcache.ai/tag/rollout-data/index.xml" rel="self" type="application/rss+xml" />
    <description>Rollout Data</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 20 Aug 2026 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://kvcache.ai/media/logo.svg</url>
      <title>Rollout Data</title>
      <link>https://kvcache.ai/tag/rollout-data/</link>
    </image>
    
    <item>
      <title>Mooncake for Miles: From Fragmented Rollout Data to Efficient Bulk I/O</title>
      <link>https://kvcache.ai/blog/mooncake-rl-rollout-data-transfer/</link>
      <pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://kvcache.ai/blog/mooncake-rl-rollout-data-transfer/</guid>
      <description>&lt;h2 id=&#34;rollout-data-in-disaggregated-rl-systems&#34;&gt;Rollout Data in Disaggregated RL Systems&lt;/h2&gt;
&lt;p&gt;Reinforcement learning for large language models combines two very different workloads: &lt;strong&gt;rollout generation&lt;/strong&gt; and &lt;strong&gt;model training&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;During rollout, inference workers run the current policy on a set of prompts and generate responses. Along the way, they produce the information required by the learning algorithm, including generated tokens, masks, log probabilities, rewards, sequence lengths, sample identifiers, and other metadata. Together, these outputs form the &lt;strong&gt;rollout data&lt;/strong&gt; that will be consumed by the next training step.&lt;/p&gt;
&lt;p&gt;At small scale, generation and training can share the same execution environment. At larger scale, however, modern RL systems increasingly adopt a &lt;strong&gt;disaggregated architecture&lt;/strong&gt;, where rollout generation and training are deployed as separate worker groups, often across different processes, GPUs, or machines.&lt;/p&gt;
&lt;p&gt;The two stages have fundamentally different resource and execution characteristics. Rollout is an inference-heavy workload whose throughput depends on decoding efficiency, batching, and request scheduling, while training relies on large, highly synchronized tensor computations. Separating them allows each side to be scaled and scheduled independently instead of forcing both workloads into the same execution pattern.&lt;/p&gt;
&lt;p&gt;This separation also enables &lt;strong&gt;pipeline-level concurrency&lt;/strong&gt;. Miles can train on rollout &lt;em&gt;N&lt;/em&gt; while rollout workers are already generating rollout &lt;em&gt;N+1&lt;/em&gt;. Asynchronous RL systems can therefore allow rollout and training workers to progress at different rates rather than making one stage wait for the other after every operation.
The benefit is better resource utilization and greater flexibility in how inference and training capacity are provisioned. But disaggregation also introduces a new systems boundary: &lt;strong&gt;the data produced by rollout workers must now move to a different set of workers before training can consume it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That handoff sits directly between generation and the next policy update. A slow transfer can leave trainers waiting for data and keep memory occupied on rollout workers longer than necessary. For a distributed RL system such as Miles, efficiently moving this &lt;strong&gt;structured rollout data from the inference side to the training side&lt;/strong&gt; therefore becomes an important part of the end-to-end RL pipeline.&lt;/p&gt;
&lt;h2 id=&#34;what-makes-rl-rollout-data-transfer-challenging&#34;&gt;What Makes RL Rollout Data Transfer Challenging&lt;/h2&gt;
&lt;p&gt;RL rollout data differs significantly from the large, regular tensors commonly moved in distributed training.&lt;/p&gt;
&lt;p&gt;A rollout batch is usually a &lt;strong&gt;heterogeneous structured object&lt;/strong&gt; rather than a single contiguous tensor. Depending on the framework and algorithm, it may contain generated tokens, loss masks, log probabilities, rewards, sequence lengths, sample identifiers, routing information, metadata, and other auxiliary fields. These values can be represented as tensors, NumPy arrays, Python scalar lists, variable-length per-sample arrays, bytes, or arbitrary Python objects.&lt;/p&gt;
&lt;p&gt;Several properties make this data particularly challenging to move efficiently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Challenge 1: Heterogeneous Data Types and Complex Semantics&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Different rollout fields have fundamentally different representations and semantics. Dense tensors and numeric arrays can be transferred efficiently as typed buffers, while ragged sequences need row-boundary information, scalar lists need their original values preserved, and metadata or Python objects may require more general encoding. At the same time, the trainer must reconstruct the exact structure expected by the RL framework, including dtype, shape, row order, null state, and metadata. A generic serializer can handle these objects functionally, but often at the cost of extra conversion, copying, and reconstruction. Efficient rollout transfer therefore needs to understand both the physical representation and the logical structure of each field.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Challenge 2: Highly Fragmented Memory Layout&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rollout data can contain a very large number of small memory allocations. In the captured Miles workload, major fields such as tokens, loss_masks, and rollout_log_probs are represented as list[np.ndarray], with one NumPy array allocated for each sample. As batch size grows, transferring these fragments individually introduces repeated memory registration and Store operations, while serializing the full Python object requires walking, copying, and rebuilding a large object graph. The challenge is to turn fragmented logical data into efficient bulk transfers without losing its original structure.&lt;/p&gt;
&lt;p&gt;Together, these challenges make rollout data movement more than a bandwidth problem: the system must efficiently move fragmented, heterogeneous data while preserving its structure.&lt;/p&gt;
&lt;p&gt;An effective data path needs to satisfy several requirements at the same time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Efficiency:&lt;/strong&gt; avoid excessive serialization, copying, object reconstruction, and per-allocation transfer overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correctness:&lt;/strong&gt; preserve field types, shapes, row boundaries, null state, metadata, and Python-level values through the round trip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; continue to perform well as the number of samples, object fragments, and total payload size increase.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibility:&lt;/strong&gt; support heterogeneous fields without forcing the RL framework to flatten or rewrite its native rollout representation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predictable handoff latency:&lt;/strong&gt; deliver the batch quickly enough that the trainer does not stall waiting for rollout data.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;powering-miles-rollout-data-transfer-with-mooncake&#34;&gt;Powering Miles Rollout Data Transfer with Mooncake&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Miles&lt;/strong&gt; is a high-performance reinforcement learning framework for large-scale model post-training. It combines &lt;strong&gt;SGLang for high-throughput rollout generation&lt;/strong&gt; with &lt;strong&gt;Megatron-LM for scalable training&lt;/strong&gt;, and also provides a PyTorch FSDP2 backend for workloads that prefer to train Hugging Face model implementations directly. Miles supports fully asynchronous RL, where rollout and training workers are decoupled and can progress independently, together with features such as fast in-loop weight updates, agentic rollout, low-precision training, and fault tolerance for large-scale production RL workloads.&lt;/p&gt;
&lt;p&gt;This disaggregated and asynchronous design makes the rollout-to-training data path a critical part of the RL pipeline. Rollout batches are structured and heterogeneous, often containing fragmented per-sample data and framework-specific metadata, making efficient transfer and reconstruction increasingly important as workload scale grows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mooncake&lt;/strong&gt; provides a high-performance data plane for distributed AI workloads. For RL rollout data, it extends this data plane with structured-object transfer, allowing heterogeneous and fragmented rollout objects to be moved while preserving their original structure and semantics.&lt;/p&gt;
&lt;p&gt;Mooncake has now been integrated into Miles as a rollout data-transfer backend. On rollout data captured from Miles, the integration delivers substantially lower transfer latency than the existing Ray path: remote GET is roughly &lt;strong&gt;10–14× faster&lt;/strong&gt;, while PUT improves by about &lt;strong&gt;1.2–1.6×&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The result is a faster rollout-to-training handoff without changing the RL programming model, providing Miles with a more efficient data path for large, structured rollout workloads.&lt;/p&gt;
&lt;h2 id=&#34;how-rollout-data-moves-through-the-rl-pipeline&#34;&gt;How Rollout Data Moves Through the RL Pipeline&lt;/h2&gt;
&lt;p&gt;Miles supports both synchronous and asynchronous training loops. In either mode, once rollout workers and trainers are deployed in separate processes or on separate machines, each completed rollout batch must cross that boundary before it can be consumed by the next training step.&lt;/p&gt;
&lt;p&gt;A useful design principle is to separate the &lt;strong&gt;control plane&lt;/strong&gt; from the &lt;strong&gt;data plane&lt;/strong&gt;. The framework scheduler decides where a rollout batch should go, but it should not carry the bulk payload itself. Instead, it passes a lightweight transfer reference that excludes tensor payloads and Store chunk layouts, while still allowing JSON-safe metadata when needed. The actual rollout payload takes a separate path:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the framework scheduler passes the transfer reference;&lt;/li&gt;
&lt;li&gt;Mooncake stores and transfers the payload;&lt;/li&gt;
&lt;li&gt;the training worker reconstructs the original object before running the training step;&lt;/li&gt;
&lt;li&gt;after all readers finish, the framework removes the short-lived Store object.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This separation keeps scheduling decisions lightweight while allowing the bulk rollout payload to move through a dedicated data path.&lt;/p&gt;
&lt;h3 id=&#34;what-miles-actually-transfers&#34;&gt;What Miles Actually Transfers&lt;/h3&gt;
&lt;p&gt;The rollout data captured from &lt;strong&gt;Miles&lt;/strong&gt; makes this data path concrete. For a given framework configuration, the field contract is stable, but the fields do not share one convenient in-memory representation. They fall into three broad groups:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field Group&lt;/th&gt;
&lt;th&gt;Miles Representation&lt;/th&gt;
&lt;th&gt;Transfer Concern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Token, mask, and log-probability rows&lt;/td&gt;
&lt;td&gt;Per-sample numeric rows&lt;/td&gt;
&lt;td&gt;Many separate row objects; lengths may differ by sample.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDs, lengths, rewards, and flags&lt;/td&gt;
&lt;td&gt;Python scalar lists&lt;/td&gt;
&lt;td&gt;Small in bytes but required by training.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional and object metadata&lt;/td&gt;
&lt;td&gt;Python values, tensor dictionaries, or nested objects&lt;/td&gt;
&lt;td&gt;Preserve structure, nulls, and enabled-feature semantics.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The first group carries most of the bytes in our capture. The other fields are smaller, but they cannot be discarded or normalized away: they carry sample identity, lengths, rewards, feature state, and bookkeeping information. Their exact size depends on the workload; the benchmark section gives one measured example.&lt;/p&gt;
&lt;h3 id=&#34;miles-uses-a-completed-dict-handoff&#34;&gt;Miles Uses a Completed-Dict Handoff&lt;/h3&gt;
&lt;p&gt;In &lt;strong&gt;Miles&lt;/strong&gt;, the current handoff begins after the complete rollout dictionary is ready. The producer calls &lt;code&gt;put(data, type=&amp;quot;dict&amp;quot;)&lt;/code&gt;, the scheduler carries the returned reference, and the trainer calls &lt;code&gt;get&lt;/code&gt; to reconstruct the original dictionary.&lt;/p&gt;
&lt;center&gt;
&lt;img src=&#34;rollout-data-plane.svg&#34;
     alt=&#34;Synchronous rollout transfer for Miles&#34;
     style=&#34;width:60%; max-width:1100px&#34;/&gt;
&lt;/center&gt;
&lt;p&gt;&lt;em&gt;Figure 1. Miles uses synchronous &lt;code&gt;put&lt;/code&gt; and &lt;code&gt;get&lt;/code&gt; for a completed rollout dict. The reference travels through the scheduler, while Mooncake moves the payload through the Store data plane.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The individual transfer calls are synchronous. The producer returns the reference only after &lt;code&gt;put&lt;/code&gt; completes, and the trainer waits for &lt;code&gt;get&lt;/code&gt; to finish before consuming the object.&lt;/p&gt;
&lt;p&gt;This does not prevent the RL pipeline itself from being asynchronous. Miles can generate rollout &lt;em&gt;N+1&lt;/em&gt; while training on rollout &lt;em&gt;N&lt;/em&gt;. In other words, the concurrency sits above the transfer operation: each individual handoff is synchronous, while different rollout and training stages can overlap at the pipeline level.&lt;/p&gt;
&lt;h2 id=&#34;how-mooncake-preserves-and-transfers-miles-rollout-data&#34;&gt;How Mooncake Preserves and Transfers Miles Rollout Data&lt;/h2&gt;
&lt;p&gt;Mooncake tackles the two challenges at different layers. It keeps the structure visible long enough to choose an efficient representation for each field: tensors and arrays stay typed, ragged rows carry compact boundary metadata, and Python values retain what GET needs to rebuild them. It then turns fragmented memory into bulk I/O. A copy plan packs eligible small rows directly into reusable, registered BufferPool chunks, while large contiguous tensors and arrays can use native Store paths. This avoids both extremes: serializing the entire dict as one opaque blob or issuing a Store operation for every small allocation.&lt;/p&gt;
&lt;p&gt;The resulting payload members are published as a bundle. Its manifest records where those members live and how they fit together, and becomes visible only after the payload is ready. GET follows that description in reverse to fetch and reconstruct the original Miles dict. Miles still uses the small public interface, &lt;code&gt;put(data, type=&amp;quot;dict&amp;quot;)&lt;/code&gt; and &lt;code&gt;get(ref, type=&amp;quot;dict&amp;quot;)&lt;/code&gt;; the schema, field layouts, transfer plan, and reconstruction remain inside Mooncake.&lt;/p&gt;
&lt;center&gt;
&lt;img src=&#34;structured-transfer-architecture.svg&#34;
     alt=&#34;Mooncake structured-object transfer architecture&#34;
     style=&#34;width:70%; max-width:1100px&#34;/&gt;
&lt;/center&gt;
&lt;p&gt;&lt;em&gt;Figure 2. Schema and leaf expansion expose each field&amp;rsquo;s type and structure. Field-specific encoding produces typed payload members and reconstruction metadata; the Bundle Store publishes their manifest last. Eligible fragmented transfers use BufferPool-backed staging, and GET follows the same structure in reverse.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;choose-a-layout-for-each-field&#34;&gt;Choose a Layout for Each Field&lt;/h3&gt;
&lt;p&gt;Mooncake first expands the dict into leaves that can be encoded efficiently. Arrays and tensors remain typed, ragged rows carry compact boundary metadata, and supported Python values retain the information needed to reconstruct them. A framework-provided schema fixes the stored representation for ambiguous or performance-sensitive fields; when no schema is supplied, Mooncake infers one from the observed values.&lt;/p&gt;
&lt;p&gt;The same choice applies to multimodal data. Processed pixels and related model inputs can stay on the tensor path. PIL images, encoded PNG or JPEG bytes, and variable-length media lists use media-aware layouts that preserve their boundaries and reconstruction metadata without forcing every representation through the same serializer.&lt;/p&gt;
&lt;h3 id=&#34;turn-fragmented-memory-into-bulk-io&#34;&gt;Turn Fragmented Memory into Bulk I/O&lt;/h3&gt;
&lt;p&gt;Sending every row separately creates thousands of registrations and Store requests. Concatenating a whole field first avoids that request count, but adds a full-size temporary. Mooncake instead builds a copy plan and fills reusable, registered BufferPool chunks as they are needed. Its native path copies eligible numeric rows directly into those chunks, avoiding Python row loops and temporary concatenations. Large contiguous arrays and tensors still use direct or native paths when the Store supports them.&lt;/p&gt;
&lt;h3 id=&#34;publish-complete-bundles-and-rebuild-directly&#34;&gt;Publish Complete Bundles and Rebuild Directly&lt;/h3&gt;
&lt;p&gt;Mooncake publishes the bundle manifest only after all payloads and metadata are ready, so a reader never sees a half-written Miles dict. On GET, the manifest identifies the members to fetch and the structured metadata describes how to rebuild each field. Eligible reads can target BufferPool-backed destinations without an intermediate &lt;code&gt;bytes&lt;/code&gt; object, and typed ragged rows can view the result buffer directly.&lt;/p&gt;
&lt;p&gt;The trainer releases its local BufferPool-backed result after use. Once all readers finish, Miles removes the short-lived Store object and Mooncake reclaims its payload chunks and manifest.&lt;/p&gt;
&lt;center&gt;
&lt;img src=&#34;challenge-response.svg&#34;
     alt=&#34;Rollout data challenges and Mooncake optimizations&#34;
     style=&#34;width:50%; max-width:1100px&#34;/&gt;
&lt;/center&gt;
&lt;p&gt;&lt;em&gt;Figure 3. The two main Miles rollout data challenges map directly to Mooncake&amp;rsquo;s structured encoding and bulk-transfer optimizations.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;performance-results&#34;&gt;Performance Results&lt;/h2&gt;
&lt;p&gt;For a fixed framework configuration, switching models does not by itself change the field contract. Transfer size instead follows the number of samples, prompt and response lengths, and optional fields such as teacher log probabilities, routing information, or multimodal inputs.&lt;/p&gt;
&lt;h3 id=&#34;benchmark-payload&#34;&gt;Benchmark Payload&lt;/h3&gt;
&lt;p&gt;Miles generated the source data with Qwen3-0.6B on math prompts (&lt;code&gt;rollout_id=0&lt;/code&gt;, 8 source samples). Every response in this capture has 256 tokens. For the benchmark, the three large numeric fields were normalized to typed ndarray rows while preserving their values, row lengths, dtypes, and per-sample fragmentation. Averaged across those samples, the logical payload breaks down as follows:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part of One Captured Sample&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Calculation&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Logical Bytes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tokens&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;Average prompt-plus-response token count x 4 B (&lt;code&gt;int32&lt;/code&gt;)&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;~1,338 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;loss_masks&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;256 entries x 4 B (&lt;code&gt;int32&lt;/code&gt;)&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1,024 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rollout_log_probs&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;256 entries x 4 B (&lt;code&gt;float32&lt;/code&gt;)&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1,024 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalar and object fields&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;IDs, lengths, rewards, flags, and version metadata&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;~36 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;&lt;strong&gt;~3,422 B&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The first three fields account for about 3,386 bytes, or 98.9% of this particular sample layout. Larger benchmark payloads repeat the eight captured samples, preserving their field types and fragmented allocation pattern while increasing the logical sample count. The calculation describes this capture; it does not define a fixed Miles sample size.&lt;/p&gt;
&lt;center&gt;
&lt;img src=&#34;rollout-object-anatomy.svg&#34;
     alt=&#34;Miles rollout object anatomy&#34;
     style=&#34;width:50%; max-width:1100px&#34;/&gt;
&lt;/center&gt;
&lt;p&gt;&lt;em&gt;Figure 4. The measured composition of one sample in the Qwen3-0.6B benchmark capture.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;transfer-results&#34;&gt;Transfer Results&lt;/h3&gt;
&lt;p&gt;The benchmark measures the completed flat-dict handoff used by Miles and compares the Miles Ray backend with Mooncake structured-object transfer.&lt;/p&gt;
&lt;p&gt;PUT is one timed backend call after the producer loads the payload. GET is the mean of three remote-consumer trials after one warmup. Reference serialization and scheduler handoff are outside the timed region. These numbers cover payload transfer and reconstruction, not end-to-end training throughput.&lt;/p&gt;
&lt;p&gt;Across the tested payload sizes, Mooncake makes Miles GET roughly 10–14x faster than the Ray backend. PUT improves by about 1.2–1.6x.&lt;/p&gt;
&lt;center&gt;
&lt;img src=&#34;miles-get-latency.svg&#34;
     alt=&#34;Miles GET latency benchmark&#34;
     style=&#34;width:40%; max-width:1100px&#34;/&gt;
&lt;/center&gt;
&lt;p&gt;&lt;em&gt;Figure 5. Mooncake provides roughly 10–14x faster GET for this fragmented Miles rollout layout. The vertical axis uses a logarithmic scale.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;PUT shows a smaller gain. Its timed path includes Python-object traversal, ragged-row packing, metadata and manifest construction, and payload transfer. GET improves more for this workload, and the trainer must finish it before starting the training step.&lt;/p&gt;
&lt;h2 id=&#34;beyond-the-miles-integration&#34;&gt;Beyond the Miles Integration&lt;/h2&gt;
&lt;p&gt;Mooncake also supports DataProto-based integrations that publish rollout fields incrementally and read selected fields or rows. This is a separate handoff protocol from the completed flat dict used by Miles, so its API and lifecycle are outside the scope of this integration.&lt;/p&gt;
&lt;p&gt;The structured-object layer is not limited to rollout data. It has also been validated and used for COO sparse tensors, where typed &lt;code&gt;indices&lt;/code&gt; and &lt;code&gt;values&lt;/code&gt; travel with their shape and structural metadata.&lt;/p&gt;
&lt;h2 id=&#34;what-comes-next&#34;&gt;What Comes Next&lt;/h2&gt;
&lt;p&gt;The Miles integration establishes the basic data path. The main priority now is to validate, optimize, and integrate it across a wider range of RL workloads.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cover more RL data shapes.&lt;/strong&gt; We have validated the Miles integration with real Miles rollout batches. A separate VLA workload was validated through ROLL. The next step is to extend that work to more multimodal and VLA workloads, agentic RL, world-model training, and RL for video-generation or diffusion models. Their rollout objects combine media, trajectories, actions, rewards, and intermediate state in different ways, so each integration should start with real data and end-to-end training.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimize for their actual data shapes.&lt;/strong&gt; Media-heavy samples, long or incrementally growing trajectories, and batches with many small fields stress different parts of the path. Profiling real workloads will guide improvements to field encoding and reconstruction, packing, request count, metadata handling, and partial reads instead of relying on dense synthetic buffers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isolate rollout data from KV cache workloads.&lt;/strong&gt; Mooncake needs separate accounting, quotas, and eviction policy for short-lived rollout data and KV cache data, so a burst of rollout traffic cannot evict latency-sensitive cache entries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluate other structured data paths.&lt;/strong&gt; Outside RL, other intermediate artifacts may fit the same typed-payload-plus-metadata model. They should be added only after their real layout, access pattern, and lifetime are understood.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;acknowledgements&#34;&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work crossed several repository boundaries, and so did its review and validation. Beyond the completed Miles integration, integration work with &lt;a href=&#34;https://github.com/THUDM/slime&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;slime&lt;/a&gt; and &lt;a href=&#34;https://github.com/alibaba/ROLL&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ROLL&lt;/a&gt; is also ongoing. We thank Xinpeng Zhao (&lt;a href=&#34;https://github.com/zxpdemonio&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@zxpdemonio&lt;/a&gt;), Teng Ma (&lt;a href=&#34;https://github.com/stmatengss&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@stmatengss&lt;/a&gt;), Xingyuan Wu (&lt;a href=&#34;https://github.com/yokinoshitayoki&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@yokinoshitayoki&lt;/a&gt;), &lt;a href=&#34;https://github.com/fzyzcjy&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@fzyzcjy&lt;/a&gt;, &lt;a href=&#34;https://github.com/guapisolo&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@guapisolo&lt;/a&gt;, Xuchun Shang (&lt;a href=&#34;https://github.com/XucSh&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@XucSh&lt;/a&gt;), Bo Gao (&lt;a href=&#34;https://github.com/Bo-Vincent&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@Bo-Vincent&lt;/a&gt;), He Zhou (&lt;a href=&#34;https://github.com/ehuohz&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@ehuohz&lt;/a&gt;), Yufeng He (&lt;a href=&#34;https://github.com/he-yufeng&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@he-yufeng&lt;/a&gt;), Zilin Zhu (&lt;a href=&#34;https://github.com/zhuzilin&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@zhuzilin&lt;/a&gt;), Lei Li (&lt;a href=&#34;https://github.com/lilei199908&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@lilei199908&lt;/a&gt;), Haizhou Zhao (&lt;a href=&#34;https://github.com/hydrozhao&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@hydrozhao&lt;/a&gt;), Wei Gao (&lt;a href=&#34;https://github.com/gaow0007&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@gaow0007&lt;/a&gt;), and Zhiyuan Cheng (&lt;a href=&#34;https://github.com/SendoRay&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;@SendoRay&lt;/a&gt;) for their contributions across Mooncake implementation and review, Miles integration and validation, and design feedback, review, and testing for the slime and ROLL integrations.&lt;/p&gt;
&lt;h2 id=&#34;related-links&#34;&gt;Related Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Mooncake project: &lt;a href=&#34;https://github.com/kvcache-ai/Mooncake&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://github.com/kvcache-ai/Mooncake&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mooncake documentation: &lt;a href=&#34;https://kvcache-ai.github.io/Mooncake/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;https://kvcache-ai.github.io/Mooncake/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Miles Mooncake rollout transfer user guide: &lt;a href=&#34;https://github.com/radixark/miles/pull/2535&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;radixark/miles#2535&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
