**上下文:**我求解方程A_des.x = b
,其中我通过最小二乘法找到x
。我必须执行此操作数千次。A_des
在每次迭代之间变化,但保持稀疏(始终约为矩阵中实际数据的4%)。
问题:A_des
很大((28106, 1185)
),解线性方程组大约需要1秒,我需要做30万次。
**问题:**你有什么线索可以加快这一进程?
**我尝试了什么:**我在GPU和CPU上都编写了我的函数。我使用pytorch
进行GPU计算,但速度不一致。我不能并行化我的函数,因为求解器函数通常已经线程化。我尝试在CPU上使用几个求解器函数:np.linalg.solve
,np.linalg.lstsq
,scipy.linalg.solve
,scipy.optimize.least_squares
,scipy.sparse.linalg.lsqr
(用scipy.sparse.coo_array(A_des)
预先转换A_des
)。
**我找到的最好的方法:**我找到的最好的折衷方法是使用np.linalg.solve
,我只需要手工做一些矩阵操作。例如,用最小二乘函数求解系统将是:x = np.linalg.lstsq(A_des, b)
,而用solve
求解系统将是:x = np.linalg.solve(A_des.T@A_des, A_des.T@b)
。我发现的唯一另一个更快求解系统的方法是:x = scipy.sparse.linalg.lsqr(A_des, b, atol = 1e-3, btol = 1e-3)
,但结果并不好。
我的功能:
def Inverter(GPU, A_des, b):
if GPU:
# Migrate b to torch
b= torch.from_numpy(b).to(device).double()
# Migrate design matrix to GPU
A_des = torch.from_numpy(A_des).to(device)
x= torch.linalg.solve(A_des.T@A_des,A_des.T@(b)).cpu()
else:
#x= scipy.sparse.coo_array(A_des)
#x= scipy.sparse.linalg.lsqr(A_des, b)[0]
#x = scipy.linalg.solve(A_des.T@A_des,A_des.T@(b))
x= np.linalg.solve(A_des.T@A_des,A_des.T@b)
return x
字符串
1条答案
按热度按时间mfpqipee1#
您可以尝试使用Numba库在GPU上并行化函数
https://numba.readthedocs.io/en/stable/user/jit.html