gpt4 book ai didi

python - 使用 dask 进行 3D 体处理

转载 作者:行者123 更新时间:2023-11-30 22:40:07 25 4
gpt4 key购买 nike

我现在正在使用 dask 通过一些简单的模板探索 3D 交互式体积卷积。让我解释一下我的意思:

  • 假设您有一个 3D 数据,希望通过 Sobel 变换进行处理(例如获取 L1 或 L2 梯度)。
  • 然后将输入 3D 图像划分为子卷(具有一些重叠边界 - 对于 3x3x3 模板 Sobel,它将需要 +2 个样本重叠/填充)
  • 现在假设您在整个 3D 体积上创建 Sobel 3D 变换的延迟计算 - 但尚未执行。

现在是最重要的部分:

  • 我想编写一个函数,从虚拟转换的数据中提取一些特定的 2D 部分。
  • 最后让所有内容都进行计算:
    • 但是我需要 dask 做的不是为我计算整个变换,然后提供一个部分。
      • 我需要它仅执行计算特定 2D 变换图像切片所需的任务。

您认为可能吗?

为了用图像来解释它 - 请将其视为 3D 域分解(这来自 DWT - 但适合说明 from here ):

illistration of domain decomposition

并假设有一个函数使用 dask 计算整个体积的 3D 变换。但我想要得到的 - 例如 - 是转换后的 3D 数据的 2D 图像,它由 LLL1、LLH1、HLH1、HLL1 平面组成(本质上是一个切片) .

重要的部分不是计算整个子多维数据集,而是让 dask 以某种方式自动跟踪计算图中的依赖关系并仅评估这些依赖关系。

请不要担心计算与计算。复制时间。假设它有完美的比例。

如果需要更多说明,请告诉我!感谢您的帮助!

最佳答案

我听到一些问题。我将逐一回答

  • Dask 能否跟踪输出子集所需的任务并仅计算这些任务?

是的。 Lazy Dask 操作会生成依赖图。在 dask.arrays 的情况下,该图是按 block 的。如果您的输出仅取决于图表的子集,那么 Dask 将删除不必要的任务。这方面的深入文档是 herecull特别是优化。

作为一个例子,考虑这个 100,000 x 100,000 数组

>>> x = da.random.random((100000, 100000), chunks=(1000, 1000))

假设我从中添加了几个一维切片

>>> y = x[5000, :] + x[:, 5000].T

生成的优化图仅大到足以计算输出

>>> graph = y._optimize(y.dask, y._keys())  # you don't need to do this
>>> len(graph) # it happens automatically
301

我们可以很快地计算出结果:

In [8]: %time y.compute()
CPU times: user 3.18 s, sys: 120 ms, total: 3.3 s
Wall time: 936 ms
Out[8]:
array([ 1.59069994, 0.84731881, 1.86923216, ..., 0.45040813,
0.86290539, 0.91143427])

现在,这并不完美。它确实必须生成我们的两个切片接触的所有 1000x1000 block 。但您可以控制那里的粒度。

简短回答:Dask 将自动检查图表并仅运行评估输出所需的任务。您无需执行任何特殊操作即可执行此操作。

  • 使用 dask.array 进行重叠数组计算是个好主意吗?

也许吧。相关文档页面位于 Overlapping Blocks with Ghost Cells 。 Dask.array 具有方便的函数,可以轻松记录下来。但是它会创建内存中的副本。许多处于你位置的人发现 memcopy 太慢了。 Dask 通常不支持就地计算,因此我们无法像正确的 MPI 代码一样高效。不过,我会将性能问题留给您。

关于python - 使用 dask 进行 3D 体处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42939653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com