我正在使用 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 内存管理的见解将不胜感激。