【问题标题】:How can I improve the performance of my Neural Networks?如何提高神经网络的性能?
【发布时间】:2021-06-18 13:43:57
【问题描述】:

当我学习用 Python 编写神经网络时,我刚刚编写了以下线性关联网络,它接收 K 输入向量 x_1, ..., x_K 各自长度 L 和 K 各自长度的输出向量 @ 987654326@ 并使用梯度下降找到最佳权重。

由于在调整K、L 和N 时计算时间会迅速爆炸,我正在寻找如何加快计算速度。我发现了 cupy,但在这种情况下,cupy 比 numpy 慢得多。 为什么会这样?将代码更改为 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)

【问题讨论】:

  • 您可以尝试使用JAX。它有一个类似于 numpy 的 API,具有自动微分和 GPU 支持。
  • 请提供一个可重现的最小示例,否则人们将无法为您提供帮助。
  • @jakub 谢谢你的建议。不幸的是,原来 JAX 还不支持 Windows。

标签: python performance numpy neural-network gpu


【解决方案1】:

我发现了 cupy,但在这种情况下,cupy 比 numpy 慢得多。为什么会这样?

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

有什么方法可以在课堂内使用 njit,或者除此之外还有更好的方法来使用 numba/cuda?

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

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

还有哪些其他好方法可以加快下面的代码速度?我能写得更有效率吗?我可以更好地使用 GPU 吗?

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

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 2018-01-10
    • 2017-09-06
    • 2020-12-09
    • 2016-08-02
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多