ray-2.57.0
Breaking Changes📦 rayView on GitHub →
⚠ 4 breaking✨ 14 features🐛 33 fixes⚡ 3 deprecations🔧 42 symbols
Summary
This release introduces significant improvements to Ray Data with DataSourceV2 enabled by default and Hash Shuffle V2. Ray Serve enhances its HAProxy ingress with a new PyPI package and gRPC support, while Ray Core adds an embedded RocksDB backend for GCS fault tolerance.
⚠️ Breaking Changes
- The HAProxy ingress is now distributed as the `ray-haproxy` PyPI package instead of being compiled into images. Users should install this package separately if they rely on HAProxy. The default HAProxy binary is now from this package.
- The `write_lance(mode=CREATE)` behavior has changed from silently overwriting to raising an error. To overwrite, explicitly use `mode=OVERWRITE`.
- The `DataSourceV2` is now enabled by default. If you encounter issues with `read_parquet` or similar functions, you may need to investigate compatibility with the new scan/listing infrastructure.
- Hash Shuffle V2 replaces the aggregator actor pool with stateless task-based operators (`ShuffleMapOp` -> `ShuffleReduceOp`). This change might affect performance characteristics or debugging workflows that relied on the previous actor pool.
Migration Steps
- Install the `ray-haproxy` PyPI package if you are using the HAProxy ingress.
- If you were relying on the old behavior of `write_lance(mode=CREATE)` silently overwriting, change your calls to `write_lance(mode=OVERWRITE)`.
- If you encounter issues with `read_parquet` or similar functions after upgrading, consider disabling `DataSourceV2` temporarily via `DataContext.use_datasource_v2 = False` to diagnose.
- Migrate calls to `apply_chat_template`, `tokenize`, and `detokenize` to the `*_stage` form.
- Migrate the Daft dependency from `getdaft` to `daft`.
✨ New Features
- `DataSourceV2` is now enabled by default for `read_parquet` and similar functions, offering row-group-aware chunking and predicate splitting.
- Hash Shuffle V2 is introduced, replacing the aggregator actor pool with stateless task-based operators for improved scalability and resource management. It now supports `join`, multi-input reduce, downstream map fusion, and reducer remote args.
- A `Catalog` abstraction with a `UnityCatalog` implementation is added, supporting Unity Catalog for `read_*` operations and write support for Parquet and Iceberg.
- `read_zarr` and `read_lerobot` functions are added for reading Zarr and LeRobot v3 datasets respectively.
- HAProxy ingress is now distributed as the `ray-haproxy` PyPI package and is the default binary.
- gRPC support has been added to the HAProxy direct-ingress path, including streaming, metrics, and custom request IDs.
- Experimental KV-cache-aware request routing for Ray Serve LLM has been added, tracking replica KV state and routing based on prefill/decode token load.
- An embedded RocksDB storage backend for GCS fault tolerance is added, selectable via `RAY_gcs_storage=rocksdb` and `RAY_gcs_storage_path`. GCS fault tolerance no longer requires an external Redis instance.
- A public API for topology-aware scheduling has been added.
- GPU support for `Aggregate` has been added.
- Custom operator stats can now be added to capture worker-side metrics during task execution.
- Usage collection has been refactored into an extensible `UsageCallback`.
- The `from_blocks` function is exported from `ray.data`.
- Support for `rapidsmpf-26.4.0` has been added.
🐛 Bug Fixes
- Fixed `TensorDtype.__from_arrow__` crash on empty tensor columns.
- Fixed Arrow-backed `to_pandas` regressions with an opt-out flag and int/float block overflow handling.
- Fixed read-only hash array crash in hash partition.
- Fixed streaming-generator hang on a plasma-resident return object.
- Fixed Parquet write overflow for string/binary columns larger than 2 GiB.
- Fixed Parquet sampling hang on a permanent `OSError`.
- Fixed the BigQuery datasink to handle empty blocks.
- Made `PandasBlock.size_bytes` deterministic.
- Propagated branch in `_append_and_commit()` for the Iceberg overwrite save mode.
- Propagated `isolate_read_workers` to `DatasourceV2`.
- Fixed cross-region S3 bucket access in the obstore download path.
- Restored `safe_round` in the `ExecutionResources` hot path.
- Logged both the wrapped and wrapper exception in `iterate_with_retry`.
- Added `tf-keras` to the `text_embedding` pip packages.
- Fixed `build_processor` failing with vLLM >= 0.19, corrected its `config` type hint, and added `request_timeout_s` to `ServeDeploymentProcessor` to prevent indefinite hangs.
- Fixed type hints in `throughput_solver.py`.
- Hide Ray Data internal frames from user-code error tracebacks.
- Run projection/predicate pushdown before limit pushdown, block optimization of non-deterministic expressions, and make fuse checks consistent between the logical and physical optimizers.
- Add a two-mode block metadata fetch behind a single `MetadataFetcher` interface.
- Use work stealing for file listing and a dynamic work queue for traversals.
- Speed up `ExecutionResources` and the reservation/budget loops on the scheduling hot path.
- Fix `O(n^2)` schema reconciliation in `unify_schemas` and avoid per-column `Series` materialization in tensor-column casting.
- Decouple collate and memory pinning in `iter_torch_batches`, add per-stage training-thread blocking attribution, bound in-flight `iter_threaded` items, and finalize after reordering under `preserve_order`.
- Add default logical memory for map operators, wire the materializing-op filter into `OpResourceAllocator` budgeting, and move `estimate_object_store_usage` into the physical op.
- Decrease the downstream backpressure ratio to 2.0.
- Route native `S3FileSystem` downloads to the PyArrow threaded path.
- Size hash-shuffle aggregators via bounded online sampling and add a timeout to the batched `ray.get` when fetching partitions.
- Replace manual block reference accounting with Ray Core out-of-scope object callbacks.
- Default `read_numpy` to `allow_pickle=False` and make it manually configurable.
- Expand `DistributionTracker` with `merge()` and p25/p75, and add dead node counts and detected issues to usage collection.
- Remove cluster autoscaler v1, rename the subcluster label key to `ray-subcluster`, avoid scaling nodegroups dedicated to the head node, and quiet autoscaling coordinator logs.
- Delay the "cluster resources not enough" warning until an operator is persistently starved, and lower the high-memory warning threshold.
- Remove `ExecutionPlan`, `_num_outputs`, `batch_format` on `AllToAllOperators`, and `InheritBatchFormatRule`; use `input_dependencies` in logical operators.
Affected Symbols
DataSourceV2read_parquetHash Shuffle V2ShuffleMapOpShuffleReduceOpHAProxy ingressray-haproxygRPCKV-cache-aware request routingRocksDBGCSRedistopology-aware schedulingTensorDtypeto_pandasPandasBlockIcebergS3FileSystemExecutionResourcesiterate_with_retrybuild_processorvLLMServeDeploymentProcessorDataContext.scheduling_strategyactor_locality_enabledexclude_resourceslocal://PrepareImageStageimageCatalogUnityCatalogread_zarrread_lerobotPushdownCountFilesAggregateDistributionTrackercluster autoscaler v1ExecutionPlan_num_outputsAllToAllOperatorsInheritBatchFormatRuleinput_dependencies
⚡ Deprecations
- Low-level scheduling APIs (`DataContext.scheduling_strategy`, `actor_locality_enabled`, `exclude_resources`, `local://`) are deprecated ahead of the actor-only rearchitecture.
- The `image` row column is deprecated.
- The `PrepareImageStage` has been removed.