【发布时间】:2022-01-12 10:06:16
【问题描述】:
下面是使用dask 和cupy 的可运行代码sn-p,我遇到了问题。我在激活了 GPU 的 Google Colab 上运行它。
基本上我的问题是,A 和 At 是对 RAM 来说太大的数组,这就是我使用 Dask 的原因。在这些对于 RAM 数组来说太大的情况下,我运行操作,但我想获得 AtW1[:,k] (作为一个cupy数组)而不会耗尽我的 RAM 或 GPU 内存,因为我需要这个值用于进一步的操作。我怎样才能做到这一点?
import dask.array as da
import cupy as cp
from dask_cuda import LocalCUDACluster
from dask.distributed import Client
cluster = LocalCUDACluster()
client = Client(cluster)
n_topics = 10
n_terms = 10000
n_docs = 250000
k = 0
A = da.zeros_like(cp.zeros(1), shape=(n_terms,n_docs), chunks=(1,n_docs))
At = A.transpose().rechunk((10, n_terms))
n_row = A.shape[0]
n_col = A.shape[1]
W1 = cp.random.random((n_row, n_topics))
H = cp.random.random((n_col, n_topics))
W1tW1 = W1.T.dot(W1)
# The problem starts here: i want to get AtW1[:,k] as a cupy array without blowing my RAM
AtW1 = da.dot(At, W1).rechunk((n_docs, 1))
AtW1 = AtW1.persist()
val = AtW1[:,k].compute()
val
编辑:另一个有同样问题的例子。如何在不更改第一部分的情况下实现计算?第一部分的变量就在那里,所以数组的维度是明确的,例子是可运行的。
import cupy as cp
import dask.array as da
from dask.array.linalg import norm
from dask_cuda import LocalCUDACluster
from dask.distributed import Client
cluster = LocalCUDACluster()
client = Client(cluster)
####### These are given and cannot be changed #######
big = 250000
small = 10000
full = da.full_like(cp.full(1, 2.0), fill_value=2.0, shape=(small,big), chunks=(1,big))
a = cp.random.random((small, 10))
b = cp.transpose(cp.random.random((big, 10)))
###### How can i make this work? #######
ab = da.dot(da.from_array(a), da.from_array(b))
subtracted = full - ab
normalized = norm(subtracted, ord='fro')
val = normalized.compute()
【问题讨论】:
-
频繁重新分块的动机是什么?
-
@SultanOrazbayev 我根据我计划执行的操作和我想要访问的数据重新分块。例如,在点积的第一个参数上,我想要具有形状(短、长)的块,而对于我想要的第二个参数(长、短),因为矩阵的点积的计算方式。跨度>
标签: python numpy memory dask cupy