LeetLLM
My PlanLearnGlossaryTracksPracticeBlog
LeetLLM

Your go-to resource for mastering AI & LLM systems.

Product

  • Learn
  • Glossary
  • Tracks
  • Practice
  • Blog
  • RSS

Legal

  • Terms of Service
  • Privacy Policy

© 2026 LeetLLM. All rights reserved.

All Topics
Your Progress
0%

0 of 177 articles completed

🛠️Computing Foundations0/9
Git, Shell, Linux for AIDocker for Reproducible AIPython for AI EngineeringNumPy and Tensor ShapesCUDA for ML TrainingMPS & Metal for ML on MacData Structures for AISQL and Data ModelingAlgorithms for ML Engineers
📊Math & Statistics0/8
Gradients and BackpropVectors, Matrices & TensorsLinear Algebra for MLAdam, Momentum, SchedulersProbability for Machine LearningStatistics and UncertaintyDistributions and SamplingHypothesis Tests, Intervals, and pass@k
📚Preparation & Prerequisites0/13
Neural Networks from ScratchCNNs from ScratchTraining & BackpropagationSoftmax, Cross-Entropy & OptimizationRNNs, LSTMs, GRUs, and Sequence ModelingAutoencoders and VAEsThe Transformer Architecture End-to-EndLanguage Modeling & Next TokensFrom GPT to Modern LLMsPrompt Engineering FundamentalsCalling LLM APIs in ProductionFirst AI App End-to-EndThe LLM Lifecycle
🧮ML Algorithms & Evaluation0/11
Linear Regression from ScratchLogistic Regression and MetricsDecision Trees, Forests, and BoostingReinforcement Learning BasicsValidation and LeakageClustering and PCACore Retrieval AlgorithmsDecoding AlgorithmsExperiment Design and A/B TestingPyTorch Training LoopsDataset Pipelines and Data Quality
📦Production ML Systems0/6
Feature Engineering for Production MLBatch and Streaming Feature PipelinesGradient Boosted Trees in ProductionRanking and Recommendation SystemsForecasting and Anomaly DetectionMonitoring Predictive Models
🧪Core LLM Foundations0/8
The Bitter Lesson & ComputeBPE, WordPiece, and SentencePieceStatic to Contextual EmbeddingsPerplexity & Model EvaluationFile Ingestion for AIChunking StrategiesLLM Benchmarks & LimitationsInstruction Tuning & Chat Templates
🧰Applied LLM Engineering0/24
Dimensionality Reduction for EmbeddingsCoT, ToT & Self-Consistency PromptingFunction Calling & Tool UseMCP & Tool Protocol StandardsContext EngineeringPrompt Injection DefenseResponsible AI GovernanceData Labeling and Human FeedbackEvaluating AI AgentsProduction RAG PipelinesHybrid Search: Dense + SparseReranking and Cross-Encoders for RAGRAG Evaluation for Reliable AnswersLLM-as-a-Judge EvaluationBias & Fairness in LLMsHallucination Detection & MitigationLLM Observability & MonitoringExperiment Tracking with MLflow and W&BPrompt Optimization with DSPyModel Versioning & DeploymentSemantic Caching & Cost OptimizationLLM Cost Engineering & Token EconomicsModel Gateways, Routing, and FallbacksDesign an Automated Support Agent
🎓Portfolio Capstones0/9
Capstone: Delivery ETA PredictionCapstone: Product RankingCapstone: Demand ForecastingCapstone: Image Damage ClassifierCapstone: Production ML PipelineCapstone: Document QACapstone: Eval DashboardCapstone: Fine-Tuned ClassifierCapstone: Reproducible ML Study
🧠Transformer Deep Dives0/8
Sentence Embeddings & Contrastive LossEmbedding Similarity & QuantizationScaled Dot-Product AttentionVision Transformers and Image EncodersPositional Encoding: RoPE & ALiBiLayer Normalization: Pre-LN vs Post-LNMechanistic InterpretabilityDecoding Strategies: Greedy to Nucleus
🧬Advanced Training & Adaptation0/16
Scaling Laws & Compute-Optimal TrainingPre-training Data at ScaleBuild GPT from Scratch LabJAX for PyTorch ResearchersContinued Pretraining for Domain ShiftSynthetic Data PipelinesSupervised Fine-Tuning PipelineMixed Precision TrainingDistributed Training: FSDP & ZeROLoRA & Parameter-Efficient TuningReward Modeling from Preference DataRLHF & DPO AlignmentConstitutional AI & Red TeamingRLVR & Verifiable RewardsKnowledge Distillation for LLMsModel Merging and Weight Interpolation
🤖Advanced Agents & Retrieval0/16
Vector DB Internals: HNSW & IVFAdvanced RAG: HyDE & Self-RAGGraphRAG & Knowledge GraphsRAG Security & Access ControlStructured Output GenerationReAct & Plan-and-ExecuteGuardrails & Safety FiltersCode Generation & SandboxingComputer-Use / GUI / Browser AgentsHuman-in-the-Loop Agent ArchitectureAI Coding Workflow with AgentsAgent Memory & PersistenceAgent Failure & RecoveryRecursive Language Models (RLM)Multi-Agent OrchestrationCapstone: Production Agent
⚡Inference & Production Scale0/19
Inference: TTFT, TPS & KV CacheMulti-Query & Grouped-Query AttentionKV Cache & PagedAttentionPrefix Caching and Prompt CachingFlashAttention & Memory EfficiencyContinuous Batching & SchedulingScaling LLM InferenceModel Parallelism for LLM InferenceModel Quantization: GPTQ, AWQ & GGUFLocal LLM DeploymentSLM Specialization & Edge DeploymentSpeculative DecodingLong Context Window ManagementMixture of Experts ArchitectureMamba & State Space ModelsReasoning & Test-Time ComputeAdvanced MLOps & DevOps for AIGPU Serving & AutoscalingA/B Testing for LLMs
🏗️System Design Capstones0/9
Content Moderation SystemCode Completion SystemMulti-Tenant LLM PlatformLLM-Powered Search EngineVision-Language Models & CLIPMultimodal LLM ArchitectureDiffusion Models: Images & TextReal-Time Voice AI AgentReasoning & Test-Time Compute
🎤AI Lab Interviewing0/4
AI Lab Coding Interview: Python SystemsAI Lab System Design InterviewAI Lab Behavioral InterviewAI Lab Technical Presentation
🔬Project Deep Dives0/17
Deep Dive - vLLMDeep Dive - SkyRLDeep Dive - FlashAttentionDeep Dive - FlashInferDeep Dive - DeepGEMMDeep Dive - NCCLDeep Dive - MegatronDeep Dive - DeepSpeedDeep Dive - RayDeep Dive - MLflowDeep Dive - PyTorchDeep Dive - TransformersDeep Dive - SGLangDeep Dive - slimeDeep Dive - DeepEPDeep Dive - TinkerDeep Dive - Light-PEFT
Back to Topics
LearnProject Deep DivesDeep Dive - Ray
⚙️HardMLOps & Deployment

