Highlights
- Ray Serve LLM: In this release we've completed KV cache and token aware request routing, which was previewed in 2.57. Tokenization now happens in-process on the
LLMRouteringress replica, the routing decision is made there, tokens are transmitted out-of-band so the engine does not re-tokenize, KV lifecycle events are broadcast to every ingress replica (#64642, #64920, #64949, #65010, #65095). KV cache and token aware routing is also aware of CPU KV caches, so offloaded KV cache blocks count toward a replica's cache hit (#65063). - Ray Core: We enabled the capability to offload task events from. With
RAY_enable_task_events_to_dashboard_headon, the task event buffer is replaced by the ray event recorder, events are exported from the aggregator agent to a task events head that keeps an in-memory store, and the state APIs andray.timelineread from it (#64835, #65028, #65123, #65160, #65218). Enabling the feature removes task event ingestion and serving from the GCS hot path. - Ray Data: We’ve added Databricks integrations for writing to DeltaLake, with Catalog support. We’ve also shipped a new shuffle v2 backend, featuring improved performance for joins and aggregations.
- Sandboxing: We've also added experimental Ray Sandbox, which runs task and actor code under gVisor and can run Docker-built images directly (#64964, #65570).
- TPU Support: Ray Train adds support for TorchTPU backend (#64796), and Ray Core adds
SubslicePlacementGroupfor gang scheduling on TPU subslices, single-host TPU support inSlicePlacementGroup, and resource accounting fortpu7xand multi-core chips (#64578, #64079, #64058). This lets TPU slices and subslices be reserved and trained on without external gang-scheduling glue.
Ray Data
🎉 New Features
- Add
Dataset.with_columnsfor multi-column expression projection (#63858) - Add
write_deltafor Delta Lake, with catalog support (#64923, #65079) - Add Torch inference API (#65157)
- Promote hash shuffle v2 to a selectable shuffle strategy, with aggregation support, vectorized aggregation, and block splitting during aggregation (#64953, #64652, #64956, #65329, #64897)
- Add
ignore_missing_pathsandskip_pathstoread_parqueton DatasourceV2 (#65118) - Add
delta_timestamps(temporal windows) toread_lerobot(#64877) - Collect cluster usage metrics by sampling in background threads during execution (#64686)
- Tolerate actor deaths during init via
DataContext.max_consecutive_actor_init_deaths(#64846) - Expose
RAY_DATA_HASH_SHUFFLE_MAP_TASK_TARGET_INPUT_BYTESinDataContext(#65103)
💫 Enhancements
- Generate sortable, collision-resistant dataset IDs (#65075)
- Push
LimitintoReadFileswhen it sits directly on it, and extractFileIndexer.list_file_infos(#65167, #65168) - Use
BlockRefCounterfor object store memory estimation and removeBlockRefCounter.clear()(#64456, #64521) - Fail execution if no operator makes progress within a timeout, instead of hanging (#65349)
- Improve
BatchIteratoranditer_torch_batches, and allow a customcollate_fnwith a custom device (#64994, #64967) - Skip downstream-capacity backpressure for eligible materializers (#64844)
- Shard exact download partitioning (#64066)
- Bump the
sort_reducememory multiplier to 3x and stop usingestimated_input_blocksas the shuffle partition count (#65176, #65296, #65335) - Disable cluster autoscaling when
PlacementGroupSchedulingStrategyis in use (#64417) - Propagate the operator name to shuffle tasks (#64802)
- Rename
reports_custom_op_statstoshould_report_custom_op_statsacross allMapTransformFnvariants (#64461, #64515) - Rename
allocatedtoreservedand add type aliases in the autoscaling coordinator (#64997, #65096) - Deprecate
ray_remote_args_fnandDataset.zip(#64963, #65111)
🔨 Fixes
- Fix an RCE where
read_lanceor nested pickle objects could execute arbitrary code (#64881) - Stop converting Arrow null columns to
null[pyarrow]into_pandas(#65187) - Fix
iter_torch_batchesdevice resolution and typing (#65059, #64947) - Propagate
isolate_read_workerstoDatasourceV2(#65191) - Avoid signalling epoch end for failed attempts (#65082)
- Add
tf-kerasto thetext_embeddingpip packages (#64889)
📖 Documentation
- Fix the stale
use_datasource_v2docstring default and an incorrectdefault_map_logical_memory_enabledreference (#65155, #65091)
Ray Serve
🎉 New Features
- Configurable status code and
Retry-Afterheader for backpressure rejections (#65193, #65319) - Add dependency-ordered shutdown for deployments (#64922)
- Add an optional tie-break key to best-fit node scheduling (#64914)
- Scale ingress request router replicas per proxy node (#64724)
💫 Enhancements
- Reconcile health checks from a dirty set, sweeping
RUNNINGreplicas round-robin instead of every tick (#64690) - Gate the rank-consistency check on replica membership changes (#64911)
- Read the multiplex marker statically so probing cannot initialize handles (#65064)
- Type
CreatePlacementGroupRequest.runtime_envas a dict (#64892) - Add a deployment-state accessor for testing (#64790)
🔨 Fixes
- Fix the Serve replica
ASGIServicebypassing token authentication (#65189) - Fix the proxy update loop getting stuck when a proxy's node is removed (#64403)
Ray Train
🎉 New Features
- Ray Train Integrates with TorchTPU backend (#64796)
- Add a public preemption API and a controller
PreemptingState(#64360) - Add data ingest metrics to the Train dashboard (#64523)
💫 Enhancements
- Make Train V1 and V2 use the autoscaling coordinator (#64824)
- Expand the
contains_tensorcheck and add a serialization check for the results return value (#64930) - Pin
PlacementGroupCleanerto the head node (#64705)
🔨 Fixes
- Fix Torch environment setup for V1 worker groups (#65005)
Ray Tune
🔨 Fixes
- Fix
HyperOptSearchdroppingtune.choicecategories that are constant dicts (#64537) - Deflake
test_multi_trial_reuse_with_failingand decidetest_experiment_restorecompletion from measured progress (#64526, #65212)
Ray LLM
🎉 New Features
- KV-cache-aware routing: move tokenization into the
LLMRouteringress replica, decide KV/token routing there, broadcast KV lifecycle events to all ingress replicas, and make selection and reservation atomic (#64642, #64920, #64949, #65010) - Enable KV cache offloading, make KV routing aware of CPU KV caches, and transmit tokens out-of-band so the engine skips tokenization (#65063, #65095)
- Add a KV cache offload/reload dashboard and a Ray Serve LLM SGLang metrics dashboard (#65122, #64797)
💫 Enhancements
- Upgrade to vLLM 0.26.0 (#65045)
- Route direct-streaming ingress to the co-located router (#64489)
- Reuse vLLM's resolved HF config in
apply_checkpoint_info(#62962) - Preserve mapping-valued vLLM frontend arguments (#65146)
📖 Documentation
- Document loading models from Azure storage, including
az://Blob streaming with RunAI Streamer (#64819, #64825)
Ray RLlib
🔨 Fixes
- Fix TQC critic divergence by stopping actor-loss gradients from leaking into the critics (#65125)
- Fix squashed-Gaussian log-prob corruption for saturated policies (#65036)
- Use the
target_qf_twinhead in IQL target prediction (#64932) - Properly enforce
use_kl_lossin the PPO Torch and TF policies (#61562) - Fix a
KeyErrorin the multi-agent module-to-env connector (#64803) - Fix the API-doc consistency check for the new reverse/dedup policies, and deflake the
test_env_runnercallback-count tests (#64807, #64989)
Ray Core
🎉 New Features
- Ray Sandbox (experimental): run task and actor code under gVisor, and run Docker-built images out of the box (#64964, #65397, #65570, #65622)
- Move task events out of the GCS: the ray event recorder replaces the task event buffer, the aggregator agent exports to a task events head with an in-memory store, and the state APIs and
ray.timelineare rerouted to it, with reconciliation on worker death and job completion (#64835, #65028, #65057, #65123, #65141, #65160, #65218, #65247, #65288) - Add
SubslicePlacementGroupfor gang scheduling on TPU subslices, support single-host TPUs inSlicePlacementGroup, and add aper_slice_pgsparameter (#64578, #64079, #64072) - Introduce a native, lightweight C++ leader election client for active-passive GCS (#63773)
- Add Apple silicon GPU (
mps) support and an Intel GPUZE_AFFINITY_MASKmapping (#38464, #64440) - Add worker lifecycle events to the events export pipeline (#64887)
- Add GPU UUID to the labels of GPU metrics (#65113)
- Enable resource accounting for
tpu7xand multi-core chips, addgb200/gb300accelerator constants, and addTTNPUcustom accelerator resources (#64058, #65009, #61554) - Support cross-device transfers in RDT NIXL (#64815)
💫 Enhancements
- Publish node death before persisting it and drop RocksDB soft durability (REP-64) (#64702)
- Make
RedisContext::Connectnon-fatal on connection failure (#64299) - Move the pending resource load pull off the GCS main
io_context(#65024) - Subscribe only to the specific owner worker's death for generator backpressure, and only when actor-level backpressure is enabled (#65195, #65136)
- Evict dead actors from
ActorPoolinstead of recycling them (#64646) - Rename
label_domainto topology strategy in the scheduling policy (#64384) - Warn on use of the deprecated dynamic generator (#64749)
- Add object resolution debug logging for lineage reconstruction (#64853)
- Block only on the CUDA stream used to create tensors in RDT (#64823)
- Preserve
StateSchemacolumn order infilter_fields(#65052) - Prepare
StreamResponseon an empty log stream (#62296) - Refine
ObjectRefStreamEndOfStreamErrorfrom_get_next_ref_n(#64602) - Drop a redundant
FunctionDescriptorrebuild inCallSiteString(#64874) - Upgrade bundled dependencies: log4j 2.25.4, jackson-databind 2.18.8 (CVE-2026-54512, CVE-2026-54513), gson 2.11.0, aiohttp, idna, and azure (#64269, #64575, #64273, #65131, #64056, #65046)
🔨 Fixes
- Give
canceled_tasks_its own mutex to break a lock-order cycle (#65393, #65620) - Fix a GIL/mutex deadlock in actor-level backpressure with sync and async streaming generators (#64896)
- Fix a deadlock between metric registration and
collect()inOpenTelemetryMetricRecorder(#64946) - Report shutdown from
check_signalsinstead of exiting the process (#65184, #65400) - Fix a Python 3.14 async-actor memory leak by re-anchoring stack protection to fiber stacks (#64772)
- Keep only the latest object-location pubsub snapshot to fix an owner memory leak (#65133)
- Fix a spurious
OwnerDiedErrorduring graceful raylet shutdown (#64899) - Fail
ray.geton refs from a non-restartable streaming generator when those objects are lost (#64756) - Serve the spilled copy when
Pushhits a stalelocal_objects_mirror (#64916) - Fix
spill_manager_objects_bytesreporting the restored object count instead of restored bytes (#65013) - Forward node-pinned actors to the pinned node in GCS actor scheduling (#64951)
- Fix a leaked named actor and name conflict when registration times out (#64948)
- Fix a set-before-register race in
RDTManagerthat could SIGSEGV (#64558) - Fix task log info fields in lifecycle events (#65190)
- Guard
Status::operator<<against an OK status, and fix UB inStatusOrswap and assignment on error-state operands (#64983, #64799) - Compare all
ResourceRequestfields inoperator==(#64838) - Verify VFIO groups are backed by Google TPU PCI devices, and use POSIX paths for VFIO sysfs vendor checks on Windows (#65105, #65182)
📖 Documentation
- Document the embedded RocksDB GCS backend (#64731)
- Clarify actor class state isolation and the Ray Core walkthrough benchmark setup (#64597, #64529)
- Document how to set up placement group topology strategy on Kubernetes (#64117)
Dashboard
🎉 New Features
- Capture Kubernetes Pod events in the Ray Dashboard head (#63937)
💫 Enhancements
🔨 Fixes
- Fix the profiling status check so it works behind a reverse proxy (#65126)
- Fix a dashboard startup crash from an unguarded
kubernetesimport (#64962)
📖 Documentation
- Add a user guide for Kubernetes events in the Ray Dashboard (#64734)
Ray Wheels and Images
🎉 New Features
- Enable Windows py3.13 and py3.14 wheel builds (#64970)
- Publish arm64 Ray LLM images (#65002)
- Add a
ray-torchrelease test image (py3.14, cu12.8) and ahello_world_py314smoke release test (#65114, #64857)
💫 Enhancements
- Bump the Anyscale CLI to 0.26.105 and bake
pybase64into the ML release-test image (#64980, #64791) - Recompile dependency lock files on dependabot PRs, and regenerate the
ray-torchpy3.14 lock for aiohttp 3.14.3 (#65056, #65343, #65378) - Pin
grpcioto 1.75.0 in test deps to avoid thegrpc.aioperformance regression (#65112) - Give
ray-wheel-minimal-builda distinct wanda image name (#65318, #65383) - Move cu130 job tests off
g4dn.4xlargetog6.4xlarge(#65213) - Bump the version to 2.58.0 and publish 2.56.0 perf metrics (#65252, #64196)
🔨 Fixes
- Fix
org_lzma_lzmadownload failures by using the SourceForge redirector (#64906) - Install the data CI depset after conda ffmpeg so removed packages are restored (#65334, #65341)
- Drop
-Wl,-piefrom the vendored RocksDBWITH_TSANlink flags (#64917) - Floor
peft>=0.18for transformers 5.x in thehuggingface_acceleraterelease test (#65062)
Documentation
- Add initial documentation for Ray sandboxing (#65503, #65573)
- Update the Ray History Server docs for
RAY_ROOT_DIR->STORAGE_ROOT_DIRand use a RayJob sample YAML (#65139, #65441, #65510, #65505, #65531) - Add a contributor guide for editing and managing Python dependencies (#63547)
- Clarify the API deprecation policy (#65093)
- Document the
safe-to-evictannotation for the Ray head Pod, and autoscaler v1restartPolicybehavior (#64907, #64900) - Update the Gaudi tutorials and examples to the latest versions (#58861)
- Correct the TLS verification comments and the metric cardinality default comments (#61977, #64478)
- Route API reference pages and autodoc machinery to the API-surface checks, ignore inherited API annotations, walk
ray.data.llmas its own head module, and reserve thedoctag for doc validation (#64812, #65196, #65040, #64775, #65208) - Scope API signature bold weight to the object name, and reclassify sphinx unknown-document and docutils-inline-markup as judgment (#64933, #64839)
- Fix minor typos, bump the docs template build-id pins, and add Douglas Strodtman to the committer list (#64864, #65041, #65092)
Thanks
Many thanks to all those who contributed to this release!
@bveeramani, @yjaw, @sampan-s-nayak, @spencer-p, @iaalm, @risjai, @kahlun, @liulehui, @eicherseiji, @jhasm, @ronny-anyscale, @KuongB, @Ranoobaba, @Sparks0219, @alimaazamat, @yuhuan130, @jeffreywang88, @AarryaSaraf, @johntomcat7408-cmyk, @tqKhanh1712, @praneethkaturi, @elliot-barn, @tanmayrauth, @skpark-rh, @YashwanthRanjanSingaravel, @Yicheng-Lu-llll, @pseudo-rnd-thoughts, @nadongjun, @vineethsaivs, @owenowenisme, @saitejabandaru-in, @RocMarshal, @karticam, @win5923, @Hyunoh-Yeo, @dragongu, @YoyinZyc, @chiayi, @HrushiYadav, @martinlhw, @sai-miduthuri, @dstrodtman, @JasonLi1909, @2uchan, @mukktinaadh, @coqian, @ayushk7102, @LuciferYang, @NripeshN, @MortalHappiness, @verma-divyanshu-git, @ans9868, @johntaylor-cell, @prasad-anyscale, @edoakes, @ShockYoungCHN, @fscnick, @JiangJiaWei1103, @subpath, @shivamsingh-007, @RinZ27, @richabanker, @iamjustinhsu, @malsbat, @andrewsykim, @ryanaoleary, @vinay7373, @Kunchd, @petern48, @kyuds, @rueian, @rayhhome, @xyuzh, @hao-aaron, @CaiZhanqi, @kalyanamdewri, @abhishekverma-ray, @khluu, @nh-atuan, @odncode, @robertnishihara, @machichima, @Arkit003, @goutamvenkat-anyscale, @ArturNiederfahrenhorst, @Myasuka