ray-2.56.0
Breaking Changes📦 rayView on GitHub →
⚠ 1 breaking✨ 17 features🐛 25 fixes⚡ 4 deprecations🔧 25 symbols
Summary
This release focuses heavily on Ray Data stability, introducing features like multi-dataset support, automatic batch sizing, and improved memory management. Ray Serve received significant LLM performance enhancements via re-architecture and new routing policies, while Ray Core introduced GPU-domain-aware placement groups and initial Kubernetes in-place pod resizing support.
⚠️ Breaking Changes
- The subcluster label key used for Ray Data multi-dataset support has been renamed from `__subcluster__` to `ray-subcluster`. Update any scripts or configurations relying on the old label key.
Migration Steps
- If you were relying on the deprecated `concurrency=` parameter in `filter(expr=...)`, replace it with the `compute=` parameter.
- Update any code using `DataIterator.to_torch()` to use alternative methods or update to use PyArrow directly.
- Update any configuration or code relying on the subcluster label key `__subcluster__` to use `ray-subcluster` instead.
✨ New Features
- Ray Data now supports running multiple datasets per cluster using subcluster labels and resource partitioning.
- Added public API `Dataset.mix()` and `MixOperator` for weighted dataset mixing.
- Introduced the new DataSourceV2 framework, including `ParquetDatasourceV2`, chunked reader, predicate splitting, and listing/scanner infrastructure.
- Added `batch_size='auto'` to `map_batches` to automatically derive batch row count from target row batch size.
- Implemented distributed upsert for Iceberg using a task-based merge algorithm.
- Added `include_row_hash` to `read_parquet`.
- Added JAX data iterator support.
- Exposed flag `isolate_read_workers` to run read tasks on isolated worker processes.
- Exposed flag `default_map_logical_memory_enabled` to set default logical memory for map operators.
- Support for predicate pushdown for Lance format.
- Support for per-partition `start_offset` and `end_offset` for `read_kafka`.
- Added obstore async download backend for the download operator.
- Support for UDF retries on transient exceptions.
- Ray Serve LLM serving path re-architected, decoupling request handling from token streaming response path, leading to performance improvements.
- Introduced new Ray Serve routing policies: session-sticky routing via consistent hashing with `ConsistentHashRouter` and `CapacityQueueRouter` for supply-constrained workloads.
- Added GPU-domain-aware placement groups using label locality, enabling packing onto nodes sharing a `ray.io/gpu-domain` label.
- Added initial Kubernetes in-place pod resizing support for Autoscaler v2, allowing resizing of CPU and memory on existing worker pods.
🐛 Bug Fixes
- Fixed `iter_batches` spilling by replacing `make_async_gen` with `iter_threaded` and reducing buffered batches.
- Fixed `get_or_create_stats_actor` crash in Ray Client mode.
- Fixed datasource pushdown crashes for generic `UDFExpr` filter predicates.
- Fixed hash-shuffle aggregator memory estimation issues (metadata propagation, node-size clamp, column pruning).
- Fixed `CheckpointConfig` `FileNotFoundError` on Azure Blob Storage.
- Fixed silent credential drop for fsspec-S3 in the download expression.
- Fixed missing f-string prefix in `_concatenate_extension_column`.
- Fixed `HashAggregate` duplicate group rows for `AggregateFnV2`.
- Fixed JSONL read retry with advanced file cursor.
- Fixed `read_parquet` `ArrowNotImplementedError` for nested column types exceeding ~2GB row group.
- Fixed `read_parquet` nested-type fallback and parquet scanner memory accumulation.
- Fixed memory leak in `DataIterator.to_torch()` by switching to `PyArrow`.
- Fixed `ZipOperator` freeing shared blocks via `_split_at_indices`.
- Fixed concurrent writes race condition in `write_parquet`.
- Fixed GPU shuffle output ordering when using `ShuffleStrategy.GPU_SHUFFLE`.
- Fixed incorrect `DatasetStat` uuid propagation.
- Fixed issue when `DATA_ENABLE_OP_RESOURCE_RESERVATION=False` resulted in None.
- Fixed filesystem compatibility check for fsspec-wrapped `PyFileSystem`.
- Fixed autoscaler bug blocking timely release of leased resources.
- Fixed inconsistent `nan_is_null`/nans-as-nulls semantics in encoder.
- Skipped unconditional null strip in `find_partition_index`.
- Fixed V1 `_split_predicate_by_columns` correctness.
- Avoided importing cudf in `_is_cudf_dataframe` when cudf is not loaded.
- Reverted raw-modulo hash partition fast path.
- Removed `tfx-bsl` support from `read_tfrecords`.
Affected Symbols
Dataset.mix()MixOperatorParquetDatasourceV2Dataset.map_batchesread_parquetiter_batchesfilter(expr=...)DataIterator.to_torchConcurrencyCapBackpressurePolicyray.io/gpu-domainAutoscaler v2ConsistentHashRouterCapacityQueueRouterAggregateFnV2HashAggregateCheckpointConfigfsspec-S3ZipOperatorwrite_parquetShuffleStrategy.GPU_SHUFFLEDatasetStatDATA_ENABLE_OP_RESOURCE_RESERVATIONPyFileSystempyarrow.dataset.write_datasetread_tfrecords
⚡ Deprecations
- The parameter `concurrency=` in `filter(expr=...)` is deprecated; use `compute=` instead.
- The `DataIterator.to_torch` method is deprecated.
- Using pandas UDF batches is deprecated.
- The `ConcurrencyCapBackpressurePolicy` is deprecated.