【发布时间】:2021-05-16 00:07:41
【问题描述】:
我有一堆仅按行执行的矩阵乘法运算。我想知道如何通过并行化加速计算:
data = np.random.randint(1, 100, (100000, 800))
indices_1 = np.equal(data, 1)
A = np.zeros((100000, 100))
B = np.random.randn(800, 100)
for i in range(100000):
ones = indices_1[i]
not_ones = ~indices_1[i]
B_ones = B[ones]
B_not_ones = B[not_ones]
A[i] = (data[i][not_ones] @ B_not_ones) @ np.linalg.inv(B_not_ones.T @ B_not_ones)
data[i][ones] = A[i] @ B_ones.T
我尝试了多处理器,但由于某种原因,它的性能并不比顺序处理器好。这是我的多处理器实现:
from multiprocessing.pool import ThreadPool, Pool
pool = ThreadPool() # can also use Pool
def f(i):
ones = indices_1[i]
not_ones = ~indices_1[i]
B_ones = B[ones]
B_not_ones = B[not_ones]
A[i] = (data[i][not_ones] @ B_not_ones) @ np.linalg.inv(B_not_ones.T @ B_not_ones)
data[i][ones] = A[i] @ B_ones.T
pool.map(f, range(100000))
两者的运行时间相同(大约 32 秒)。 concurrent.futures 等其他并行化方法并没有提高运行时间(如下所示):
with concurrent.futures.ThreadPoolExecutor() as executor:
result = executor.map(f, range(100000))
我也尝试申请dask,但无法让他们的框架在我的情况下工作。任何帮助都感激不尽!谢谢!
【问题讨论】:
-
多处理必须在进程之间复制您的数据。它不适合处理单个大块数据。
-
GPU 是否适合您?在 Google colab 上用 GPU 版本尝试过你的代码?
-
我会完全删除 for 循环,让 numpy 处理矩阵运算。
-
@ZeelBharatkumarPatel1931006 我刚刚在 Google colab 上尝试过使用 GPU,两者的运行时间都下降到了 28,但多处理器并没有改善运行时间。
-
你必须使用多线程模块,因为在多处理中每个进程工作者都有自己的内存并且你不会得到你想要的结果,你可以使用 cocurrent.futures.ThreadPoolExecutor
标签: python numpy parallel-processing multiprocessing dask