Skip to content

Commit 61fb03d

Browse files
committed
Revert "pylibcudf.Column: add device_buffer_size and register a dask.sizeof function for cudf-polars Column and DataFrame (rapidsai#18602)"
This reverts commit 545d2a0.
1 parent 6a62d38 commit 61fb03d

File tree

10 files changed

+58
-134
lines changed

10 files changed

+58
-134
lines changed

docs/cudf/source/conf.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,6 @@ def _generate_namespaces(namespaces):
405405
"type_id",
406406
# Unknown base types
407407
"int32_t",
408-
"uint64_t",
409408
"void",
410409
}
411410

python/cudf_polars/cudf_polars/experimental/dask_registers.py renamed to python/cudf_polars/cudf_polars/experimental/dask_serialize.py

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
# SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES.
22
# SPDX-License-Identifier: Apache-2.0
33

4-
"""Dask function registrations such as serializers and dispatch implementations."""
4+
"""Dask serialization."""
55

66
from __future__ import annotations
77

88
from typing import TYPE_CHECKING, ClassVar, overload
99

10-
from dask.sizeof import sizeof as sizeof_dispatch
1110
from distributed.protocol import dask_deserialize, dask_serialize
1211
from distributed.protocol.cuda import cuda_deserialize, cuda_serialize
1312
from distributed.utils import log_errors
@@ -22,35 +21,35 @@
2221

2322
from cudf_polars.typing import ColumnHeader, DataFrameHeader
2423

25-
__all__ = ["DaskRegisterManager", "register"]
24+
__all__ = ["SerializerManager", "register"]
2625

2726

28-
class DaskRegisterManager: # pragma: no cover; Only used with Distributed scheduler
27+
class SerializerManager: # pragma: no cover; Only used with Distributed scheduler
2928
"""Manager to ensure ensure serializer is only registered once."""
3029

31-
_registered: bool = False
30+
_serializer_registered: bool = False
3231
_client_run_executed: ClassVar[set[str]] = set()
3332

3433
@classmethod
35-
def register_once(cls) -> None:
34+
def register_serialize(cls) -> None:
3635
"""Register Dask/cudf-polars serializers in calling process."""
37-
if not cls._registered:
38-
from cudf_polars.experimental.dask_registers import register
36+
if not cls._serializer_registered:
37+
from cudf_polars.experimental.dask_serialize import register
3938

4039
register()
41-
cls._registered = True
40+
cls._serializer_registered = True
4241

4342
@classmethod
4443
def run_on_cluster(cls, client: Client) -> None:
45-
"""Run register on the workers and scheduler once."""
44+
"""Run serializer registration on the workers and scheduler."""
4645
if client.id not in cls._client_run_executed:
47-
client.run(cls.register_once)
48-
client.run_on_scheduler(cls.register_once)
46+
client.run(cls.register_serialize)
47+
client.run_on_scheduler(cls.register_serialize)
4948
cls._client_run_executed.add(client.id)
5049

5150

5251
def register() -> None:
53-
"""Register dask serialization and dispatch functions."""
52+
"""Register dask serialization routines for DataFrames."""
5453

5554
@overload
5655
def serialize_column_or_frame(
@@ -129,13 +128,3 @@ def _(header: ColumnHeader, frames: tuple[memoryview, memoryview]) -> Column:
129128
# Copy the second frame (the gpudata in host memory) back to the gpu
130129
frames = frames[0], plc.gpumemoryview(rmm.DeviceBuffer.to_device(frames[1]))
131130
return Column.deserialize(header, frames)
132-
133-
@sizeof_dispatch.register(Column)
134-
def _(x: Column) -> int:
135-
"""The total size of the device buffers used by the DataFrame or Column."""
136-
return x.obj.device_buffer_size()
137-
138-
@sizeof_dispatch.register(DataFrame)
139-
def _(x: DataFrame) -> int:
140-
"""The total size of the device buffers used by the DataFrame or Column."""
141-
return sum(c.obj.device_buffer_size() for c in x.columns)

python/cudf_polars/cudf_polars/experimental/parallel.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,11 @@ def get_scheduler(config_options: ConfigOptions) -> Any:
145145
): # pragma: no cover; block depends on executor type and Distributed cluster
146146
from distributed import get_client
147147

148-
from cudf_polars.experimental.dask_registers import DaskRegisterManager
148+
from cudf_polars.experimental.dask_serialize import SerializerManager
149149

