在xarray的apply_ufunc中,dask = parallelized和dask = allowed有什么区别?

时间:2018-08-07 22:16:01

标签: python numpy dask python-xarray numpy-ufunc

在函数apply_ufunc的xarray documentation中,它表示:

dask: ‘forbidden’, ‘allowed’ or ‘parallelized’, optional

    How to handle applying to objects containing lazy data in the form of dask arrays:

    ‘forbidden’ (default): raise an error if a dask array is encountered.
    ‘allowed’: pass dask arrays directly on to func.
    ‘parallelized’: automatically parallelize func if any of the inputs are a dask array. 
                    If used, the output_dtypes argument must also be provided. 
                    Multiple output arguments are not yet supported.

,在Parallel Computing上的文档页面中,有一条注释:

  

对于大多数已经由dask包装的NumPy函数,使用预先存在的dask.array函数通常是一个更好的主意,方法是使用预先存在的xarray方法或带有dask ='allowed的apply_ufunc() '。与dask ='parallelized'提供的通用加速功能不同,Dask通常可以利用问题的特殊结构进行更有效的实现。

但是,我仍然不清楚这两个选项之间的区别。 allowed仍在逐块操作以降低内存使用率吗?如果应用的ufunc仅使用dask操作,allowed仍会并行化吗?为什么parallelizedoutput_dtypes要求您提供更多关于ufunc输出的信息(即参数output_sizesallowed)?

1 个答案:

答案 0 :(得分:1)

dask='allowed'意味着您正在应用已经知道如何处理dask数组的函数,例如,根据dask.array操作编写的函数。在大多数情况下,这确实意味着该函数将逐块操作以降低内存使用率,并将并行应用计算。

dask='parallelized'需要用户更多信息,因为它使用atop之类的低级dask.array函数来创建自己的包装程序,该包装程序允许提供的函数作用于dask数组上。使用dask='parallelized',您可以提供一个仅知道如何处理NumPy数组的函数,而xarray.apply_ufunc也会将其扩展为处理dask数组。