cuDF数据处理极速指南!JIT编译提速+成本直降40%

2025-08-08AI工具

Image

在数据处理领域,利用GPU加速已是大势所趋。RAPIDS cuDF 为数据处理提供了强大的ETL算法支持。对于熟悉pandas的用户,cuDF通过cudf.pandas方案,无需修改代码即可体验加速。而对于C++开发者和高级用户,直接使用cuDF中的C++子模块,则能开启更多功能和性能优化选项。

cuDF C++编程模型以非拥有视图作为输入,并返回拥有类型作为输出。这种方式简化了GPU数据的生命周期和所有权管理,并提升了cuDF API的组合性。不过,这种模型的一个潜在缺点是,某些操作可能会产生过多的中间结果,导致GPU内存传输开销增大。

解决GPU内存传输过多的一个有效方法是内核融合,即用单个GPU内核对同一输入数据执行多个计算。本文将深入探讨如何利用JIT(Just-In-Time)编译将内核融合引入cuDF C++编程模型,从而提高数据处理吞吐量,并更有效地利用GPU内存和计算资源。新媒网跨境认为,这将为跨境电商等需要处理大量数据的行业带来显著的效率提升。

cuDF中的表达式求值

在数据处理中,表达式通常表示为操作数和运算符组成的树状结构,其中每个叶节点是列或标量,而每个交叉点是运算符(如图1所示)。在典型情况下,标量表达式将一个或多个输入转换为单个输出列。标量表达式通常表示输入和输出之间的行式映射,其中每个输入行产生一个输出行。
标量表达式表示为表达式树(左)和表达式字符串(右)

图1. 标量表达式表示为表达式树(左)和表达式字符串(右)

对于算术表达式,cuDF提供了三种求值选项:预编译、AST(抽象语法树)和JIT转换。

  1. 预编译方法:针对表达式中的每个运算符,调用 libcudf 公共API,以递归方式计算树。libcudf 中的预编译函数调用具有最广泛的数据类型和运算符支持的优点。主要缺点是每个运算符在求值期间都会在GPU全局内存中实现中间结果。

  2. AST方法:使用 libcudf 中的 compute_column API,它接受完整的树作为参数,然后使用专用内核来遍历和计算树。AST执行使用每个GPU线程对应一行的并行模型。AST解释器内核是cuDF中内核融合的有用工具,但在数据类型支持和运算符支持方面存在限制。

  3. JIT转换方法:cuDF中的JIT转换方法使用NVRTC来JIT编译自定义内核,以完成任意转换。NVRTC是CUDA C++的运行时编译库,可在运行时创建融合内核。JIT编译的优点是可以使用优化的内核来计算表达式。这意味着编译器可以有效地分配GPU资源,而不是为最坏的情况保留GPU寄存器。

从cuDF 25.08版本开始,JIT转换增加了对AST执行不支持的几个关键运算符的支持,包括用于if-else分支的三元运算符,以及诸如find和substring之类的字符串函数。JIT编译的主要缺点是,大约600毫秒的内核编译时间必须在运行时支付,或者通过预先填充JIT缓存来管理。本文后面的部分将更详细地讨论此主题。

使用JIT转换

rapidsai/cudf GitHub存储库提供了一套 string_transforms 示例,用于演示使用预编译方法和新的JIT转换方法进行字符串操作。这些示例以用户定义函数(UDF)的形式出现,用于字符串处理。

extract_email_jit JIT 和 extract_email_precompiled 示例侧重于这样一种计算,该计算接受一个输入字符串,确认字符串的基本格式为电子邮件地址,然后从字符串中提取电子邮件提供商。对于典型的电子邮件地址(如 user@provider.com),目标输出将是 provider。如果输入格式错误,则该示例将返回 unknown 作为替代条目。

图2显示了 extract_email_precompiled 示例,其中以绿色突出显示的逻辑用于识别“@”和“.”的位置。以粉红色突出显示的逻辑根据“@”和“.”字符的存在和位置来计算 is_valid 字段。最后,以蓝色突出显示的逻辑从输入字符串中分割出提供商,并在输入无效时复制替代条目。这种方法可以产生正确的结果,但会使用额外的内存和计算来物化字符位置、多个布尔列以及包含替代条目的列。
来自extract_email_precompiled的代码块,按三个逻辑步骤对每行进行颜色突出显示

图2. 来自 extract_email_precompiled 的代码块,突出显示字符检测逻辑(绿色)、验证逻辑(粉色)和结果构造(蓝色)

使用JIT编译,您可以创建一个GPU内核,以更有效地执行相同的工作。图3显示了 extract_email_jit 示例,该示例使用原始字符串“udf”来定义转换。此过程首先查找“@”字符并在该字符处进行切片,然后查找“.”字符并在该字符处进行切片。

与在预编译示例中一样,在每个步骤中将数据作为完整列进行处理相比,操作序列使验证检查变得更加简单。UDF使用标准的C++模式,例如if-else分支和提前返回,以简化逻辑。
来自extract_email_jit的代码块,按三个逻辑步骤对每行进行颜色突出显示

图3. 来自 extract_email_jit 的代码块,突出显示字符检测逻辑(绿色)、验证逻辑(粉色)和结果构造(蓝色)

我们鼓励您浏览其他示例,以了解更多这些差异的实际应用。

JIT编译的性能优势

使用JIT转换方法处理UDF会导致比使用预编译方法更快的运行时间。加速的主要来源是由于JIT转换方法中的总内核数较少。当可以使用更少的内核执行相同的工作时,计算通常具有更好的缓存局部性,并且GPU寄存器可以保存中间结果,否则这些中间结果必须存储在全局内存中以供后续内核使用。