Deep Dive - Ray

Read Ray as a distributed execution substrate for LLM data, training, reinforcement learning, tuning, and serving: tasks, actors, objects, scheduling, ownership, and failure recovery.

16 min read
Learning path
Step 169 of 177 in the full curriculum
Deep Dive - DeepSpeedDeep Dive - MLflow

Personalize this lesson

Adapt explanations and teaching visuals to your background and preferred voice.

A single LLM product can need thousands of CPU preprocessing tasks, a multi-node training job, a fleet of rollout actors, and several GPU-serving replicas. Building a separate distributed system for every stage wastes engineering time. Ray gives all of them the same small execution vocabulary.

That vocabulary is the project's main contribution. A Python function becomes a remote task, a class becomes a stateful actor, and every remote result becomes an object reference. Ray's higher-level libraries build data, training, tuning, reinforcement-learning, and serving systems from those three pieces.[1]Reference 1Ray: An AI Compute Enginehttps://github.com/ray-project/ray

Why Ray exists

Traditional batch systems work well when a job is a fixed directed acyclic graph. AI workloads are often less tidy. Reinforcement-learning workers create new work after observing environments, serving routers change destinations as replicas scale, and tuning services stop trials from partial results. Dependencies appear while the program is running.

The original Ray paper targeted that mix of task-parallel and actor-based computation. It paired a dynamic execution engine with distributed scheduling and fault-tolerant storage, then showed that one interface could express workloads that previously needed separate systems.[2]Reference 2Ray: A Distributed Framework for Emerging AI Applicationshttps://www.usenix.org/conference/osdi18/presentation/moritz

Ray Core keeps its public model compact:

PrimitiveProgrammer seesRuntime ownsGood LLM use
TaskRemote function callScheduling, retries, result placementTokenization, parsing, evaluation rows
ActorRemote class instancePlacement, mailbox, process lifetimeStateful rollout worker, model replica
Object referenceFuture-like handleLocation, transfer, ownership metadataDataset block, weights, batch result

