Markdown 版本
AI-translated from English; not yet reviewed by a fluent editor.
# 如何检查 Spark UDF 重写是否在 GPU 上执行
> 一套实用流程:测试一个 Spark UDF、选择 SQL、cuDF 或 CUDA、检查 CPU 回退,并在支持 GPU 的流水线上测量结果。
By BIG CHANGE Editorial
Published: 2026-10-14T02:55:41.136Z
Updated: 2026-10-14T02:55:41.136Z
Canonical: https://bigchange.ai/blog/spark-udf-gpu-rewrite-verification-guide

AI-generated conceptual illustration by BIG CHANGE. Generic server hardware; no NVIDIA product, Spark interface or measured result is depicted.
CPU 用户定义函数可能中断原本由 GPU 加速的 Apache Spark 查询。cuDF 插件通常无法转换任意 UDF 代码:它把列式数据转成行,在 CPU 上运行函数,再将结果转回列式数据。 [NVIDIA 10 月 13 日的指南](https://developer.nvidia.com/blog/rewrite-apache-spark-udfs-gpu-acceleration-ai-agents/) 介绍了将 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](https://github.com/NVIDIA/cudf-spark/tree/cb8150b7ee4b07863bb6b267f28885def24b177e/skills) 是此工作流的版本化起点。它要求用 Maven 和 JDK 构建 UDF,并配备兼容的 Spark/RAPIDS/cuDF/CUDA 技术栈与 GPU。安装前请查看 [当前插件兼容性指南](https://docs.nvidia.com/cudf-spark/latest/getting-started/overview.html) ,核对 Spark 发行版、Scala 版本、驱动程序、CUDA 构建和 GPU。云 GPU 也是一种选择,但实例时间和存储由提供商计费。使用智能体或模型也可能产生费用。README 提供项目脚手架和示例,却不能证明你的集群兼容或具备相应性能。
## 重写并检查一个函数
1. **先明确原有行为。** 要求智能体在所选 UDF 上使用 `udf-gen-test` ,然后亲自检查生成的测试。按函数契约添加真实案例:视情况覆盖 null、空字符串或集合、格式错误的输入、边界值、数值精度、顺序和错误行为。用这些案例运行原 UDF。预期结果是基线测试套件通过,而不是立即重写。NVIDIA 的温度函数示例明确规定 null 输入返回 null;只有在实际数据类型和 Spark 设置下也保留这一行为,SQL 重写才有用。
2. **选择最简单且受支持的目标。** 对于可用 Spark SQL 或 DataFrame 表达式表达的逻辑,请选择 `udf-convert-to-sql`。这会将表达式交给 Spark 规划器,插件可能把受支持的操作替换为 GPU 等效操作。若 SQL 无法清晰表达所需逻辑,可选择 `udf-convert-to-cudf`:其 `RapidsUDF.evaluateColumnar` 接收 GPU 列向量并组合 cuDF 操作。只有在确实需要通过 JNI 编写自定义内核,且额外实现和维护负担合理时,才考虑 `udf-convert-to-cuda` 。这些是待评估的选择,并不保证每项操作都会在 GPU 上运行。
3. **接受转换前先审查。** 将重写实现与原实现比较,并在相同的获准测试案例上运行。仓库还列出了 `udf-judge-conversion` ,用于单独检查测试缺口和转换错误。检查类型、null 传播、舍入、异常、顺序和资源管理。对于 cuDF 重写,检查临时列和标量的生命周期; [教程中的 Scala 示例](https://developer.nvidia.com/blog/rewrite-apache-spark-udfs-gpu-acceleration-ai-agents/) 使用作用域资源并返回结果列。生成的测试套件通过是有用证据,但仍须由人判断其是否覆盖函数契约。
4. **检查执行计划。** 启用 cuDF 插件运行修改后的查询,并检查目标算子及相邻转换的执行计划和 RAPIDS 诊断。NVIDIA 的 [插件概览](https://docs.nvidia.com/cudf-spark/latest/getting-started/overview.html) 说明,不受支持的 SQL 操作会回退至 Spark CPU。若计划仍显示 UDF 或相关算子在 CPU 上运行,请找出不受支持的表达式或类型,并重新考虑目标。保存修改前后的计划和测试结果。一个名为 `RapidsUDF` 的类本身不能证明整个作业都在 GPU 上运行。
5. **对计划运行的实际作业进行基准测试。** 使用 `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 日](https://developer.nvidia.com/blog/rewrite-apache-spark-udfs-gpu-acceleration-ai-agents/):介绍 CPU 回退、SQL/cuDF/CUDA 的选择、四个工作流阶段,以及公司唯一引用的性能案例。性能数字由供应商报告。
- [NVIDIA cuDF Spark 技能,固定仓库版本](https://github.com/NVIDIA/cudf-spark/tree/cb8150b7ee4b07863bb6b267f28885def24b177e/skills):脚手架和各项技能的版本化入口。我们的检索方式无法访问固定版本的 GitHub 页面;工作流细节已与 NVIDIA 教程及仓库主分支可访问的技能 README 交叉核对。
- [Apache Spark 的 cuDF 插件概览](https://docs.nvidia.com/cudf-spark/latest/getting-started/overview.html):当前设置和兼容性信息,并明确说明不受支持的操作会由 Spark CPU 执行。实施前请检查对应发行版的兼容性列表。
## Sources
- [NVIDIA 技术博客:《借助 AI 智能体重写 Apache Spark UDF 以实现 GPU 加速》](https://developer.nvidia.com/blog/rewrite-apache-spark-udfs-gpu-acceleration-ai-agents/) — 主要教程及供应商报告的工作负载案例。
- [NVIDIA cuDF Spark 技能,固定版本](https://github.com/NVIDIA/cudf-spark/tree/cb8150b7ee4b07863bb6b267f28885def24b177e/skills) — 指定的固定版本;因 Web 缓存未命中,检索失败。细节已与教程和可访问的主 README 交叉核对。
- [NVIDIA cuDF Spark 技能,主 README](https://github.com/NVIDIA/cudf-spark/tree/main/skills) — 介绍技能名称和先决条件的当前可变 README。
- [Apache Spark 的 cuDF 插件概览](https://docs.nvidia.com/cudf-spark/latest/getting-started/overview.html) — 当前的回退和兼容性文档;请对照部署版本检查。
BIG CHANGE 新闻通讯
纵览全局,按自己的节奏。
关于人工智能和机器人技术的近期报道、值得关注的变化以及可采用的实用想法。选择每日简报、每周摘要或每月视角。
Next scheduled send (UTC): . Your first edition arrives at the next scheduled send after you confirm.