CPU 用户定义函数可能中断原本由 GPU 加速的 Apache Spark 查询。cuDF 插件通常无法转换任意 UDF 代码:它把列式数据转成行,在 CPU 上运行函数,再将结果转回列式数据。 NVIDIA 10 月 13 日的指南 介绍了将 UDF 重写为 Spark SQL、列式 RapidsUDF, 或 RapidsUDF 加 CUDA 的智能体技能。对数据工程师而言,关键是重写后答案是否相同、相关计划是否仍在 GPU 上执行,以及实际作业是否有所改善。
本文依据文档编写。BIG CHANGE 未运行这些技能、未测试 UDF,也未测量 Spark 工作负载。
重大变化
- 发生了什么变化: NVIDIA 发布了分阶段的智能体工作流,用于生成 UDF 测试、转换函数、评估转换、比较 CPU 与 GPU 版本,并可选地优化 cuDF 实现。
- 适用对象: 拥有支持 GPU 的 RAPIDS/cuDF Spark 流水线,且有一个会中断流水线的特定 CPU UDF 的工程师。
- 需要验证: 有代表性的边缘案例输出一致、执行计划不再出现目标 CPU 回退,并且目标硬件上的作业级性能可重复。
开始之前
选择一个你获准与编程智能体共享的 UDF。除非智能体和运行环境获准处理,否则不要在提示中放入凭据、敏感输入行或专有数据集。提供 UDF 源码、注册方式和调用位置、相关模式、对 null 和错误行为的预期,以及获准使用的小型测试夹具。记录现有 Spark 作业的执行计划和耗时,作为比较基线。
该 技能 README 是此工作流的版本化起点。它要求用 Maven 和 JDK 构建 UDF,并配备兼容的 Spark/RAPIDS/cuDF/CUDA 技术栈与 GPU。安装前请查看 当前插件兼容性指南 ,核对 Spark 发行版、Scala 版本、驱动程序、CUDA 构建和 GPU。云 GPU 也是一种选择,但实例时间和存储由提供商计费。使用智能体或模型也可能产生费用。README 提供项目脚手架和示例,却不能证明你的集群兼容或具备相应性能。
重写并检查一个函数
- 先明确原有行为。 要求智能体在所选 UDF 上使用
udf-gen-test,然后亲自检查生成的测试。按函数契约添加真实案例:视情况覆盖 null、空字符串或集合、格式错误的输入、边界值、数值精度、顺序和错误行为。用这些案例运行原 UDF。预期结果是基线测试套件通过,而不是立即重写。NVIDIA 的温度函数示例明确规定 null 输入返回 null;只有在实际数据类型和 Spark 设置下也保留这一行为,SQL 重写才有用。 - 选择最简单且受支持的目标。 对于可用 Spark SQL 或 DataFrame 表达式表达的逻辑,请选择
udf-convert-to-sql。这会将表达式交给 Spark 规划器,插件可能把受支持的操作替换为 GPU 等效操作。若 SQL 无法清晰表达所需逻辑,可选择udf-convert-to-cudf:其RapidsUDF.evaluateColumnar接收 GPU 列向量并组合 cuDF 操作。只有在确实需要通过 JNI 编写自定义内核,且额外实现和维护负担合理时,才考虑udf-convert-to-cuda。这些是待评估的选择,并不保证每项操作都会在 GPU 上运行。 - 接受转换前先审查。 将重写实现与原实现比较,并在相同的获准测试案例上运行。仓库还列出了
udf-judge-conversion,用于单独检查测试缺口和转换错误。检查类型、null 传播、舍入、异常、顺序和资源管理。对于 cuDF 重写,检查临时列和标量的生命周期; 教程中的 Scala 示例 使用作用域资源并返回结果列。生成的测试套件通过是有用证据,但仍须由人判断其是否覆盖函数契约。 - 检查执行计划。 启用 cuDF 插件运行修改后的查询,并检查目标算子及相邻转换的执行计划和 RAPIDS 诊断。NVIDIA 的 插件概览 说明,不受支持的 SQL 操作会回退至 Spark CPU。若计划仍显示 UDF 或相关算子在 CPU 上运行,请找出不受支持的表达式或类型,并重新考虑目标。保存修改前后的计划和测试结果。一个名为
RapidsUDF的类本身不能证明整个作业都在 GPU 上运行。 - 对计划运行的实际作业进行基准测试。 使用
udf-benchmark在相同输入、集群规模、配置和测量方法下比较原实现与修改后的实现。记录作业耗时、输入规模、输出等价性及 GPU/CPU 资源使用。重复运行,以发现启动、缓存或资源争用影响。如果正确的 cuDF 版本较慢,仓库提供udf-optimize-cudf用于分析和修改它;每次更改后都重新检查正确性和执行计划。预期结果是可复现的比较,即使重写版本更慢也一样。
成功的结果是什么样
当所选 UDF 在获准案例上的输出符合文档定义、执行计划不再包含目标 CPU 回退,且有代表性的基准测试显示端到端收益时,该方案才适合常规代码审查。若检查失败,保留原实现,将重写范围缩小至出错表达式,再重跑该阶段。语义不一致比更快的基准结果更重要;计划未变化就说明目标 GPU 路径尚未得到证实。
NVIDIA 报告了一项生产案例:启用 cuDF 的 UDF 将算子耗时从 274.55 小时降至 12.78 小时 ,工作负载为 6000 亿行。这是供应商报告的该工作负载算子耗时,并非其他 UDF 或端到端作业的预测。所谓 22 倍的总体说法应结合这一背景理解。GPU 容量、数据移动、不受支持的操作、代码审查及云费用都可能改变你的流水线结果。
来源与延伸阅读
- NVIDIA 技术博客,2026 年 10 月 13 日:介绍 CPU 回退、SQL/cuDF/CUDA 的选择、四个工作流阶段,以及公司唯一引用的性能案例。性能数字由供应商报告。
- NVIDIA cuDF Spark 技能,固定仓库版本:脚手架和各项技能的版本化入口。我们的检索方式无法访问固定版本的 GitHub 页面;工作流细节已与 NVIDIA 教程及仓库主分支可访问的技能 README 交叉核对。
- Apache Spark 的 cuDF 插件概览:当前设置和兼容性信息,并明确说明不受支持的操作会由 Spark CPU 执行。实施前请检查对应发行版的兼容性列表。