Tasks are best for stateless work. Actors keep mutable state between calls and serialize methods by default. Object references let downstream work depend on values without forcing the driver to download those values first.[3]Reference 3What is Ray Core?https://docs.ray.io/en/latest/ray-core/walkthrough.html

Three primitives create a dynamic graph

The first visual follows a small request through Ray Core. The driver submits work and receives references immediately. Raylets on cluster nodes schedule workers against declared resources. Workers produce immutable objects or update actor state. The driver doesn't need to know which machine holds each result.

Ray Core graph with a driver issuing ObjectRefs to two raylets, which place a stateless task and a stateful actor beside node-local object stores. Solid edges carry references or values; dashed recovery edges lead from lost task output to lineage replay and from lost actor state to a durable checkpoint. Ray Core graph with a driver issuing ObjectRefs to two raylets, which place a stateless task and a stateful actor beside node-local object stores. Solid edges carry references or values; dashed recovery edges lead from lost task output to lineage replay and from lost actor state to a durable checkpoint.
Trace solid edges from the driver through ObjectRef metadata to placement, execution, and node-local bytes. Dashed edges expose the recovery contract: task lineage can replay idempotent work, while actor memory needs a durable checkpoint.

Here is the smallest API shape. embed.remote returns references, while the actor keeps a counter across calls:

ray_primitives.py
1import ray 2 3ray.init() 4 5@ray.remote(num_cpus=1) 6def embed(text: str) -> list[int]: 7 return [len(text), sum(map(ord, text)) % 101] 8 9@ray.remote(num_cpus=1) 10class BatchLedger: 11 def __init__(self) -> None: 12 self.completed = 0 13 14 def record(self, *vectors: list[int]) -> int: 15 self.completed += len(vectors) 16 return self.completed 17 18refs = [embed.remote(text) for text in ["cache", "router", "trace"]] 19ledger = BatchLedger.remote() 20count_ref = ledger.record.remote(*refs) 21 22print(ray.get(count_ref))

The expected output is 3. Ray resolves each top-level object-reference argument before the actor method runs. No explicit loop downloads each vector into the driver.

That concise code hides several contracts. num_cpus=1 is a scheduling request, not an operating-system limit. The actor's process can still allocate too much memory. The list of references preserves dependencies, but returning a giant Python object can still fill the object store. Distribution removes manual socket code; it doesn't remove capacity planning.

Scheduling happens at two levels

Each node runs a raylet. Local raylets decide whether work can run on their node and coordinate with peers when it can't. A global control service (GCS) stores cluster-level control state such as node membership and actor metadata. Workers execute user code, while the shared-memory object store holds larger immutable values.

Diagram showing Worker node A, Worker node B, Driver submit + refs, and GCS cluster metadata. Diagram showing Worker node A, Worker node B, Driver submit + refs, and GCS cluster metadata.
Worker node A, Worker node B, Driver submit + refs, and GCS cluster metadata.

Ray schedules logical resources. A task asking for one GPU is admitted only where one GPU slot is available. Custom resources can represent accelerator type, rack, license, or another placement constraint. The scheduler doesn't infer hidden requirements from code, so an undeclared GPU or excessive heap allocation can overcommit a node.

Placement groups reserve bundles of resources together. A tensor-parallel server might request four bundles with one GPU each and require them to be packed onto one node. A pipeline-parallel model could spread bundles across nodes. The placement strategy belongs to model topology, not to Ray alone.

Object references are data-plane handles

An ObjectRef behaves like a future, but it also names distributed data. Small values can travel directly between processes. Larger values enter each node's shared-memory object store, where eligible local buffers can avoid another full copy. Ray transfers objects between nodes when consumers need them.

The ownership system separates object data from object metadata. A worker that creates an object reference owns its metadata even if another node stores the bytes. The NSDI Ownership paper moved this metadata away from one central bottleneck and used decentralized reference counting for low-latency fine-grained work.[4]Reference 4Ownership: A Distributed Futures System for Fine-Grained Taskshttps://www.usenix.org/conference/nsdi21/presentation/cheng

Ownership shapes recovery. If stored bytes disappear after a node failure, Ray can reconstruct task output from lineage. It can't recover an object created with ray.put after its owner dies, and replay assumes the generating task is deterministic and idempotent.[5]Reference 5Object Fault Tolerancehttps://docs.ray.io/en/latest/ray-core/fault_tolerance/objects.html

