首页 > 解决方案 > 为每个操作选择正确的块大小

问题描述

我一直在研究一个需要生成大于内存的张量的程序,并且它与Dask. 我遇到的唯一问题是操作需要很长时间,我想知道是否有办法加快我的程序。

特别是,最苛刻的操作是计算张量与其自身的张量外积,如下所示:

import dask.array as da
tensor = da.random.random(10, 20)
outer = da.multiply.outer(tensor, tensor)

由于我生成的数组大于内存(比示例中的大得多),我使用以下方法存储它们zarr

import zarr
storage = zarr.DirectoryStore('a_path')
da.to_zarr(outer, url=storage, compute=True, component='comp')

虽然如果生成的块大于4GB,我会在调用之前再次重新分块数组to_zarr,否则我会收到错误:ValueError: Codec does not support buffers of > 2147483647 bytes.

我正在使用大约 600 GB RAM 的机器,我生成的外部产品的大小约为 700 GB(但我想尽可能大)。

我尝试过一些本地实验,以不同的方式(使用rechunk)对数组进行分块并在本地比较速度,但我没有看到太大的差异。

此外,特别是对于张量外积,似乎所需的操作数量随着块的数量呈指数增长(我在 a 中对此进行了评估Jupyter notebook),如果张量被过度分块,则计算失败(或者我得到一个性能警告)。另外,在计算出我的张量外积后,我需要对它们求和。

那么,有没有办法根据要计算的操作找出对张量进行分块的最佳方法是什么?

标签: arraysdask

解决方案


推荐阅读