【问题标题】:How is a minibatch processed by the GPU in PyTorch?PyTorch 中的 GPU 如何处理 minibatch?
【发布时间】:2020-07-29 01:19:18
【问题描述】:

我试图了解 PyTorch 是如何在小批量上实际执行前向传递的。当网络处理小批量时,小批量中的每个示例(例如每个图像)是否一个接一个地单独发送?还是小批量中的所有样本同时转发?

当通过网络转发示例时,额外的内存需求是每一层的激活。并且只要网络不占用整个 GPU,那么似乎可以同时存储这些激活的多个实例。然后可以使用每个实例化来将一个示例的激活存储在小批量中。因此,可以同时通过网络发送多个示例。但是,我不确定这是否真的在实践中完成。

我做了一些简单的实验,前向传递的时间大致与 minibatch 的大小成正比。这表明这些示例是一个接一个地发送的。如果是这样,那为什么人们说 minibatch 越大训练越快呢?似乎整个 epoch 的处理时间不会取决于 minibatch 的大小。

【问题讨论】:

  • 请在问题中发布您的简单实验代码和结果。

标签: pytorch


【解决方案1】:

我试图了解 PyTorch 是如何在小批量上实际执行前向传递的。当网络处理小批量时,小批量中的每个示例(例如每个图像)是否一个接一个地单独发送?还是小批量中的所有样本同时转发?

同时。为此,它依赖于批处理、广播、非线性操作的元素向量化(基本上,高度优化的 for 循环,有时是并行的)和矩阵线性代数。后者比 for 循环效率更高,因为它可以利用为并行线性代数设计的专用硬件组件(对于 cpu 和 gpu 都是如此,但 gpu 特别适合这种情况)。

然后,每个实例都可以用于将一个示例的激活存储在小批量中。因此,可以同时通过网络发送多个示例。但是,我不确定这是否真的在实践中完成。

这不是它的工作原理,torch 正在跟踪“操作”,每个操作都有一个backward,用于计算输入到输出的梯度。它旨在支持批处理和矢量化,这样处理一堆样本就像在单个backward pass 中一样。

我做了一些简单的实验,前向传递的时间大致与小批量大小成正比。

这不是真的。这可能是因为您已经消耗了 100% 的可用资源(cpu 或 gpu),或者因为您没有正确进行分析(这并不容易做到)。如果您发布一个示例,您会尝试在这一点上为您提供帮助。

【讨论】:

    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2020-05-22
    • 2021-09-26
    • 2019-06-26
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多