如何提高神经网络的性能?

2024-07-05 14:31:40 发布

您现在位置:Python中文网/ 问答频道 /正文

在我学习用Python编写神经网络的过程中,我刚刚编写了以下线性关联网络,该网络接受各自长度的K输入向量x_1, ..., x_K和各自长度的N输出向量K,并使用梯度下降法找到最佳权重

当调整KLN时,计算时间非常快,因此我正在研究如何加快计算速度。我发现了丘比,但在这个例子中,丘比比努比慢得多为什么会这样?当将代码更改为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)

Tags: 代码网络nptrain向量cpfitlearning
1条回答
网友
1楼 · 发布于 2024-07-05 14:31:40

I discovered cupy, but cupy is much, much slower than numpy in this case. Why would this be?

GPU上的计算分为基本的计算密集型构建块,称为内核。内核由CPU提交到GPU每个内核调用都需要一些时间:CPU必须与GPU通信,并且经常使用相对较慢的PCI互连(两者都应同步),应在GPU上进行分配,以便写入生成的数据,等等。CuPy包天真地将每个基本Numpy指令转换为GPU内核由于循环执行许多小内核,因此开销很大。因此,如果您希望使用CuPy在GPU上更快地编写代码,您需要处理大量数据块,或者直接编写自己的内核(这很难,因为GPU非常复杂)

Is there any way to use njit inside of the class or apart from that is there a better way to use numba/cuda?

您可以使用@jitclass。您可以在documentation中找到更多信息

此外,您可以利用并行性加快代码编写速度。为此,您可以用prange替换range,并将属性parallel=True添加到Numba的njit。您可以找到更多信息here

What are some other good ways to speed up code like the below one? Could I be writing more efficiently? Could I be using the GPU better?

神经网络通常是计算密集型的。Numba应该相当好,以获得相当高的性能。但是,如果您想要一个快速的代码,那么您要么需要使用更高级别的库,要么需要自己重写库所做的事情(可能是使用更低级别的代码)。 使用神经网络的标准方法是使用专用库,如TensorFlow、PyTorch、Keras等。另外,前者是灵活的,高度优化的,尽管它比另一个稍微低一点

相关问题 更多 >