【问题标题】:tensorflow 2.0 custom layers on gpugpu上的tensorflow 2.0自定义层
【发布时间】:2020-04-25 22:04:41
【问题描述】:

TensorFlow 中完全定制的层会自动在 GPU 上运行吗?我注意到在本文档 (https://www.tensorflow.org/guide/keras/rnn#rnn_layers_and_rnn_cells) 中似乎 RNN 包装器不会使用 CudNN?这意味着它不会在 GPU 上运行,对吧?

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    您的自定义层仍将使用 GPU,您可以按照answer 中的说明确认这一点。

    虽然自定义层不会使用 cuDNN,但您是对的。为什么这有关系?在 NVidia 之后引用:

    cuDNN 为标准例程(例如前向和后向卷积、池化、归一化和激活层)提供高度优化的实现

    换句话说,使用这些优化的原语将提高训练的性能。 cuDNN: Efficient Primitives for Deep Learning 论文中提供了一些带有详细解释的示例。以 空间卷积 为例。未优化的实现将使用“幼稚”的方法,而 cuDNN 使用各种技巧来减少操作数量并适当地对它们进行批处理。与经典 CPU 相比,GPU 仍然很快,cuDNN 只是让它更快。有关最新的独立基准,请查看例如this article.

    不过,如果 Tensorflow 在 GPU 模式下运行,完整的计算图将在 GPU 上执行(据我所知,甚至没有简单的方法可以取出图的一部分,即中间层,然后放到 CPU 上)。

    【讨论】:

    • 你在上一段中所说的不是真的,TensorFlow 可以在 CPU 或 GPU 中运行 ops(图的一部分),这取决于它是如何实现的。您甚至可以使用声明 with tf.device("cpu"): 强制执行此操作
    • 对不起,如果我误解了,但我认为在 GPU 上运行的目的是使用 cuDNN?如果我不使用 cuDNN,那岂不是让它像在 CPU 上运行一样慢?
    • @MatiasValdenegro 您是否有任何示例说明如何使用tf.device 运行图的一部分(中间层)?我知道您可以运行单独的任务/作业,但这些 AFAIK 是独立的图表。
    • @cmed123 否。通常,您使用 GPU(或其他硬件)API 来利用其功能。对于 NVidia GPU,API 称为 CUDA。 Tensorflow 的部分目的是为 CUDA(低级且难以编程)提供高级 API。如果您跟踪自定义 Tensorflow 代码的执行,您将看到它最终调用 CUDA 并在 GPU 上运行。在您使用“标准”元素的情况下,cuDNN 可以启动并使用优化程序(请参阅额外说明)。
    • @LukaszTracewski 啊,我明白了,谢谢,所以这里基本上有两个优化级别。在 GPU CUDA 上运行比在 CPU 上运行要快,但在 GPU CudNN 上运行甚至比纯 GPU CUDA 还要快。我理解正确吗?