在我学习用Python编写神经网络的过程中,我刚刚编写了以下线性关联网络,该网络接受各自长度的K
输入向量x_1, ..., x_K
和各自长度的N
输出向量K
,并使用梯度下降法找到最佳权重
当调整K
、L
和N
时,计算时间非常快,因此我正在研究如何加快计算速度。我发现了丘比,但在这个例子中,丘比比努比慢得多为什么会这样?当将代码更改为cupy变体时,我什么也不做,只是将每个np
替换为cp
,因为我将cupy导入为cp
我也用过f = njit()(ManyAssociations.fit)
,但后来我不得不适应return W
,而不是写ManyAssociations.weights = W
有没有办法在课堂内使用njit,或者除此之外还有没有更好的办法使用numba/cuda?事实证明,在第一次函数调用“预热”之后,它的速度要快得多,但在K = L = N = 9
附近使用上述形状的向量时,它仍然达到了极限
还有什么其他的好方法可以加速代码,比如下面的方法?我能更有效地写作吗?我能更好地使用GPU吗?
import numpy as np
class ManyAssociations:
def fit(x_train, y_train, learning_rate, tol):
L_L = x_train.shape[1]
L_N = y_train.shape[1]
W = np.zeros((L_N, L_L))
for n in range(L_N):
learning = True
w = np.random.rand(L_L)
while learning:
delta = (x_train @ w - y_train[:,n])
grad_E = delta @ x_train
w = w - learning_rate * grad_E
if (grad_E @ grad_E) < tol:
W[n] = w
learning = False
ManyAssociations.weights = W
def predict(x_pred, W):
preds = []
for k in range(x_pred.shape[0]):
preds.append(W @ x_pred[k])
return np.array(preds)
GPU上的计算分为基本的计算密集型构建块,称为内核。内核由CPU提交到GPU每个内核调用都需要一些时间:CPU必须与GPU通信,并且经常使用相对较慢的PCI互连(两者都应同步),应在GPU上进行分配,以便写入生成的数据,等等。CuPy包天真地将每个基本Numpy指令转换为GPU内核由于循环执行许多小内核,因此开销很大。因此,如果您希望使用CuPy在GPU上更快地编写代码,您需要处理大量数据块,或者直接编写自己的内核(这很难,因为GPU非常复杂)
您可以使用
@jitclass
。您可以在documentation中找到更多信息此外,您可以利用并行性加快代码编写速度。为此,您可以用
prange
替换range
,并将属性parallel=True
添加到Numba的njit
。您可以找到更多信息here神经网络通常是计算密集型的。Numba应该相当好,以获得相当高的性能。但是,如果您想要一个快速的代码,那么您要么需要使用更高级别的库,要么需要自己重写库所做的事情(可能是使用更低级别的代码)。 使用神经网络的标准方法是使用专用库,如TensorFlow、PyTorch、Keras等。另外,前者是灵活的,高度优化的,尽管它比另一个稍微低一点
相关问题 更多 >
编程相关推荐