GPU 利用率如何在神经网络训练的背景下发挥作用?

Posted

技术标签:

【中文标题】GPU 利用率如何在神经网络训练的背景下发挥作用?【英文标题】:How does GPU utilization work in the context of neural network training? 【发布时间】:2018-10-14 07:42:15 【问题描述】:

我正在使用带有 Deep Learning AMI (DLAMI) 的 AWS p3.2xlarge 实例。这个实例有一个Tesla V100(640 个张量核心和 5120 个 CUDA 核心)。当我运行PyTorch Seq2Seq Jupyter Notebook 时,我注意到只有 25% 的 GPU 被使用。我使用以下命令 watch -n 1 nvidia-smi 监控 GPU 使用情况。

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

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

【问题讨论】:

【参考方案1】:

GPU 优于 CPU 的强大之处在于可以同时运行许多操作。然而,归档这种高水平的并行化并不总是那么容易。 Tensorflow 或 PyTorch 等框架尽最大努力优化 GPU 和并行化的所有内容,但这并非适用于所有情况。

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

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

如果您不想要大量的并行化,则需要使用像 Google 的论文 "Attention is all you need" 中提出的 “Transformer” 这样的架构。

总结

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

编辑:

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

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

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

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

【讨论】:

以上是关于GPU 利用率如何在神经网络训练的背景下发挥作用?的主要内容,如果未能解决你的问题,请参考以下文章

一块GPU就能训练语义分割网络,百度PaddlePaddle是如何优化的?

一块GPU就能训练语义分割网络,百度PaddlePaddle是如何优化的?

[pytorch]单多机下多GPU下分布式负载均衡训练

如何确保所有 PyTorch 代码充分利用 Google Colab 上的 GPU

fakeapp训练用GPU还是CPU

在FloyHub中训练模型时,如何充分利用GPU?