Deep learning RNN最有效的张量格式(填充与打包、时间主要与批量主要)

Deep learning RNN最有效的张量格式(填充与打包、时间主要与批量主要),deep-learning,cuda,cudnn,Deep Learning,Cuda,Cudnn,不久前(在CuDNN引入其自己的RNN/LSTM实现之前),您将使用[B,T,D](批处理主要)或[T,B,D](时间主要)形状的张量,然后使用直接的LSTM实现。 直线前进是指例如纯Theano或纯TensorFlow 普遍认为,对于RNN/LSTM而言,time major更有效。 这可能是由于展开了no/TensorFlow的内部细节(例如,在TensorFlow中,您将使用tf.tensorray,它自然会在第一个轴上展开,因此它必须是时间主轴,否则它将意味着转置到时间主轴;并且不使用t

不久前(在CuDNN引入其自己的RNN/LSTM实现之前),您将使用[B,T,D](批处理主要)或[T,B,D](时间主要)形状的张量,然后使用直接的LSTM实现。 直线前进是指例如纯Theano或纯TensorFlow

普遍认为,对于RNN/LSTM而言,time major更有效。 这可能是由于展开了no/TensorFlow的内部细节(例如,在TensorFlow中,您将使用
tf.tensorray
,它自然会在第一个轴上展开,因此它必须是时间主轴,否则它将意味着转置到时间主轴;并且不使用
tf.tensorray
,而是直接访问张量在backprop阶段效率极低)。 但我认为这也与内存位置有关,因此即使使用您自己的自定义本机实现,您可以完全控制这些细节(因此可以选择您喜欢的任何格式),time major也应该更高效。 (也许有人能证实这一点?) (以类似的方式,对于卷积,批量通道主(NCHW)也更有效.)

然后CuDNN介绍了他们自己的RNN/LSTM实现,他们使用压缩张量,即移除所有填充。此外,序列必须按序列长度排序(最长优先)。这也是主要时间,但没有填充帧

这给采用这些内核带来了一些困难,因为到目前为止,填充张量(非压缩)在所有框架中都是非常标准的,因此您需要按seq长度排序,打包,然后调用内核,然后解包并撤消序列排序。但慢慢地,框架采用了这种方法

但是,Nvidia随后扩展了CuDNN功能(例如,
cudnnRNNForwardTrainingEx
,然后是以后的
cudnnRNNForward
)。现在,该功能支持所有三种格式:

  • CUDNN\u RNN\u数据布局\u SEQ\u MAJOR\u解包
    :填充数据布局,从一个时间步到下一个时间步(时间大调或顺序大调)

  • CUDNN\u RNN\u数据\u布局\u批次\u主要\u解包
    :填充数据布局,从一个批次到下一个批次(批次主要)

  • CUDNN\u RNN\u DATA\u LAYOUT\u SEQ\u MAJOR\u PACKED
    :序列长度按照基本RNN API中的方式进行排序和打包(时间主要,无填充帧,即打包)

CuDNN参考资料: , (搜索“已打包”或“已填充”)

请参见示例
cudnsetrndatadescriptor
。一些引号:

对于未打包布局,支持序列主布局(即时间主布局)和批处理主布局。为了向后兼容,支持打包序列主布局

此数据结构旨在支持扩展RNN推理和训练功能的输入和输出的未打包(填充)布局。还支持打包(未添加)布局以实现向后兼容性

在TensorFlow中,因为CuDNN支持填充布局,所以他们已经清理了代码,现在只支持填充布局。我看不出您可以再使用打包布局了。(对吗?) (我不知道为什么会做出这个决定。只是为了更简单的代码?还是更高效?)

PyTorch仅正确支持打包布局(当序列长度不同时)()

除了计算效率,还有内存效率。显然,压缩张量的w.r.t.内存消耗更好。所以这不是真正的问题

我最想知道的是计算效率。压缩格式是最有效的吗?还是与填充时间专业相同?时间专业比批量专业更有效?

(这个问题不一定是关于CuDNN的,而是关于CUDA中任何幼稚或优化的实现。)

显然,这个问题还取决于剩余的神经网络。当你把LSTM和其他可能需要非打包张量的模块混合在一起时,如果LSTM使用打包的格式,你会有很多的打包和解包。但是考虑到你可以重新实现所有其他模块,也可以工作在压缩格式上:也许压缩格式在各个方面都会更好

(也许答案是,没有明确的答案。但我不知道。也许也有明确的答案。上次我实际测量时,答案非常明确,至少在我问题的某些部分,也就是说,对于RNN来说,time major总体上比batch major更有效。也许答案是,它取决于硬件。但这不应该这是一个猜测,但无论是真实的测量,还是更好的解释。据我所知,这应该主要是硬件不变的。如果答案因硬件而异,这对我来说是出乎意料的。我还假设压缩与填充可能不会真的有什么不同,ag硬件不重要,但也许有人真的知道。)