GPU 上 CPU、training/gradients 上的变量
Variables on CPU, training/gradients on GPU
在 CIFAR-10 教程中,我注意到变量放在 CPU 内存中,但在 cifar10-train.py
中说明它是用单个 GPU 训练的。
我很困惑.. layer/activations 是否存储在 GPU 中?或者,梯度是否存储在 GPU 中?否则,在 CPU 上存储变量似乎根本不会使用 GPU - 所有内容都存储在 CPU 内存中,因此只有 CPU 用于 forward/backward传播。
如果 GPU 用于 f/b 传播,那会不会因为延迟改组数据而造成浪费 CPU <-> GPU?
确实,在 cifar10-train 中,激活和梯度在 GPU 上,只有参数在 CPU 上。你是对的,由于在 CPU 和 GPU 之间复制参数的成本,这对于单 GPU 训练来说不是最优的。我怀疑这样做的原因是为了让单 GPU 和多 GPU 模型有一个单一的库,因为在多 GPU 的情况下,在 CPU 上设置参数可能更快。您可以轻松测试通过将所有变量移动到 GPU 可以获得什么样的加速,只需删除 cifar10.py 中的“_variable_on_cpu”中的 "with tf.device('/cpu:0')"。
在 CIFAR-10 教程中,我注意到变量放在 CPU 内存中,但在 cifar10-train.py
中说明它是用单个 GPU 训练的。
我很困惑.. layer/activations 是否存储在 GPU 中?或者,梯度是否存储在 GPU 中?否则,在 CPU 上存储变量似乎根本不会使用 GPU - 所有内容都存储在 CPU 内存中,因此只有 CPU 用于 forward/backward传播。
如果 GPU 用于 f/b 传播,那会不会因为延迟改组数据而造成浪费 CPU <-> GPU?
确实,在 cifar10-train 中,激活和梯度在 GPU 上,只有参数在 CPU 上。你是对的,由于在 CPU 和 GPU 之间复制参数的成本,这对于单 GPU 训练来说不是最优的。我怀疑这样做的原因是为了让单 GPU 和多 GPU 模型有一个单一的库,因为在多 GPU 的情况下,在 CPU 上设置参数可能更快。您可以轻松测试通过将所有变量移动到 GPU 可以获得什么样的加速,只需删除 cifar10.py 中的“_variable_on_cpu”中的 "with tf.device('/cpu:0')"。