新闻详情

新闻详情

首页 / 资讯中心 / 详情

使用 Polars GPUEngine 精细控制 GPU 查询执行

发布时间:2026/9/9 13:23:16来源:尧图网络
使用 Polars GPUEngine 精细控制 GPU 查询执行
使用 Polars GPUEngine 精细控制 GPU 查询执行【免费下载链接】polarsExtremely fast Query Engine for DataFrames, written in Rust项目地址: https://gitcode.com/GitHub_Trending/po/polarsPolars 的 GPU 引擎GPU engine允许把LazyFrame查询交给 NVIDIA CUDA GPU 执行而GPUEngine正是用于对 GPU 执行过程做细粒度控制的对象你可以选择在哪个 GPU 设备上运行、注入自定义的 GPU 显存资源管理器以及决定查询不受支持时的回退策略。本文将以 gpu_engine.rst 所描述的 API 参考为骨架结合 py-polars 中Engine抽象、引擎解析逻辑与collect文档说明如何正确地使用GPUEngine、它背后的选择与回退机制以及源码层面各参数的实际作用。GPUEngine 是什么为 collect 提供引擎级细粒度控制在 py-polars 中惰性查询由LazyFrame.collect()以及同族的execute、collect_async、sink_*等入口触发执行。从源码看执行入口接受的engine参数类型定义在 py-polars/src/polars/_typing.pyEngineTypeName: TypeAlias Literal[auto, in-memory, streaming, gpu] EngineType: TypeAlias Union[EngineTypeName, Engine]也就是说除了传入gpu、auto、in-memory、streaming这类字符串名字外还可以直接传入一个Engine对象。GPUEngine就是这一体系下负责 GPU 后端配置的具体类官方参考文档 gpu_engine.rst 对其定位说明如下This object provides fine-grained control over the behavior of the GPU engine when callingLazyFrame.collect()with anengineargument.即当你在collect(engine...)中指定 GPU 引擎时用GPUEngine实例来微调其行为。该类定义于 engine.py并经由 engine_config.py 以polars.lazyframe.engine_config.GPUEngine路径兼容再导出同时以pl.GPUEngine暴露于顶层命名空间见 py-polars/src/polars/init.py 与 py-polars/src/polars/lazyframe/init.py。快速上手两种调用 GPU 引擎的方式最简单的做法是直接按引擎名字执行import polars as pl lf pl.LazyFrame({a: range(1_000_000), b: range(1_000_000, 2_000_000)}) # 直接指定 gpu等价于使用默认参数的 GPUEngine df lf.select((pl.col(a) pl.col(b)).alias(sum)).collect(enginegpu) print(df)但如果你需要控制执行细节——例如在多 GPU 机器上选定设备、指定显存分配资源、或要求无法在 GPU 上执行就报错而不是静默回退——就需要构造GPUEngine实例再传给collectimport polars as pl # 在 1 号 GPU 上执行且不支持的查询直接抛错而不是回退 CPU df lf.group_by(a).agg(pl.col(b).sum()).collect( enginepl.GPUEngine(device1, raise_on_failTrue) )在 frame.py 的 API 文档示例中同样可见enginepl.GPUEngine(device1)的用法这是多 GPU 场景下最典型的需求用对象传参完成设备选择。GPUEngine 参数详解GPUEngine的完整参数以关键字形式定义于构造函数engine.py并通过类型注解与实例属性暴露engine.py参数类型默认值含义deviceint \| NoneNone选择用于执行查询的 GPU。不传时使用当前 CUDA 设备current CUDA device。memory_resourcermm.mr.DeviceMemoryResource \| NoneNone为 GPU 显存分配提供一个内存资源来自 RAPIDS RMM 库。用于接管显存分配策略。raise_on_failboolFalse若为True当 GPU 引擎无法执行该查询时不再回退到 Polars CPU 引擎而是抛出错误。monitoringboolFalse查询监控开关GPU 引擎不支持该功能传True会抛出NotImplementedError。**kwargsAny—其余配置项统一归入config映射并透传给底层 cuDF Polars 执行器。device多 GPU 环境下的设备选择在 GPU 集群或单机多卡的机器上不同的查询可能希望落在不同的设备上。device参数接受 CUDA 设备序号整数。源码注释明确不传时查询使用当前 CUDA 设备传入则固定到指定设备。对于显存紧张、或希望多个 Polars 进程各自绑定一块卡的场景这是必备的隔离手段。需要注意device的选择与memory_resource的绑定关系是一个易错点类文档字符串给出了明确的warningIf passing amemory_resource, you must ensure that it is valid for the selecteddevice.即若你同时传入了memory_resource必须保证该内存资源对所选device同样有效RMM 文档中 multi-device 相关章节对此有专门说明。原因是显存资源管理器通常是按设备创建并绑定的跨设备复用可能导致分配错误。memory_resource接管 GPU 显存分配memory_resource的类型来自rmm.mr.DeviceMemoryResourcermm是 RAPIDS 的内存管理库py-polars 侧仅在类型标注阶段引用见 engine.py 的TYPE_CHECKING导入。传入后GPU 引擎执行期间的显存分配会走你提供的资源管理器常用于使用池化内存资源pooling降低反复 cudaMalloc 的开销与上层框架如 cuDF、cuGraph 等共享同一块显存池实现整机显存统一规划。一个典型的构造示意需已安装rmmimport rmm import polars as pl mr rmm.mr.CudaMemoryResource() # 也可以换用 PoolMemoryResource 等 lf.collect(enginepl.GPUEngine(memory_resourcemr))raise_on_fail决定查询不支持时的行为GPU 引擎并非能执行所有 Polars 查询见下文限制与回退。当某个查询无法在 GPU 上执行时raise_on_failFalse默认透明回退到 Polars CPUin-memory引擎查询结果与平时无异用户无感知raise_on_failTrue直接抛出错误绝不静默降级。源码实现中raise_on_fail被写回config字典以兼容底层 cuDF Polars 的执行协议engine.py# Avoids need for changes in cudf-polars kwargs[raise_on_fail] raise_on_fail self.config kwargs额外关键字参数**kwargs / config除上述具名参数外的其余关键字参数都会进入self.configMapping[str, Any]最终随引擎对象一起传给底层的cudf_polars.execute_with_cudf执行函数engine.py。这些扩展配置项可用于对接 cuDF Polars 暴露的其他执行开关。GPU 引擎的选择与解析机制当你写下enginegpu或enginepl.GPUEngine(...)时发生了什么答案在 engine_config.py支持的引擎名字统一定义为SUPPORTED_ENGINE_NAMES (auto, in-memory, streaming, gpu)engine_config.py名字到引擎对象的映射_ENGINE_BY_NAME中保留了cpu作为in-memory的历史别名engine_config.py_engine_from_name遇到gpu时返回新建的GPUEngine()实例engine_config.py_select_engine负责名字 → 引擎对象的最终解析传入对象则直接使用传入auto时先检查是否有进程内配置的引擎对象覆盖set_engine_affinity_override否则读取POLARS_ENGINE_AFFINITY环境变量对应的 affinity随后按名字解析engine_config.py。这一层设计意味着GPUEngine并非直接参与执行而是通过其name属性返回gpuengine.py与_post_opt_callback回调来驱动执行。_post_opt_callback会按需import cudf_polars构造partial(cudf_polars.execute_with_cudf, configself)作为执行回调engine.py。字符串 gpu 与 GPUEngine 对象的区别collect的engine参数文档frame.py对两者的分工说得很清楚gpu: use the CUDA GPU engine (requires an Nvidia GPU andcudf-polars). Pass aGPUEngineobject for fine-grained control (e.g. device selection on multi-GPU systems).即字符串gpu等价于一套默认参数适合只要 GPU 执行、无需任何定制的场景一旦涉及设备选择、显存资源、报错策略等细节就必须升级为GPUEngine对象传参。限制、回退与调试GPU 模式属于不稳定unstable功能collect文档明确标注frame.pyGPU mode is consideredunstable. Not all queries will run successfully on the GPU, however, they should fall back transparently to the default engine if execution is not supported. Running withPOLARS_VERBOSE1will provide information if a query falls back (and why).因此在使用前应先确认适用前提NVIDIA GPU、匹配 CUDA 版本的cudf-polars发行版。仓库内详细的安装与支持说明见 docs/source/user-guide/gpu-support.md。若缺少cudf_polars包_post_opt_callback会抛出带安装指引的ImportError提示按 CUDA 版本安装对应 cuDF Polars 发行版engine.py。两类不支持时会悄然禁用 GPU的场景源码_post_opt_callbackengine.py还处理两个特殊入口background 后台收集GPU 引擎不支持后台模式collect(backgroundTrue)时会发出UserWarningGPU engine does not support background collection, disabling GPU engine.并退回 CPU 执行eager 急迫执行内部以 eager 模式运行时optimizations标记为 eager会静默跳过 GPU 引擎不警告避免在不应上 GPU 的内部路径里触发 GPU。此外GPU 引擎也不支持查询监控把monitoringTrue传入构造会立即抛出NotImplementedError(query monitoring is not supported by the GPU engine)engine.py。调试回退POLARS_VERBOSE由于默认raise_on_failFalse的回退是透明的用户可能误以为查询确实跑在了 GPU 上。判断是否发生回退最直接的途径就是开启 verbosePOLARS_VERBOSE1 python your_script.py此时日志会输出引擎选择与回退原因fallback 原因。也可以临时用raise_on_failTrue做一次体检把不支持的算子逐一暴露出来。设置全局默认 GPU 引擎Config.set_engine_affinity如果希望进程内所有collect()都默认走 GPU不必每次都传engine可用Config.set_engine_affinityconfig.py设置默认引擎。它接受字符串名字也接受引擎对象import polars as pl # 方式一字符串名字写入 POLARS_ENGINE_AFFINITY 环境变量 pl.Config.set_engine_affinity(gpu) # 方式二引擎对象默认在 1 号 GPU 执行、不支持即报错 pl.Config.set_engine_affinity(pl.GPUEngine(device1, raise_on_failTrue))两种形式在底层处理不同config.py字符串名字会写入POLARS_ENGINE_AFFINITY环境变量并重载相关配置引擎对象则存入进程内的_ENGINE_AFFINITY_OVERRIDE见 engine_config.py是Python-only、进程级的状态Config.save()不会持久化对象 affinity加载旧状态时以环境变量中的名字为准。设定默认 affinity 后调用不带engine的collect()即自动使用该引擎前提是查询可被该引擎执行否则仍按回退策略处理。这一机制同样适用于streaming、in-memory等其他引擎。从源码看 GPUEngine 的整体执行链路把上文各环节串起来一次 GPU 查询的完整链路是用户在LazyFrame.collect()传入enginegpu或GPUEngine对象engine_config.py 的_select_engine解析出具体的Engine实例对象直接复用gpu名字则 new 一个默认GPUEngine()GPUEngine._post_opt_callback检查background/eager状态、按需import cudf_polars返回绑定configself的执行回调_LocalEngine.collectengine.py以引擎名字gpu调用底层PyLazyFrame把回调作为post_opt_callback传入实际执行由 cuDF Polars 完成若某算子不被 cuDF Polars 支持按raise_on_fail决定是回退 CPU 引擎还是抛错。值得注意的是从Engine抽象基类engine.py看这一执行引擎可插拔的架构还服务于其他后端in-memory、streaming 等GPUEngine只是其中挂载在gpu名下的具体配置实现。总结与使用建议围绕 gpu_engine.rst 描述的GPUEngine对象可以提炼出几条实用结论默认先跑通用collect(enginegpu)起步确认环境NVIDIA GPU CUDA 版本匹配的cudf-polars与查询可执行性开启POLARS_VERBOSE1观察是否存在静默回退需要设备级控制时引入 GPUEngine多卡环境用device固定设备需要共享/池化显存时传memory_resource并牢记它必须对所选device有效严谨的基准测试或 CI 场景用raise_on_failTrue避免以为是 GPU 跑、实际回退 CPU造成的误判全局默认用Config.set_engine_affinity(gpu)或对象形式设置注意对象 affinity 仅进程内有效GPU 模式属 unstable API后台收集与查询监控目前不被支持升级 Polars 或 cuDF 时注意行为可能调整。对底层实现与更多执行引擎细节感兴趣的读者可以继续阅读 engine.pyEngine抽象与各引擎类、engine_config.py引擎名解析与 affinity以及 frame.py 中collect的完整参数文档。【免费下载链接】polarsExtremely fast Query Engine for DataFrames, written in Rust项目地址: https://gitcode.com/GitHub_Trending/po/polars创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Uncorrectable ECC错误详解:原理、排查与MBIST验证 2026/9/9 14:11:28