Consider a task that charges a credit card and returns a receipt. Blind replay could charge twice. The task needs an idempotency key or an external transaction record. Ray can retry execution, but application semantics decide whether retry is safe.

Ray libraries share one substrate

Ray's libraries aren't separate cluster managers. They use Core primitives and can pass objects or actors across library boundaries.

LibraryUnit of workLLM roleBoundary it doesn't own
Ray DataStreaming dataset blocksIngest, parse, tokenize, batch inferenceModel training algorithm
Ray TrainDistributed workersPretraining and fine-tuning launchKernel implementation
Ray TuneParallel trialsSearch batch size, LR, serving knobsStatistical validity of objective
RLlibEnv runners and learnersPolicy learning and rollout systemsReward correctness
Ray ServeDeployments and replicasAPIs, routing, autoscalingAttention kernel math

Ray Data streams blocks through read, transform, shuffle, and write operators rather than materializing a whole corpus in the driver. Its batch-inference paths can keep CPU preprocessing feeding GPU replicas while backpressure limits in-flight blocks.[6]Reference 6Ray Datahttps://docs.ray.io/en/latest/data/data.html

Ray Train creates a worker group, assigns ranks, and integrates distributed training frameworks. It handles launch, environment setup, checkpoints, and failure coordination around framework code. PyTorch, DeepSpeed, or another trainer still owns gradient math and collectives.[7]Reference 7Ray Trainhttps://docs.ray.io/en/latest/train/train.html

Tune represents trials as distributed work and reacts to intermediate metrics. RLlib builds rollout, learner, and replay components on actors. Their value comes from composition: the same cluster can preprocess data, launch a training group, compare trials, and publish a serving deployment without translating every asset through a new scheduler.

Ray Serve LLM wraps inference engines

vLLM and SGLang optimize model execution inside an engine. Ray Serve LLM exposes OpenAI-compatible requests through OpenAiIngress. Its LLMEngine protocol lets vLLM or SGLang engines plug into LLMServer, while Ray places, scales, routes, and monitors instances.[8]Reference 8Ray Serve LLM Architecture Overviewhttps://docs.ray.io/en/latest/serve/llm/architecture/overview.html

Ray LLM control-plane graph with Ray Data, Train, Tune, and RLlib feeding Ray Core, which places work into Ray Serve. Serve routes an API request to a vLLM or SGLang replica; the replica owns the token loop, KV cache, and GPU kernels while Ray owns placement, routing, and scaling. Ray LLM control-plane graph with Ray Data, Train, Tune, and RLlib feeding Ray Core, which places work into Ray Serve. Serve routes an API request to a vLLM or SGLang replica; the replica owns the token loop, KV cache, and GPU kernels while Ray owns placement, routing, and scaling.
Read left to right across the ownership boundary. Ray libraries feed Core, Core places work into Serve, and Serve routes replicas. The engine, not Ray, owns token scheduling, KV-cache blocks, and GPU kernels.

Serve deployments become actors, replicas become instances of those actors, and deployment handles connect components. An ingress deployment can expose an OpenAI-compatible API. Router policies select replicas based on queue state, session affinity, prefix reuse, or a custom rule. Autoscaling changes replica count from observed load.

For large models, one logical engine replica can span several GPU workers through tensor or pipeline parallelism. Serve LLM also supports patterns such as prefill-decode disaggregation, data-parallel attention, expert parallelism, and multi-LoRA routing. Ray coordinates resources and request movement; the configured engine remains responsible for continuous batching, PagedAttention or RadixAttention, and GPU execution.[8]Reference 8Ray Serve LLM Architecture Overviewhttps://docs.ray.io/en/latest/serve/llm/architecture/overview.html

Where Ray helps LLM systems

Ray is strongest when one workload crosses several machines or execution modes:

  1. Corpus processing. Ray Data reads object storage, applies CPU-heavy parsing, then streams tokenized batches to GPU workers.
  2. Distributed fine-tuning. Ray Train creates workers and checkpoint plumbing around PyTorch, FSDP, DeepSpeed, or Hugging Face training code.
  3. Reinforcement learning. Actors hold environments, rollout engines, reward services, and learners with different resource shapes.
  4. Model selection. Tune allocates trials, stops weak candidates, and records intermediate results.
  5. Online serving. Serve deploys routers and engine replicas, then scales them against traffic.
  6. Offline inference. Ray Data streams large input collections through vLLM or another batch predictor.

