<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ray on Synaptic Radio</title><link>https://synapticradio.com/tags/ray/</link><description>Recent content in Ray on Synaptic Radio</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>anshuman264@gmail.com (Anshuman Sahoo)</managingEditor><webMaster>anshuman264@gmail.com (Anshuman Sahoo)</webMaster><copyright>Anshuman Sahoo</copyright><lastBuildDate>Fri, 28 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://synapticradio.com/tags/ray/index.xml" rel="self" type="application/rss+xml"/><item><title>Ray mental model: tasks, actors, objects, scheduling, placement</title><link>https://synapticradio.com/post/ray-mental-model/</link><pubDate>Fri, 28 Aug 2026 00:00:00 +0000</pubDate><author>anshuman264@gmail.com (Anshuman Sahoo)</author><guid>https://synapticradio.com/post/ray-mental-model/</guid><description>&lt;p>Ray is best understood as a distributed execution substrate for Python programs. It lets an application express stateful and stateless units of work while the runtime handles placement, resource accounting, object references, retries, and cluster membership. Ray Data, Ray Train, Ray Serve, and many RL stacks are higher-level patterns on top of these primitives.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Primitive&lt;/th>
&lt;th>Use it for&lt;/th>
&lt;th>Systems implication&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Task&lt;/td>
&lt;td>Stateless or short-lived distributed function calls&lt;/td>
&lt;td>Cheap parallel fan-out; dependencies are object refs; retries can be safe when work is idempotent.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Actor&lt;/td>
&lt;td>Stateful, long-lived process such as a model server, environment pool, cache manager, or trainer coordinator&lt;/td>
&lt;td>Owns mutable state and resources; lifecycle/failure semantics matter; ideal for GPU-bound stateful services.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Object reference / object store&lt;/td>
&lt;td>Passing immutable results between tasks and actors&lt;/td>
&lt;td>Enables zero/low-copy local sharing where possible, distributed ownership, spilling, and backpressure-sensitive pipelines.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Placement group&lt;/td>
&lt;td>Reserve/arrange bundles of CPUs/GPUs across nodes&lt;/td>
&lt;td>Expresses co-location or anti-affinity constraints; critical when NCCL/NVLink/RDMA topology matters.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Resource labels&lt;/td>
&lt;td>CPU, GPU, custom accelerator or logical resource quantities&lt;/td>
&lt;td>Turns scheduling into explicit resource matching instead of hidden process assumptions.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Autoscaling + job/runtime environment&lt;/td>
&lt;td>Cluster elasticity and dependency isolation&lt;/td>
&lt;td>Useful for bursty data/inference jobs; dangerous if startup/model-loading time is ignored in SLO planning.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The critical design choice is where state lives. If a unit of work is cheap and recomputable, prefer tasks. If it owns an expensive model, cache, connection pool, simulator, or device context, prefer actors. Once actors own scarce accelerators, placement and backpressure become architecture, not implementation detail.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Conceptual Ray pattern&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@ray.remote&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num_gpus&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">RolloutWorker&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="o">**&lt;/span>&lt;span class="n">init&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">engine&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">load_inference_engine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">generate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">prompts&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">policy_version&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">trajectories&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">prompts&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">policy_version&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@ray.remote&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num_gpus&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Learner&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">batch&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">new_policy_version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># The orchestrator moves references/metadata, not Python objects by value.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="references">References
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/walkthrough.html" target="_blank" rel="noopener"
>Ray Core walkthrough&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/key-concepts.html" target="_blank" rel="noopener"
>Ray Core key concepts&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/tasks.html" target="_blank" rel="noopener"
>Ray tasks&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/actors.html" target="_blank" rel="noopener"
>Ray actors&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/objects.html" target="_blank" rel="noopener"
>Ray objects&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/scheduling/index.html" target="_blank" rel="noopener"
>Ray scheduling&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/scheduling/resources.html" target="_blank" rel="noopener"
>Ray resources&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/scheduling/placement-group.html" target="_blank" rel="noopener"
>Ray placement groups&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/fault_tolerance/tasks.html" target="_blank" rel="noopener"
>Task fault tolerance&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/fault_tolerance/actors.html" target="_blank" rel="noopener"
>Actor fault tolerance&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/ray-core/handling-dependencies.html" target="_blank" rel="noopener"
>Runtime environments&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.ray.io/en/latest/cluster/vms/user-guides/configuring-autoscaling.html" target="_blank" rel="noopener"
>Configuring autoscaling&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>