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

How does GPU utilization work in the context of neural network training?

我正在使用 AWS p3.2xlarge instance with the Deep Learning AMI (DLAMI). This instance has a single Tesla V100 (640 Tensor Cores and 5,120 CUDA Cores). When I run the PyTorch Seq2Seq Jupyter Notebook,我注意到只使用了 25% 的 GPU。我使用以下命令 watch -n 1 nvidia-smi 监控 GPU 使用情况。

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

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

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

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

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

如果您不想进行大量并行化,则需要使用 "Transformer""Attention is all you need" 论文 [=44] 中提出的架构=].

总结

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

编辑:

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

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

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

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