python - Dask 和 cudf 循环出现内存不足错误
问题描述
我正在使用 Dask 和 Rapidsai 在大型(6.9GB)数据集上运行 xgboost 模型。硬件是 4 个 2080 TI,每个 11 GB 内存。原始数据集有几十个目标列已经过一次热编码,所以我试图运行一个循环,一次保留一个目标列,丢弃其余列,运行模型,然后重复。
这里有一些伪代码来展示这个过程:
with LocalCUDACluster(n_workers=4) as cluster:
with Client(cluster) as client:
raw_data = dask_cudf.read_csv(MyFile)
d_train, d_test = 'function to drop all target columns but one, then create
DaskDMatrix objects for training and testing'
model = 'Custom gridsearch function that loops through xgb.dask.train function and
returns a dict of optimal params'
好的,所以如果我在任何单独的目标列上运行它,它工作正常 - 推动可用内存,但不会中断。如果我在集群/客户端分配后尝试使用循环来执行此操作:
targets = ['target1', 'target2', ...]
with LocalCUDACluster(n_workers=4) as cluster:
with Client(cluster) as client:
for target in targets:
same code as above
它在循环的第三次运行时中断,内存不足。相反,如果我在循环中分配集群/客户端:
targets = ['target1', 'target2', ...]
for target in targets:
with LocalCUDACluster(n_workers=4) as cluster:
with Client(cluster) as client:
same code as above
它工作正常。
所以,我猜我在循环运行中创建的一些对象显然是持久的,对吧?因此,我尝试在每个循环结束时将 d_train 和 d_test 设置为空列表以清除内存,但这不起作用。我是否在循环之前或循环内读取原始数据或任何其他更改也无关紧要。
唯一可行的方法是在每个循环结束时重新初始化集群和客户端。
这是为什么?是否有更有效的方法在 dask 分区上循环处理内存?无论如何,我已经读过 dask 在循环中的效率非常低,所以也许我什至不应该以这种方式做事。
任何对 dask 或 rapids 内存管理的见解将不胜感激。
解决方案
作为第一步,您可以选择要将哪些数据列读入 dask_cudf。当您迭代并创建时,这可能会帮助您解决记忆问题
targets = ['target1', 'target2', ...]
with LocalCUDACluster(n_workers=4) as cluster:
with Client(cluster) as client:
for target in targets:
dask_cudf.read_csv(MyFile, usecols=target)
... ## keep going with your ETL
这是供参考的文档,如果您愿意的话。cudf 和 dask_cudf 之间的 API 与 dask 类似 https://docs.rapids.ai/api/cudf/stable/api.html#cudf.io.csv.read_csv
专业提示:如果列数据足够小,您可能可以使用 1 个 GPU 并只使用 cuDF,因为调度程序的开销更少,所以性能会更高。
您可以做的另一件事是腌制每个 xgboost 模型,将其保存到磁盘,然后删除/覆盖 xgboost 模型,因为这些模型会占用您的 GPU 空间。然后,当您完成 ETL 的这一部分时,您可以将其读回。
如果您对超参数优化 (HPO) 感兴趣,您应该查看我们的 HPO 笔记本和实用程序,例如https://github.com/rapidsai/cloud-ml-examples/blob/main/dask/kubernetes/Dask_cuML_Exploration。 ipynb
此外,您可能不需要所有with
陈述,但我不知道您在此片段之外做什么,因此为了方便回答,我将它们留在:) 中。
推荐阅读
- amazon-web-services - 寻找 AWS CLI 命令以包括公共 IP、私有 IP、VPC、实例状态、名称和类型
- python - 如何将字符串的每个字符转换为 Python 中列表元素的单个元素?
- jquery - 使用 Jquery 循环和比较 ViewData 数据与 DropDownListFor
- utf-8 - USS 中 z/OS 文件的代码页和字符集转换
- sql-server - 将两个维度合二为一
- pyspark - 如何将条件计数(带重置)应用于 PySpark 中的分组数据?
- javascript - 如何使用 JavaScript 使用按钮在 html 中的元素之间循环
- salesforce - 在内容槽 Salesforce B2C Commerce Cloud 中添加自定义 css
- xslt - XSL 1.0 如果不喜欢
- variable-assignment - 将目标帧分配给 h2o.ai 中的预测