内存问题计算dask-distributed中NetCDF数据集的滚动总和

问题描述 投票:1回答:1

我正在研究HPC系统(NCAR's Cheyenne),并希望对大型NetCDF数据集(NCAR Large Ensemble)做一些事情。尽管阅读了Pangeo和dask / dask分发的文档,但我遇到了内存错误问题。

我想采取的步骤是:

  1. 使用xarray.open_mfdataset()加载大量(全球,〜1800年的每日数据),多文件数据集到dask
  2. 在所有网格点的整个时间维度上获取30天的滚动总和,理想情况下使用dask-distributed,因为它是TB数据的顺序
  3. 计算这30天总和的返回间隔(即运行numpy.nanpercentile()或具有指定百分位值的dask DataFrame.quantile()函数)
  4. 将结果保存为2D(lat x lon)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. 这些计算有没有比我采取的步骤更好的方法? (看起来像构建一个懒惰的滚动窗口对象,然后调用sum / persist,这将是一个很好的方法。我也尝试过使用scatter()和future,但内存问题仍然存在。)
  2. 当我查看我的临时目录(du -hs /glade/scratch/$USER/temp)的磁盘使用情况时,似乎工作人员在sum()persist()期间没有占用任何内存。在这种情况下,使用的内存究竟在哪里?我有一种感觉,如果我能学到这一点,我可以解决我的问题。 更多信息:client.scheduler_info()确认我的scratch目录已经适当设置,并且在其中创建了worker-****文件,但文件夹大小仍然固定为32 KB。也许我的想法是关于local_directoryPBSCluster()函数中的设置是什么?
python dask python-xarray dask-distributed
1个回答
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文档可能对此有所帮助。
© www.soinside.com 2019 - 2024. All rights reserved.