如何从 CuPy 数组创建一个 dask 数组?

Posted

技术标签:

【中文标题】如何从 CuPy 数组创建一个 dask 数组?【英文标题】:How to create a dask-array from CuPy array? 【发布时间】:2019-06-26 15:31:40 【问题描述】:

我正在尝试使用大量数据启动dask.cluster.Kmeans。 使用 CPU 是可以的,因为我用 dask.array 包装了 numpy 数组。 由于 cupy 中未实现功能,似乎无法使用 GPU。

我已经尝试重现 Mattew Rocklin 示例 (https://blog.dask.org/2019/01/03/dask-array-gpus-first-steps) 从 CuPy 随机生成器生成随机 dask 数组 - 它有效,但我不想使用这种情况。

dask.array 包裹cupy - 不起作用。

>>> import dask.array as da
>>> import cupy as cp
>>> da.from_array(cp.arange(100000)).sum().compute()

我期望这个数组的总和,但得到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ubuntu/miniconda3/envs/cupy/lib/python3.6/site-packages/dask/base.py", line 175, in compute
    (result,) = compute(self, traverse=False, **kwargs)
  File "/home/ubuntu/miniconda3/envs/cupy/lib/python3.6/site-packages/dask/base.py", line 446, in compute
    results = schedule(dsk, keys, **kwargs)
  File "/home/ubuntu/miniconda3/envs/cupy/lib/python3.6/site-packages/dask/threaded.py", line 82, in get
    **kwargs
  File "/home/ubuntu/miniconda3/envs/cupy/lib/python3.6/site-packages/dask/local.py", line 491, in get_async
    raise_exception(exc, tb)
  File "/home/ubuntu/miniconda3/envs/cupy/lib/python3.6/site-packages/dask/compatibility.py", line 130, in reraise
    raise exc
  File "/home/ubuntu/miniconda3/envs/cupy/lib/python3.6/site-packages/dask/local.py", line 233, in execute_task
    result = _execute_task(task, data)
  File "/home/ubuntu/miniconda3/envs/cupy/lib/python3.6/site-packages/dask/core.py", line 119, in _execute_task
    return func(*args2)
  File "/home/ubuntu/miniconda3/envs/cupy/lib/python3.6/site-packages/dask/array/core.py", line 100, in getter
    c = np.asarray(c)
  File "/home/ubuntu/miniconda3/envs/cupy/lib/python3.6/site-packages/numpy/core/numeric.py", line 538, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: object __array__ method not producing an array

那么我如何通过 dask 数组管理 CuPy 的工作?

【问题讨论】:

你的cupy是什么版本的? @mdurant,软件包版本:cupy-6.0.0dask-2.0.0 安装自 defaults 【参考方案1】:

从 CuPy 数组创建 Dask 数组时,您需要提供 da.from_array 关键字参数 asarray=False。所以你的代码如下所示。

>>> import dask.array as da
>>> import cupy as cp
>>> da.from_array(cp.arange(100000), asarray=False).sum().compute()

【讨论】:

感谢@akirkham,它有效。不幸的是,未实现的 CuPy 功能不会让我有机会在 dask.arraycupy 对象上启动 dask_ml.cluster.KMeans 感谢@RostislavPovelikin 提供的信息。如果您知道 CuPy 缺少哪些功能,您能否在该回购中提出一些问题?我们可以在那里跟进。独立你也可以考虑尝试dask-cuml,它也实现了KMeans

以上是关于如何从 CuPy 数组创建一个 dask 数组?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cupy 将数组附加到矩阵

如何子类化 CuPy 数组?

如何将 CuPy 数组传输到 tensorflow

使用 cupy 从 GPU 上的另一个矩阵创建距离矩阵

cupy或numpy中"数组"与"矩阵"的区别

如何使用训练有素的模型预测 Cupy 数组?