Uncorrectable ECC错误详解:原理、排查与MBIST验证

如果你在服务器、工作站或某台存储设备上,看到诊断工具里赫然显示uncorrectable ECC error count: 2,第一反应是什么?我之前帮朋友排查一台存储服务器的时候,就碰到过这种显示——面板上数字不大不小,正好是 2&#xf…

阅读更多 →
如何把 Protractor 测试用例迁移到 Puppeteer 2026/9/9 14:11:28

如何把 Protractor 测试用例迁移到 Puppeteer

如何把 Protractor 测试用例迁移到 Puppeteer 【免费下载链接】puppeteer JavaScript API for Chrome and Firefox 项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer 如果你的 Angular 项目还依赖 Protractor 跑 e2e 测试,这篇文章给出一…

阅读更多 →
串口调试助手使用指南:从波特率原理到故障排查实战 2026/9/9 14:11:28

串口调试助手使用指南:从波特率原理到故障排查实战

简介:串口调试助手2.2是由龚建伟老师开发的串口通信调试工具,面向嵌入式、单片机、工控等领域,是开发者和硬件工程师进行设备联调、协议验证的高效辅助工具。资源包为rar格式,体积仅116KB,包含3个文件:可执…

阅读更多 →
Canvas绘制大数据表格:十万行秒开渲染的实践方案 2026/9/9 14:11:28

