在dask分布式

时间:2019-02-12 21:44:05

标签: python dask python-xarray dask-distributed

我正在使用HPC系统(NCAR's Cheyenne),并且想对大型NetCDF数据集(NCAR大型集成体)做一些事情。尽管阅读了Pangeo和dask / dask分发的文档,但我仍然遇到内存错误问题。

我要采取的步骤是:

  1. 使用xarray.open_mfdataset()将大型(全球约1800年的每日数据)多文件数据集加载到达人
  2. 在所有网格点的整个时间范围内获取30天的滚动总和,最好使用dask-distributed,因为它的数据量约为TB。
  3. 计算这30天总和的返回时间间隔(即运行numpy.nanpercentile()或使用指定的百分位数的dask DataFrame.quantile()函数)
  4. 将结果另存为2D(经纬度)NetCDF文件

对于我来说,能够一次加载任何网格点的全部时间序列非常重要,因为滚动总和和返回间隔的计算取决于整个时间段。

这是我一直尝试使用的代码段(直到上面的步骤2)。我正在jupyter笔记本中运行它,并且已将$TMPDIR指定为我的个人暂存目录(在此系统上为/glade/scratch/$USER/temp/):

import xarray
import dask_jobqueue
import dask.distributed
import glob

## specify location of precipitation files, use glob to get list of them
PRECT_root = '/glade/collections/cdg/data/cesmLE/CESM-CAM5-BGC-LE/atm/proc/tseries/daily/PRECT/'
filename_list = sorted(glob.glob(PRECT_root + 'b.e11.B1850C5CN.f09_g16.005.cam.h1.PRECT.*.nc'))

## import multi-file data set
mfds = xarray.open_mfdataset(filename_list, chunks={'lat':12, 'lon':12})
mfds_data = mfds['PRECT']

## start cluster object
cluster = dask_jobqueue.PBSCluster(cores=36, memory='100 GB', project='UCLA0022', queue='regular', walltime='06:00:00', local_directory='/glade/scratch/$USER/temp/')

## create 30 workers (I've tried up to 70)
cluster.start_workers(30)

## attach client
client = dask.distributed.Client(cluster)

## create a rolling 30-day sum
mfds_data_30day_rolling_object = mfds_data.rolling(time=30, center=True)
mfds_data_30day_rolling_sum = client.persist(mfds_data_30day_rolling_object.sum())

即使我加载单个文件(而不是完整的数据集),上面的最后一行代码也似乎通过dask仪表板完成,但最终该工作被系统杀死了。 HPC管理员多次发送电子邮件,说我在登录节点上使用了太多内存,但是我已经仔细指定了$TMPDIRlocal_directory,但我不知道该如何解决这个。

对此我有几个问题:

  1. 是否有比我正在采取的步骤更好的计算方法? (看起来,建立一个懒惰的滚动窗口对象,然后调用 / persist 是一个好方法。我也尝试使用scatter()和Futures,但是内存问题坚持。)
  2. 当我查看暂存目录(du -hs /glade/scratch/$USER/temp)的磁盘使用情况时,看来工作人员在sum()persist()期间并没有占用任何内存。在这种情况下, 到底在哪里使用?我有一种感觉,如果我能学到这一点,就可以解决我的问题。
    • 更多信息: client.scheduler_info()确认已经正确设置了我的临时目录,并在其中创建了worker-****文件,但文件夹大小固定为32 KB也许我的想法与local_directory函数中PBSCluster()的设置有关?

1 个答案:

答案 0 :(得分:0)

这里有几个问题。我会尝试为您指明一些好的途径,以供将来阅读:

  • 您的节点可能没有本地存储。您的tmp目录是RAM或网络文件系统。写入任何一个都会导致问题。代替。您希望Dask工作人员暂停执行或在内存不足时杀死自己。这将使您的IT人员更加快乐。有关此的更多信息,请访问:http://docs.dask.org/en/latest/setup/hpc.html#no-local-storage

  • 要了解正在占用的内存,可以查看仪表板。这在进度条(纯色而不是透明色)以及各个工作人员的信息页中都很明显。此页面上有一个youtube视频。 http://docs.dask.org/en/latest/diagnostics-distributed.html

  • 您可能还希望查看mfds_data_30day_rolling_object.sum()对象的总字节数,以确保将其持久保存在内存中是合理的。 Xarray文档可能可以在这里提供帮助。