【发布时间】:2020-09-22 22:44:52
【问题描述】:
我正在尝试使用 NERSC 上的 dask-mpi 客户端将一些相对较大(~15GB)的 VTK 文件加载到 dask 数据帧中。但是,由于大部分工作在 NERSC 节点上以并行方式进行,因此我很难有效地实现这一点。
这里的基本结构遵循 Rollin Thomas 关于在 NERSC 上使用 dask 的笔记本 (https://gitlab.com/NERSC/nersc-notebooks/-/tree/master/dask)。所以我:
- 在 NERSC 上启动 Jupyter 笔记本
- 访问交互式队列上的节点,定义调度程序文件
- 启动客户端访问相同的调度程序文件。此时我可以启动客户端仪表板并观察流程
- 在 Jupyter 节点上读取 VTK 文件,并将其放入 pandas 数据帧 - 这工作正常,在 Jupyter 内核上需要约 15GB 内存
从这里,我想将 pandas 数据框中的信息加载到服务器上的 dask 客户端,但我还没有找到一个干净的方法来这样做。我尝试了几件事:
-
使用 from_pandas() 将 pandas 数据帧转换为 dask 数据帧。在这种情况下,Jupyter 内核上似乎使用了很多内存,实际上导致 Jupyter 内核上的内存不足错误。
-
不要在 Jupyter 内核上读取 vtk 文件,而是创建 vtk 读取函数 @dask.delayed,从该函数返回单个数据帧。当我这样做时,该过程在 NERSC 节点上正确发生,但重新分区数据帧仅使用 1 个核心,因此需要很长时间。
-
如上,使 vtk-reading 函数 @dask.delayed,但返回一个包含大量小熊猫数据帧的列表。在这种情况下,构建较小数据帧集的过程似乎发生在 Jupyter 内核而不是 NERSC 节点上,因此大大减慢了处理速度。
-
在 Jupyter 内核上加载 vtk 文件。然后创建一个列表索引来分解数据帧,以及一个从该索引范围返回数据帧的函数。在 from_delayed() 中运行它。但是,这似乎又在 Jupyter 内核而不是 NERSC 节点中完成了大部分工作,因此遇到了内存问题。如下图:
vtkDF = loadVTKs() chunks = [[i1,j1],[i2,j2], . . .] for c in chunks: vtkDF_parts.append(foo(vtkDF,c)) #foo simply returns vtkDF from i_c->j_c vtkDDF = dd.from_delayed(vtkDF_parts) vtkDDF.persist()
我将不胜感激任何人都可以提供任何帮助,以最佳方式将这些数据正确传输到 NERSC 节点上的内存中——我一直在与 NERSC 的人们合作,但我们一直无法弄清楚。请让我知道其中哪些部分不清楚,我会澄清一下——我觉得我只是在这上面保持头脑清醒,所以我确定我并没有完全清楚。
谢谢, 詹姆斯
【问题讨论】:
标签: dask