Canvas绘制大数据表格:十万行秒开渲染的实践方案

做后台系统的人,迟早都会撞上“大数据量表格”这堵墙。最开始我用Element Plus的el-table,几万行数据一铺,页面直接卡成幻灯片,滚动一下浏览器都要问你要不要停止响应。后来换DOM级虚拟滚动,能撑住,但数据量…

阅读更多 →
SLAM工业级ICP配准引擎:手写可微实时鲁棒实现 2026/9/9 14:11:28

SLAM工业级ICP配准引擎:手写可微实时鲁棒实现

1. 这不是“抄个代码就能跑”的ICP,而是SLAM系统里真正扛得住实测的配准内核 你搜“SLAM中的ICP算法代码完整实现”,大概率会撞上三类内容:一是教科书式伪代码,变量命名像数学公式(p_i, q_j, R, t)&#xf…

阅读更多 →
新英格兰10机39节点系统接入风机模块的Simulink建模与仿真研究 2026/9/9 14:08:27

新英格兰10机39节点系统接入风机模块的Simulink建模与仿真研究

新英格兰10机39节点系统在电力系统研究领域的分量,搞过暂态稳定、频率响应、机电暂态仿真的朋友应该都不陌生。这套由麻省理工学院和通用电气在新英格兰地区电网基础上简化的标准测试系统,几乎是每个做电力系统研究的硕士博士绕不开的“实验台”。但原版…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