如何使用Dask.array高效地向集群发送大型numpy阵列
我在本地机器上有一个大的NumPy数组,我想在集群上与Dask.array并行如何使用Dask.array高效地向集群发送大型numpy阵列,numpy,dask,Numpy,Dask,我在本地机器上有一个大的NumPy数组,我想在集群上与Dask.array并行 import numpy as np x = np.random.random((1000, 1000, 1000)) 然而,当我使用dask.array时,我发现我的调度程序开始占用大量RAM。为什么会这样?这些数据不应该给工人们吗 import dask.array as da x = da.from_array(x, chunks=(100, 100, 100)) from dask.distributed
import numpy as np
x = np.random.random((1000, 1000, 1000))
然而,当我使用dask.array时,我发现我的调度程序开始占用大量RAM。为什么会这样?这些数据不应该给工人们吗
import dask.array as da
x = da.from_array(x, chunks=(100, 100, 100))
from dask.distributed import Client
client = Client(...)
x = x.persist()
无论何时
持久化
或计算
一个Dask集合,该集合的数据都会发送到调度程序,并从调度程序发送到工作进程。如果要绕过在调度程序上存储数据,则必须学习如何使用
您有三种选择:
future = client.scatter(x)
x = da.from_delayed(future, shape=x.shape, dtype=x.dtype)
x = x.rechunk((100, 100, 100))
x = x.persist()
这会将您的数据直接移动到工作区,然后从那里进行块处理。这很好,因为它绕过了调度程序。但是,如果您的工作人员开始失败,您现在就有数据丢失的风险。只有当你处在一个大规模并行系统中时,这才重要
这也有点低效,因为您的所有数据都集中在一个工作者身上,而不是分散。您可以调用client.rebalance
或继续阅读
然后散开
您可以使用本地调度程序在本地对数据进行分块,然后分散到集群
x = da.from_array(x, chunks=(100, 100, 100))
x = x.persist(get=dask.threaded.get) # chunk locally
futures = client.scatter(dict(x.dask)) # scatter chunks
x.dask = x # re-attach scattered futures as task graph
留在当地
或者,您可以继续在本地使用dask,或者与线程调度程序一起使用,或者与仅使用本地进程的分布式调度程序一起使用
client = Client(processes=False)
这将停止本地进程、调度程序和工作进程之间不必要的数据复制。它们现在都在同一个本地进程中
client = Client(processes=False)
另请参见:以获取此答案的基于任务的版本
client = Client(processes=False)