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

![Conceptual charcoal illustration of a generic rackmount server with a tray pulled partly forward, showing four finned modules inside.](https://bigchange.ai/api/media/file/spark-gpu-server-hero-v1.png)
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) — 当前的回退和兼容性文档；请对照部署版本检查。