150150
client = get_client()
151-
DaskRegisterManager.register_once()
152-
DaskRegisterManager.run_on_cluster(client)
151+
SerializerManager.register_serialize()
152+
SerializerManager.run_on_cluster(client)
153153
return client.get
154154
elif scheduler == "synchronous":
155155
from cudf_polars.experimental.scheduler import synchronous_scheduler

python/cudf_polars/tests/experimental/test_dask_serialize.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import rmm
1414

1515
from cudf_polars.containers import DataFrame
16-
from cudf_polars.experimental.dask_registers import register
16+
from cudf_polars.experimental.dask_serialize import register
1717

1818
# Must register serializers before running tests
1919
register()

python/cudf_polars/tests/experimental/test_dask_sizeof.py

Lines changed: 0 additions & 33 deletions
This file was deleted.

python/pylibcudf/pylibcudf/column.pxd

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
from libcpp.memory cimport unique_ptr
44
from libcpp.vector cimport vector
5-
from libc.stdint cimport uint64_t
6-
75
from rmm.librmm.device_buffer cimport device_buffer
86
from rmm.pylibrmm.stream cimport Stream
97
from pylibcudf.libcudf.column.column cimport column
@@ -70,7 +68,6 @@ cdef class Column:
7068
cpdef gpumemoryview null_mask(self)
7169
cpdef list children(self)
7270
cpdef Column copy(self)
73-
cpdef uint64_t device_buffer_size(self)
7471
cpdef Column with_mask(self, gpumemoryview, size_type)
7572

7673
cpdef ListColumnView list_view(self)

python/pylibcudf/pylibcudf/column.pyi

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ class Column:
5050
def null_mask(self) -> gpumemoryview | None: ...
5151
def children(self) -> list[Column]: ...
5252
def copy(self) -> Column: ...
53-
def device_buffer_size(self) -> int: ...
5453
def with_mask(
5554
self, mask: gpumemoryview | None, null_count: int
5655
) -> Column: ...