Ray offers less value for one fixed single-node script, a tiny queue with ordinary web workers, or a serving engine that already fits cleanly in one process. Distribution adds packaging, cluster, observability, retry, and resource-model costs. Use it when those costs buy real parallelism or unify multiple distributed phases.

Failure modes are part of the design

Object-store and heap pressure

The object store has a bounded shared-memory budget. Ray can spill objects to disk when it fills, but spilling converts a memory path into storage I/O. Worker heap memory is separate. A worker can exhaust node memory even when the object store looks healthy.

The frequent anti-pattern is ray.get on a huge list of references. That asks the driver to materialize every value at once. Process results incrementally with ray.wait, keep data in Ray Data blocks, or aggregate remotely.

Actor recovery isn't automatic state recovery

Actors don't restart by default. Enabling restarts reruns the constructor; it doesn't restore mutable in-memory state. A durable actor needs an external checkpoint, replay log, or reconstruction function. Actor method retries also need idempotency.

Resource declarations can lie

Ray only sees declared resources. A task marked num_cpus=1 can start 32 native threads. A model actor that declares one GPU can allocate host memory sized for four. Validate actual process usage and use concurrency limits inside each actor.

Control-plane availability needs a plan

The GCS is central to cluster control. Production clusters need supported high-availability configuration and cluster recovery. KubeRay can recreate nodes and clusters, but transient queues and in-process actor state still disappear. A restarted cluster isn't equivalent to an uninterrupted request stream.

Dynamic graphs are harder to debug

A remote exception surfaces when a reference is resolved, sometimes far from submission. Task timelines, actor logs, resource views, object-memory reports, and distributed traces need correlated IDs. Keep unit logic runnable outside Ray so debugging doesn't always require a cluster.

Strengths and weaknesses

StrengthWhy it mattersCost paired with it
Small Core APIOne execution model across many AI workloadsHidden distributed behavior can surprise Python users
Dynamic task and actor graphHandles serving, RL, and adaptive workflowsHarder reasoning than a fixed batch DAG
Shared runtime for Data, Train, Tune, RLlib, ServeAssets and resource contracts composeBroad surface and fast-moving integrations
Logical resource schedulingHeterogeneous CPU/GPU placementDeclarations aren't hard isolation
Object references and localityAvoids driver bottlenecks and extra copiesOwnership, spilling, and lineage need care
Open governanceCommunity runtime isn't tied to one hosted serviceProduction operations still need experienced ownership

Ray should be compared with the right layer. Kubernetes manages containers and cluster reconciliation. Spark specializes in data-parallel processing. Celery handles task queues. vLLM and SGLang run LLM kernels and schedules. Ray can sit on Kubernetes, move data like a general runtime, queue dynamic tasks, and host vLLM engines, but it doesn't erase those systems' specialized roles.

Project identity

Ray began in UC Berkeley's RISELab in 2016 and 2017. Its OSDI paper was authored by researchers including Philipp Moritz, Robert Nishihara, Stephanie Wang, Michael I. Jordan, and Ion Stoica.[2]Reference 2Ray: A Distributed Framework for Emerging AI Applicationshttps://www.usenix.org/conference/osdi18/presentation/moritz Anyscale was founded in 2019 by Ray's creators to build a managed production platform around the open-source runtime.[9]Reference 9About Anyscalehttps://www.anyscale.com/about

The project now uses open governance under the Linux Foundation's PyTorch Foundation umbrella.[10]Reference 10Ray | PyTorchhttps://pytorch.org/projects/ray/ Committers, a technical steering committee, and lead maintainers govern technical work.[11]Reference 11Ray Project Governancehttps://docs.ray.io/en/latest/ray-governance/index.html Anyscale remains a major contributor and commercial operator, but Ray's public governance and code aren't the same thing as the hosted Anyscale product.[9]Reference 9About Anyscalehttps://www.anyscale.com/about

