批量 Python UDF ABI(Row-wise Python UDF 批量跨语言调用)。
逐行 Python UDF 的传统路径会为每一行执行一次 Rust → Python 调用,并重复完成参数列表创建、Python 对象转换、函数绑定、指标上下文进入退出和返回值转换。对于单行计算量较小的 UDF,跨语言边界和 Python 调度成本可能高于 UDF 本身。
该优化尝试将一个 Daft Series 中的多行参数一次性传给 Python,在一次 ABI 调用中循环执行用户函数,再一次性构造返回 Series。理论上可减少:
Series
分支:codex/ai-de-batch-python-udf-abi
codex/ai-de-batch-python-udf-abi
实现提交:
3d89835b8
codex_optimize_rowwise_udf_conversion
主要实现:
daft/udf/execution.py
call_func_many_as_series
PySeries
src/daft-dsl/src/python_udf/row_wise.rs
call_serial_batch_as_series
on_error=Raise
max_retries=0
该分支只包含批量 ABI 优化;测试时没有叠加其他实验代码。
pipeline_pdf_full_min
pipeline_text_fineweb_full_min
pipeline_text_vectorize_full_min
pipeline_image_full_min
pipeline_video_full_min
结论:新 base 上只有 FineWeb 提升 0.28%,其余 4 条均回退,五条汇总回退 1.62%。减少 ABI 调用的收益不足以覆盖批量参数列表和 Python 对象的集中构造成本,不建议合入当前实现。
1. 批量 Python UDF ABI
1.1 优化点名称
批量 Python UDF ABI(Row-wise Python UDF 批量跨语言调用)。
1.2 背景与收益原理
逐行 Python UDF 的传统路径会为每一行执行一次 Rust → Python 调用,并重复完成参数列表创建、Python 对象转换、函数绑定、指标上下文进入退出和返回值转换。对于单行计算量较小的 UDF,跨语言边界和 Python 调度成本可能高于 UDF 本身。
该优化尝试将一个 Daft
Series中的多行参数一次性传给 Python,在一次 ABI 调用中循环执行用户函数,再一次性构造返回Series。理论上可减少:1.3 实现方式、分支与提交
分支:
codex/ai-de-batch-python-udf-abi实现提交:
3d89835b8:codex_optimize_rowwise_udf_conversion主要实现:
daft/udf/execution.py增加call_func_many_as_series,一次接收多行已经求值的参数,在单个 metrics context 中调用绑定后的 Python 方法,并统一构造PySeries。src/daft-dsl/src/python_udf/row_wise.rs增加call_serial_batch_as_series,预先收集每行参数后只调用一次 Python helper。on_error=Raise且max_retries=0时进入快速路径,避免改变逐行错误处理和重试语义。该分支只包含批量 ABI 优化;测试时没有叠加其他实验代码。
1.4 测试结果
pipeline_pdf_full_minpipeline_text_fineweb_full_minpipeline_text_vectorize_full_minpipeline_image_full_minpipeline_video_full_min结论:新 base 上只有 FineWeb 提升 0.28%,其余 4 条均回退,五条汇总回退 1.62%。减少 ABI 调用的收益不足以覆盖批量参数列表和 Python 对象的集中构造成本,不建议合入当前实现。