图4显示了三个字符串转换示例的内核启动时间线,其中蓝色条表示由预编译方法启动的内核,绿色条表示由JIT转换方法启动的内核。时间线数据是使用CUDA异步内存资源在NVIDIA GH200 Grace Hopper Superchip硬件上以2亿个输入行(12.5 GB输入文件大小)收集的。请注意,已省略运行时间<10μs的内核。
条形图,显示extract_email在预编译时需要49 ms和19个内核,在JIT编译时需要22 ms和4个内核;format_phone在预编译时需要81 ms和34个内核,在JIT编译时需要35 ms和6个内核;localize_phone在预编译时需要114 ms和45个内核,在JIT编译时需要25 ms和4个内核。

图4. 时间线图,显示在执行string_transforms中示例案例的UDF期间GPU内核的计数和持续时间

JIT转换方法显示出一种随数据大小缩放的优势。在较小的数据大小下,JIT转换方法由于内核启动次数较少而显示出较少的开销,并且这提供了基于UDF复杂性的加速。除了减少开销外,JIT转换方法还使用较少的GPU内存带宽和计算资源,这转化为与在较大数据大小下相比,与预编译方法相比,速度提高了更多。

图5显示了 localize_phone 示例案例的加速比为2倍到4倍,而对于更简单的 extract_emailformat_phone 示例案例,加速比为1倍到2倍。请注意,由于物化中间结果较少,因此JIT转换方法在达到Grace Hopper Superchip上约100 GB的GPU内存限制之前,会处理大约30%更大的数据大小。
散点图,显示JIT转换与预编译方法的对比,Y轴显示JIT转换与预编译方法的加速比从1倍到4倍,X轴显示文件大小从60 MB到40 GB。加速比随着文件大小的增加而亚线性增加。

图5. 对于string_transforms中的示例案例,JIT转换方法与预编译方法的加速比,针对60 MB到40 GB的文件大小绘制

JIT编译的特殊成本

JIT编译还为高效执行带来了一些独特的挑战。当JIT转换方法首次运行时,cuDF将检查位于环境变量LIBCUDF_KERNEL_CACHE_PATH指定的路径中的内核缓存。在此示例中,缓存的内核大小约为130 KB。如果未找到缓存的内核,则 string_transforms 示例中的JIT编译时间对于每个内核大约需要600 ms。如果找到内核,则加载它大约需要3 ms。

编译和加载后,在同一进程中后续调用内核不会产生额外的开销。图6显示了首次运行的计时,其中每次重复都是一个新进程,并且重复1从一个空的内核缓存开始。由于使用NVRTC进行JIT编译,JIT编译的时间在首次执行时显示出更高的挂钟时间,随后的挂钟时间急剧下降。挂钟时间在示例中报告为“预热时间”,数据大小为2亿行。
散点图,显示挂钟时间与重复次数的关系,Y轴显示挂钟时间(以毫秒为单位),从20到1000,X轴显示重复次数,从1到6。

图6. 该示例的挂钟时间,针对该示例在全新系统上运行的次数绘制

对于string_transforms中的示例,如果必须将JIT编译推迟到运行时,则收支平衡的数据大小约为1-3B行,以约1亿行的批次处理。如果应用程序层使用先前编译的内核预先填充JIT缓存,则即使从前一百万行开始,JIT转换通常也会产生好处。

开始在cuDF中进行高效转换

NVIDIA cuDF提供了强大、灵活且加速的工具,用于处理表达式和UDF。有关CUDA加速数据帧的更多信息,请参见cuDF文档和rapidsai/cudf GitHub存储库。为了更容易地进行测试和部署,RAPIDS Docker容器也可用于发行版和每日构建。

为了开始使用libcudf(cuDF的C++子模块),我们建议使用rapidsai-nightly Conda通道安装预构建的二进制文件。找到libcudf-example Conda软件包并安装本文中介绍的 string_transforms 示例。libcudf-tests Conda软件包包括单元测试和微基准测试,因此可以轻松运行和分析cuDF预编译和JIT编译的表达式求值器。

新媒网跨境获悉,NVIDIA cuDF的JIT编译为跨境电商等数据密集型应用带来了显著的性能提升。通过内核融合和优化的GPU资源利用,JIT编译能够加速数据处理流程,降低成本。当然,首次运行时的编译开销需要考虑,可以通过预填充JIT缓存等方式来缓解。总体而言,JIT编译是cuDF中一项强大的功能,值得深入研究和应用。新媒网跨境提醒,由于技术迭代迅速,请务必参考最新的cuDF官方文档和示例代码,以确保最佳实践。

新媒网(公号: 新媒网跨境发布),是一个专业的跨境电商、游戏、支付、贸易和广告社区平台,为百万跨境人传递最新的海外淘金精准资讯情报。

本文来源:新媒网 https://nmedialink.com/posts/11817.html

评论(0)

暂无评论,快来抢沙发~
cuDF通过JIT编译和内核融合优化GPU数据处理,提升性能。`cudf.pandas`方便pandas用户迁移,C++子模块提供更多功能。NVRTC支持运行时编译,减少GPU内存传输开销。新媒网跨境认为该技术为跨境电商等大数据行业带来效率提升。
发布于 2025-08-08
查看人数 758
人民币汇率走势
CNY
亚马逊热销榜
共 0 SKU 上次更新 NaN:NaN:NaN
类目: 切换分类
暂无数据
暂无数据
关注我们
新媒网跨境发布
本站原创内容版权归作者及NMedia共同所有,未经许可,禁止以任何形式转载。