Tensorflow 将Keras/TF/PyTorch层指定给硬件类型

Tensorflow 将Keras/TF/PyTorch层指定给硬件类型,tensorflow,keras,deep-learning,pytorch,Tensorflow,Keras,Deep Learning,Pytorch,假设我们有以下体系结构: 多个CNN层 RNN层 (时间分布)密集分类层 我们现在要训练这个架构。我们奇特的GPU在解决CNN层方面非常快。虽然使用较低的时钟速率,但它可以并行执行许多卷积,从而提高速度。然而,对于(非常长的)结果时间序列,我们奇特的CPU速度更快,因为时间步长不能并行化,并且处理得益于更高的CPU时钟速率。因此(据推测)执行的明智想法如下所示: 多个CNN层(在GPU上运行) RNN层(在CPU上运行) (时间分布)密集分类层(在GPU/CPU上运行) 这就引出了两个重要问题:

假设我们有以下体系结构:

  • 多个CNN层
  • RNN层
  • (时间分布)密集分类层
  • 我们现在要训练这个架构。我们奇特的GPU在解决CNN层方面非常快。虽然使用较低的时钟速率,但它可以并行执行许多卷积,从而提高速度。然而,对于(非常长的)结果时间序列,我们奇特的CPU速度更快,因为时间步长不能并行化,并且处理得益于更高的CPU时钟速率。因此(据推测)执行的明智想法如下所示:

  • 多个CNN层(在GPU上运行)
  • RNN层(在CPU上运行)
  • (时间分布)密集分类层(在GPU/CPU上运行)
  • 这就引出了两个重要问题:

    使用标题中提到的任何框架,是否可以将某些层分发到某些硬件,以及如何分发


    如果可能的话,额外内存操作的开销,例如GPU-/CPU-RAM之间的传输,会不会使整个想法变得无用?

    基本上,在Pytorch中,您可以控制变量/参数所在的设备。另外,您有责任确保每个操作的所有参数都位于同一设备上:即,您不能
    conv(x,y)
    其中
    x
    位于GPU上而
    y
    位于CPU上


    这是通过Pytork的
    .to()
    方法完成的,该方法将模块/变量
    .to('cpu')
    .to('cuda:0')
    移动到('cuda:0'),正如Shai提到的,您可以在Pytork中自行控制,因此理论上您可以在不同的设备上拥有部分模型。然后,您必须在向前传球的设备之间移动数据

    我认为你提到的开销会使性能最差。cuda RNN实现从gpu上运行中获益匪浅:)