FieldCurrent project fact
OriginUC Berkeley RISELab; the OSDI paper records the founding research team.[2]Reference 2Ray: A Distributed Framework for Emerging AI Applicationshttps://www.usenix.org/conference/osdi18/presentation/moritz
StewardshipRay is hosted by the PyTorch Foundation under the Linux Foundation, while the project governance document defines technical authority.<a href="https://pytorch.org/projects/ray/" target="_blank" rel="noopener noreferrer" title="Ray
Contributor modelContributors can become committers; committers feed a TSC and lead-maintainer structure. Authority belongs to named people and roles, not automatically to employers.[11]Reference 11Ray Project Governancehttps://docs.ray.io/en/latest/ray-governance/index.html
Source licenseApache-2.0 for Ray source.[12]Reference 12Ray Apache License 2.0https://github.com/ray-project/ray/blob/adfc8fb6f33ae79c982c6f17244c55ed65de8242/LICENSE
Commercial boundaryAnyscale is the company founded by Ray's creators and operates a managed platform. Open-source Ray remains independently governed.[9]Reference 9About Anyscalehttps://www.anyscale.com/about[11]Reference 11Ray Project Governancehttps://docs.ray.io/en/latest/ray-governance/index.html
Asset boundaryRay's license covers runtime code, not model weights, datasets, prompts, or user artifacts moved through the object store.

The research lineage explains today's design:

WorkLasting idea in Ray
Ray, OSDI 2018Unified tasks and actors on a dynamic distributed engine
Ownership, NSDI 2021Decentralized object metadata and reference counting
RLlibComposable distributed reinforcement-learning components
TuneNarrow interface between trials and search schedulers
ExoshuffleApplication-level control over distributed shuffle scheduling

Only the first two are necessary to understand Core. The later projects show why a general runtime can host specialized libraries without turning every workload into one monolithic scheduler.

A practical reading path through the repository

Start with public boundaries instead of opening scheduler internals at random:

  1. Read python/ray/__init__.py and remote-function or actor decorators to see user-facing handles.
  2. Follow task submission into CoreWorker bindings and object references.
  3. Inspect raylet scheduling and resource bookkeeping.
  4. Trace one object from worker return through ownership metadata and object storage.
  5. Open one library, such as Serve, and identify which components become actors.
  6. Compare a local vLLM engine with its Ray Serve wrapper to mark orchestration versus execution ownership.

Pin the repository commit while reading. Ray's library APIs and internal C++ paths move faster than its three-primitives mental model.

What to remember

  • Ray Core is a distributed execution substrate built from tasks, actors, and object references.
  • Object references preserve dependencies and locality; premature ray.get calls often create driver bottlenecks.
  • Logical resource requests guide placement but don't enforce process memory or thread limits.
  • Ray Data, Train, Tune, RLlib, and Serve compose because they share Core primitives.
  • Ray Serve LLM orchestrates vLLM or SGLang engines; it doesn't replace their token schedulers or kernels.
  • Retry safety, actor state, object ownership, and GCS recovery need explicit production contracts.
  • Ray is useful when distribution or cross-library composition pays for its operational complexity.
Complete the lesson

Mastery Check

Answer every question, then check your score. Score 75% or higher to mark this lesson complete.

1.Which Ray primitive is the best fit for a stateful rollout environment that must persist episode state across calls?
2.Why can calling ray.get on thousands of large object references hurt a pipeline?
3.A task output disappears after a node failure. When can lineage reconstruction safely recreate it?
4.What does a placement group add for a four-GPU model replica?
5.Where should continuous batching and KV block allocation live in a Ray Serve LLM deployment backed by vLLM?
6.A Ray actor restarts after a crash. What state is restored automatically?
7.Which workload least needs Ray?
8.What is the clearest boundary between Ray Train and a framework such as PyTorch FSDP?

8 questions remaining.

Next Step
Continue to Deep Dive - MLflow

Ray explains where distributed work runs and how it recovers; <span data-glossary="mlflow">MLflow</span> explains how experiments, prompts, models, traces, and evaluation evidence remain connected across those runs.

PreviousDeep Dive - DeepSpeed
Share this article
XFacebookLinkedInBlueskyRedditHacker NewsEmail
References

Ray: An AI Compute Engine

Ray Project · 2026

Ray: A Distributed Framework for Emerging AI Applications

Moritz, P., Nishihara, R., Wang, S., et al. · 2018 · OSDI 2018

What is Ray Core?

Ray Project · 2026

Ownership: A Distributed Futures System for Fine-Grained Tasks

Cheng, Y., Wang, S., Yan, C., et al. · 2021 · NSDI 2021

Object Fault Tolerance

Ray Project · 2026

Ray Data

Ray Project · 2026

Ray Train

Ray Project · 2026

Ray Serve LLM Architecture Overview

Ray Project · 2026

About Anyscale

Anyscale · 2026

Ray | PyTorch

PyTorch Foundation · 2025

Ray Project Governance

Ray Contributors · 2026

Ray Apache License 2.0

Ray Contributors · 2026

Discussion

Questions and insights from fellow learners.

Discussion loads when you reach this section.