数据分析数据工程机器学习【免费下载链接】cudfcuDF - GPU DataFrame Library项目地址https://gitcode.com/gh_mirrors/cu/cudf点击查看免费下载cuDF 的文档页 interop_dlpack.rst 通过 Doxygen 组interop_dlpack渲染了 libcudf 中 DLPack 互操作的核心 APIcudf::from_dlpack与cudf::to_dlpack。这两个函数是 cuDF 表cudf::table/cudf::table_view与 DLPack 张量DLManagedTensor之间的标准转换边界使 cuDF 能够与 PyTorch、CuPy 等任何支持__dlpack__协议的 GPU 张量库交换数据。读完本文你将掌握这两个 API 的完整签名、约束条件设备类型、维度、内存布局、数据类型映射以及底层拷贝语义并能用 C 或 Pythonpylibcudf在实际工程中完成双向转换。文档页面与 API 声明原始文档页只有两行有效内容.. doxygengroup:: interop_dlpack :members:即通过doxygengroup指令自动渲染 Doxygen 组interop_dlpack的全部成员文档。该组在头文件 interop.hpp 中声明组的正式成员就是from_dlpack与to_dlpack两个函数入站std::unique_ptrtable from_dlpack(DLManagedTensor const* managed_tensor, ...)将外部张量导入为 cuDF 表出站DLManagedTensor* to_dlpack(table_view const input, ...)将 cuDF 表导出为张量。头文件声明interop.hpp如下两个函数都接受可选的cuda::stream_ref stream与rmm::device_async_resource_ref mr默认分别为cudf::get_default_stream()和cudf::get_current_device_resource_ref()std::unique_ptrtable from_dlpack( DLManagedTensor const* managed_tensor, cuda::stream_ref stream cudf::get_default_stream(), rmm::device_async_resource_ref mr cudf::get_current_device_resource_ref()); DLManagedTensor* to_dlpack( table_view const input, cuda::stream_ref stream cudf::get_default_stream(), rmm::device_async_resource_ref mr cudf::get_current_device_resource_ref());注意 DLPack 头文件在 libcudf 中是以构建期第三方依赖方式引入的见 get_dlpack.cmakeinterop.hpp只前向声明了struct DLManagedTensor避免把 DLPack 头泄漏进所有消费者interop.hpp。数据类型映射DLPack 与 libcudf 的类型系统并不一一对应。从源码 dlpack.cpp 的DLDataType_to_data_type可以确认完整的映射规则也是from_dlpack唯一接受的类型集合DLPack 类型bits对应 cudf data_typekDLInt8 / 16 / 32 / 64INT8/INT16/INT32/INT64kDLUInt8 / 16 / 32 / 64UINT8/UINT16/UINT32/UINT64kDLFloat32 / 64FLOAT32/FLOAT64硬性约束违反即抛cudf::logic_errorlanes必须为 1即不支持复数或向量类型源码中的CUDF_EXPECTS(type.lanes 1, ...)其他code如kDLOpaque、kBfloat直接CUDF_FAIL整数位宽超出 {8, 16, 32, 64} 或浮点位宽超出 {32, 64} 也不支持。反向映射由data_type_to_DLDataTypedlpack.cpp完成浮点映射到kDLFloat有符号整数映射到kDLInt无符号映射到kDLUIntbits sizeof(T) * 8非数值类型字符串、时间戳、列表、结构、布尔等一律拒绝抛cudf::logic_error。这一点与文档注释一致All columns must have the same data type and this type must be numeric。from_dlpack约束与实现细节from_dlpack的文档注释列出了顶层约束device_type必须是kDLCPU、kDLCuda或kDLCUDAHostdevice_id必须匹配当前设备ndim必须为 1 或 2且该函数不会删除传入的 managed tensor所有权仍归调用方。实现位于 detail::from_dlpack逐条校验并执行数据拷贝设备校验L134-L143接受 CPU、CUDA、CUDAHost 三类指针若为非 CPU 设备调用cudaGetDevice确认tensor.device.device_id与当前设备一致。维度与布局校验L146-L1651D必须是紧凑布局strides nullptr或strides[0] 1空张量shape[0] 0例外2D只接受**列主序column-major / Fortran order**数据即strides[0] 1且strides[1] shape[0]或退化的(N, 1)紧凑形状。行主序C order张量会被直接拒绝——测试 dlpack_test.cpp 中UnsupportedImplicitRowMajor2DTensorFromDlpack与UnsupportedExplicitRowMajor2DTensorFromDlpack正是覆盖这两个场景广播张量stride-0与任意非单位步进的 1D 张量同样被拒绝。尺寸上限L166-L177shape[0]与shape[1]不得超过size_type最大值否则抛std::overflow_error即列大小上限通常为 2^31-1。逐列拷贝L193-L206计算tensor.data byte_offset作为起点对每一列make_numeric_column后执行detail::memcpy_async支持 host→device、device→device 等方向列与列之间按col_stride byte_width * strides[1]步进1D 或无 strides 时退化为byte_width * num_rows。由此可得出几个实用结论from_dlpack总是产生数据拷贝结果表拥有自己的设备内存byte_offset被正确支持测试FromDlpackCpudlpack_test.cpp就验证了带byte_offset与稀疏 strides 的 host 2D 张量导入空表无法表达类型信息to_dlpack对空表返回nullptrfrom_dlpack(nullptr)则抛cudf::logic_error。to_dlpack约束、拷贝语义与所有权to_dlpack的文档注释interop.hpp给出了三条核心规则实现 detail::to_dlpack 与之严格对应所有列必须同类型且为数值类型L222-L224all_have_same_typesdata_type_to_DLDataType否则抛data_type_error列可以带空值掩码但 null 计数必须为 0L227-L229——DLPack 本身没有 null 语义因此可空但实际无空值的列可以通过含空值的列抛错空表0 行且 0 列返回nullptrL213-L215因为无法为没有类型信息的空表构造合法的 DLPack 对象。其余实现要点形状与步长单列导出为 1Dstrides nullptr多列导出为 2D 列主序张量strides[0] 1、strides[1] num_rowsdlpack.cpp设备字段device_type kDLCUDAdevice_id通过cudaGetDevice取得总是执行数据拷贝源码注释L250-L257明确说明即使是单列也始终把每列数据拷贝到一块新分配的rmm::device_buffer中以保证导出的张量独立于源列的后续修改所有权与释放返回的DLManagedTensor所有权移交给调用方其manager_ctx指向内部dltensor_context持有 shape/strides 数组与 device buffer必须调用deleter(manager_ctx)释放否则会泄漏dlpack.cpp同步语义函数返回前会对 stream 执行cudf::detail::sync_streamL276-L278因为返回后数据可能被 host 端立即访问例如 pinned memory 场景必须保证异步拷贝完成。C 侧最小使用模式参考测试 dlpack_test.cpp 的所有权包装写法#include cudf/interop.hpp #include dlpack/dlpack.h struct dlpack_deleter { void operator()(DLManagedTensor* t) { t-deleter(t); } }; using unique_managed_tensor std::unique_ptrDLManagedTensor, dlpack_deleter; // 导出table_view - DLPack 张量 unique_managed_tensor tensor{cudf::to_dlpack(table_view_of_numeric_cols)}; // 使用 tensor-dl_tensordata/shape/strides/dtype... // 导入DLPack 张量 - cudf::table总是拷贝不消费输入 std::unique_ptrcudf::table result cudf::from_dlpack(tensor.get());Python 层pylibcudf 的 interop 封装cuDF 的 Python 栈通过 pylibcudf/interop.pyx 将上述 C API 暴露为plc.interop.from_dlpack与plc.interop.to_dlpack桥接层额外处理了 PyCapsule 协议plc.interop.from_dlpack接收任何实现了__dlpack__()的 Python 对象NumPy 数组、CuPy 数组等用PyCapsule_GetPointer取出DLManagedTensor*由于 C 侧from_dlpack不删除输入张量PyXLL 封装层在完成转换后会主动调用dlpack_tensor.deleter释放 capsule 指向的对象interop.pyx 中的注释与代码明确了这一点plc.interop.to_dlpack则把 C 返回的DLManagedTensor重新封装回 PyCapsule 交给下游张量库由消费方按 DLPack 协议负责释放。因此 Python 侧的完整往返非常直接test_interop.py 给出了两个可复现的示例import pylibcudf as plc # cudf 表 - DLPack capsule - cudf 表 往返 plc_table plc.Table.from_arrow(pa.table({a: [1, 2, 3], b: [5, 6, 7]})) result plc.interop.from_dlpack(plc.interop.to_dlpack(plc_table))import cupy as cp import numpy as np # 直接从 NumPy / CuPy 数组经 __dlpack__ 进入 cudf arr cp.array([1, 2, 3]) plc.interop.from_dlpack(arr.__dlpack__())同文件中的边界测试也印证了 C 层约束在 Python 侧的行为to_dlpack遇到含 null 的表会抛出ValueErrorCannot create a DLPack tensorfrom_dlpack传入非 capsule 对象抛出 Invalid PyCapsule objecttest_interop.py。边界情况与测试矩阵C 测试 cpp/tests/interop/dlpack_test.cpp 对全部约束做了系统化覆盖可作为接入前自检清单测试用例场景预期EmptyTableToDlpack0 列 0 行空表to_dlpack返回nullptrEmptyColsToDlpack0 行的两列 int32 表合法 2D 空张量strides全 0可往返NullTensorFromDlpack传nullptr给from_dlpack抛cudf::logic_errorMultipleTypesToDlpack列类型不一致int16 int32抛cudf::data_type_errorInvalidNullsToDlpack含 null 的列抛cudf::logic_errorStringTypeToDlpack字符串列抛cudf::logic_errorChronoTypesToDlpack时间戳列抛cudf::logic_errorUnsupportedDeviceTypeFromDlpack/InvalidDeviceIdFromDlpack伪造设备类型/设备 ID抛cudf::logic_errorTooManyRowsFromDlpack/TooManyColsFromDlpack维度超过 size_type 上限抛std::overflow_errorInvalidTypeFromDlpack/UnsupportedIntBitsizeFromDlpack/UnsupportedLanesFromDlpack非法 dtype code / 位宽 / lanes抛cudf::logic_errorUnsupportedBroadcast1DTensorFromDlpack/UnsupportedStrided1DTensorFromDlpackstride-0 或任意步进的 1D 张量抛cudf::logic_errorUnsupportedImplicit/ExplicitRowMajor2DTensorFromDlpack、UnsupportedStridedColMajor2DTensorFromDlpack行主序 2D 或列内带步进的 2D 张量抛cudf::logic_errorToDlpack1D/ToDlpack2D/FromDlpack1D/FromDlpack2D/FromDlpackCpu数值类型的往返正确性含 host 源、byte_offset表内容与输入一致另外streams/interop_test.cpp 中还包含针对 stream 使用行为的 DLPack 相关测试说明这两个 API 遵循 libcudf 的 stream 语义所有拷贝与 kernel 均在指定 stream 上执行。使用建议与限制小结适用前提交换的数据必须是纯数值、无空值的同类型多列数据维度上限 22D 输入必须列主序行主序需先在源端转置性能特征from_dlpack与to_dlpack均为拷贝式转换to_dlpack还额外sync_stream不做零拷贝共享。若需要与 Arrow 生态而非张量生态做零拷贝 GPU 数据交换应使用同一头文件中interop_arrow组的to_arrow_device/from_arrow_device等 API见 interop.hpp它们可以零拷贝地包装 GPU 数据并遵循 Arrow C Data Interface所有权纪律C 侧记得对返回的DLManagedTensor调用deleterPython 侧由 pylibcudf 自动管理 capsule 生命周期只需保证__dlpack__()的对象在转换期间存活与文档页的对应关系本文所有 API 语义、参数默认值与异常说明均直接来自 interop.hpp 中interop_dlpack组的 Doxygen 注释即文档页渲染的原始内容实现细节以 dlpack.cpp 为准行为边界以 dlpack_test.cpp 与 test_interop.py 的测试为准。赞分享数据分析数据工程机器学习【免费下载链接】cudfcuDF - GPU DataFrame Library项目地址https://gitcode.com/gh_mirrors/cu/cudf点击查看免费下载相关推荐cuDF libcudf Column Interop 完全指南DLPack 与 Apache Arrow 数据互操作 API 详解cuDF libcudf Column Interop 完全指南DLPack 与 Apache Arrow 数据互操作 API 详解 导读 本文围绕 libc数据分析数据工程机器学习JAX 与 DLPack跨框架零拷贝张量互操作的协议实现与实战指南JAX 与 DLPack跨框架零拷贝张量互操作的协议实现与实战指南 本文围绕 docs/jax.dlpack.rst https://link.gitcode人工智能机器学习深度学习编译器高性能计算如何用 DLPack 协议在 PyArrow 与张量框架之间交换数据如何用 DLPack 协议在 PyArrow 与张量框架之间交换数据 如果你的数据管道一端是 PyArrow例如从 Parquet、CSV 或 Flight大数据数据分析数据工程序列化上一篇React-redux-toastr 性能优化技巧防止重复通知、内存泄漏与渲染优化下一篇如何在10分钟内搭建Unitree机器人仿真环境终极完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
