GPU 利用率在神经网络训练环境中如何工作?



我正在使用带有深度学习 AMI (DLAMI( 的 AWS p3.2xlarge 实例。此实例具有单个 Tesla V100(640 个张量核心和 5,120 个 CUDA 核心(。当我运行 PyTorch Seq2Seq Jupyter Notebook 时,我注意到只使用了 25% 的 GPU。我使用以下命令监视 GPU 使用情况watch -n 1 nvidia-smi.

我的问题是,什么决定了 GPU 的使用?或者,为什么 GPU 使用率不是 100%?这个问题背后的原因不仅与代码造成的效率低下有关,还与成本(3.06 美元/小时(有关。我想知道我是否可以做更多的事情来最大化 GPU 使用率。

当然,这是一个正在学习的深度学习模型,训练代码通过网络一次发送一个样本进行学习。我认为小批量学习可能不合适(例如,在反向传播之前发送几个样本(。我还想知道网络架构(层数、参数、输入张量尺寸等(是否限制了 GPU 的使用方式。例如,如果我添加更多层或添加更多隐藏节点,我是否应该期望 GPU 使用率上升?

GPU 相对于 CPU 的强大功能是同时运行许多操作。 但是,归档这种高级别的并行化并不总是那么容易。像Tensorflow或PyTorch这样的框架尽最大努力优化GPU和并行化的所有内容,但这并非适用于所有情况。

一般来说,LSTM和RNN中的计算只能在非常有限的程度上并行化。问题在于它们的顺序结构,LSTM 和 RNN 一次只处理一个输入,并且它们需要按时间顺序处理所有内容(要计算 n+1,您总是需要先计算 n(- 否则就没有意义了。

所以在 RNN 中处理数据的自然方式与并行化完全相反,使用小批量确实有很大帮助,但并不能解决 LSTM 的根本问题。

如果你不想要大量的并行化,你需要使用像谷歌在论文"注意力是你所需要的一切"中提出的"变形金刚">这样的架构。

总结

模型的并行化程度或 GPU 加速在很大程度上取决于模型本身的架构。 对于某些架构,如RNN,并行化只能在有限的程度上实现。

编辑:

例如,如果我添加更多层或添加更多隐藏节点,我是否应该期望 GPU 使用率上升?

当增加单元数量时,您应该期望 GPU 使用率上升,矩阵操作(如将输入传递到隐藏层(可以很好地并行化。

添加层是不同的,您有同样的问题,导致 RNN 在 GPU 上变慢。要计算下一层,您需要已经拥有上一层的结果。所以你需要一层接一层地计算,不可能同时计算所有层。

这是理论 - 在实践中,您可能会看到 GPU 使用的一些细微差异,具体取决于框架的实际实现。

最新更新