python/pylibcudf/pylibcudf/column.pyx

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ from ._interop_helpers cimport (
5151
from .null_mask cimport bitmask_allocation_size_bytes
5252
from .utils cimport _get_stream
5353

54-
from .gpumemoryview import _datatype_from_dtype_desc
5554
from ._interop_helpers import ColumnMetadata
5655

5756
import functools
5857

58+
5959
__all__ = ["Column", "ListColumnView", "is_c_contiguous"]
6060

6161

@@ -767,30 +767,6 @@ cdef class Column:
767767
c_result = make_unique[column](self.view())
768768
return Column.from_libcudf(move(c_result))
769769

770-
cpdef uint64_t device_buffer_size(self):
771-
"""
772-
The total size of the device buffers used by the Column.
773-
774-
Notes
775-
-----
776-
Since Columns rely on Python memoryview-like semantics to maintain
777-
shared ownership of the data, the device buffers underlying this column
778-
might be shared between other data structures including other columns.
779-
780-
Returns
781-
-------
782-
Number of bytes.
783-
"""
784-
cdef uint64_t ret = 0
785-
if self.data() is not None:
786-
ret += self.data().nbytes
787-
if self.null_mask() is not None:
788-
ret += self.null_mask().nbytes
789-
if self.children() is not None:
790-
for child in self.children():
791-
ret += (<Column?>child).device_buffer_size()
792-
return ret
793-
794770
def _create_nested_column_metadata(self):
795771
return ColumnMetadata(
796772
children_meta=[
@@ -879,6 +855,34 @@ cdef class ListColumnView:
879855
return lists_column_view(self._column.view())
880856

881857

858+
@functools.cache
859+
def _datatype_from_dtype_desc(desc):
860+
mapping = {
861+
'u1': type_id.UINT8,
862+
'u2': type_id.UINT16,
863+
'u4': type_id.UINT32,
864+
'u8': type_id.UINT64,
865+
'i1': type_id.INT8,
866+
'i2': type_id.INT16,
867+
'i4': type_id.INT32,
868+
'i8': type_id.INT64,
869+
'f4': type_id.FLOAT32,
870+
'f8': type_id.FLOAT64,
871+
'b1': type_id.BOOL8,
872+
'M8[s]': type_id.TIMESTAMP_SECONDS,
873+
'M8[ms]': type_id.TIMESTAMP_MILLISECONDS,
874+
'M8[us]': type_id.TIMESTAMP_MICROSECONDS,
875+
'M8[ns]': type_id.TIMESTAMP_NANOSECONDS,
876+
'm8[s]': type_id.DURATION_SECONDS,
877+
'm8[ms]': type_id.DURATION_MILLISECONDS,
878+
'm8[us]': type_id.DURATION_MICROSECONDS,
879+
'm8[ns]': type_id.DURATION_NANOSECONDS,
880+
}
881+
if desc not in mapping:
882+
raise ValueError(f"Unsupported dtype: {desc}")
883+
return DataType(mapping[desc])
884+
885+
882886
def is_c_contiguous(
883887
shape: Sequence[int], strides: None | Sequence[int], itemsize: int
884888
) -> bool:
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
# Copyright (c) 2023-2025, NVIDIA CORPORATION.
2-
from libc.stdint cimport uint64_t, uintptr_t
2+
from libc.stdint cimport uintptr_t
33

44
cdef class gpumemoryview:
55
# TODO: Eventually probably want to make this opaque, but for now it's fine
66
# to treat this object as something like a POD struct
77
cdef readonly uintptr_t ptr
88
cdef readonly object obj
99
cdef readonly dict cai
10-
cdef readonly uint64_t nbytes

python/pylibcudf/pylibcudf/gpumemoryview.pyx

Lines changed: 12 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,8 @@
33
import functools
44
import operator
55

6-
from .types cimport DataType, size_of, type_id
7-
8-
from pylibcudf.libcudf.types cimport size_type
9-
10-
116
__all__ = ["gpumemoryview"]
127

13-
14-
@functools.cache
15-
def _datatype_from_dtype_desc(desc):
16-
mapping = {
17-
'u1': type_id.UINT8,
18-
'u2': type_id.UINT16,
19-
'u4': type_id.UINT32,
20-
'u8': type_id.UINT64,
21-
'i1': type_id.INT8,
22-
'i2': type_id.INT16,
23-
'i4': type_id.INT32,
24-
'i8': type_id.INT64,
25-
'f4': type_id.FLOAT32,
26-
'f8': type_id.FLOAT64,
27-
'b1': type_id.BOOL8,
28-
'M8[s]': type_id.TIMESTAMP_SECONDS,
29-
'M8[ms]': type_id.TIMESTAMP_MILLISECONDS,
30-
'M8[us]': type_id.TIMESTAMP_MICROSECONDS,
31-
'M8[ns]': type_id.TIMESTAMP_NANOSECONDS,
32-
'm8[s]': type_id.DURATION_SECONDS,
33-
'm8[ms]': type_id.DURATION_MILLISECONDS,
34-
'm8[us]': type_id.DURATION_MICROSECONDS,
35-
'm8[ns]': type_id.DURATION_NANOSECONDS,
36-
}
37-
if desc not in mapping:
38-
raise ValueError(f"Unsupported dtype: {desc}")
39-
return DataType(mapping[desc])
40-
41-
428
cdef class gpumemoryview:
439
"""Minimal representation of a memory buffer.
4410
@@ -61,19 +27,23 @@ cdef class gpumemoryview:
6127
# TODO: Need to respect readonly
6228
self.ptr = cai["data"][0]
6329

64-
# Compute the buffer size.
65-
cdef size_type itemsize = size_of(
66-
_datatype_from_dtype_desc(
67-
cai["typestr"][1:] # ignore the byteorder (the first char).
68-
)
69-
)
70-
self.nbytes = functools.reduce(operator.mul, cai["shape"]) * itemsize
71-
7230
@property
7331
def __cuda_array_interface__(self):
7432
return self.cai
7533

7634
def __len__(self):
7735
return self.obj.__cuda_array_interface__["shape"][0]
7836

37+
@property
38+
def nbytes(self):
39+
cai = self.obj.__cuda_array_interface__
40+
shape, typestr = cai["shape"], cai["typestr"]
41+
42+
# Get element size from typestr, format is two character specifying
43+
# the type and the latter part is the number of bytes. E.g., '<f4' for
44+
# 32-bit (4-byte) float.
45+
element_size = int(typestr[2:])
46+
47+
return functools.reduce(operator.mul, shape) * element_size
48+
7949
__hash__ = None

0 commit comments

Comments
 (0)