有没有明显的理由说Tensorflow使用CSR之外的COO格式来表示稀疏矩阵?

时间:2016-06-08 12:36:13

标签: tensorflow sparse-matrix

我试图通过内置的Tensorflow稀疏矩阵乘法API获得性能优势。 keveman建议 tf.embedding_lookup_sparse 是正确的方法。

但是,似乎 embedding_lookup_sparse 的表现在my experiments中有些失望。尽管它执行相当小的矩阵乘法,但是< 1,396>和< 3196,1024>,0.1稀疏的稀疏matmul无法赢得密集矩阵乘法。

如果我的实现是正确的,我认为其中一个原因是Tensorflow使用COO格式保存所有索引非零对。我不是这个领域的专家,但是,众所周知,CSR格式在这种计算上的表现更为出色吗?有没有明显的理由说Tensorflow内部使用CSR以外的COO格式进行稀疏矩阵表示?

1 个答案:

答案 0 :(得分:4)

只是为了记录,你说矩阵乘法,但你的一个矩阵实际上是一个向量(1 x 3196)。所以这将使它成为矩阵向量乘法(不同的BLAS内核)。我将假设你的意思是矩阵向量乘法我的答案。

是的,理论上CSR应比COO更快地进行矩阵向量乘法;这是因为CSR格式的存储大小为O(2nnz + n) vs O(3nnzs),稀疏矩阵向量乘法在很多情况下是内存绑定的。

与密集矩阵乘法相比,确切的性能差异会根据问题大小,稀疏模式,数据类型和实现而有所不同。很难说蝙蝠应该更快,因为稀疏存储格式引入了间接性,这可能导致局部性降低和算术单元的利用率降低(例如不使用矢量化)。

特别是当矩阵和矢量大小太小以至于几乎所有东西都适合缓存时,我预计性能会受到限制。稀疏矩阵结构通常对于真正大的矩阵更有用,范围从10sK x 10sK到1B x 1B,使用密集表示甚至不适合主存储器。对于小问题规模,根据我的经验,与密集格式相比,存储优势通常会被局部性和算术效率的损失所抵消。在某种程度上,这可以通过混合存储格式(例如Block CSR)来解决,它们试图充分利用这两个领域,并且对某些应用程序非常有用(看起来tensorflow不支持这种情况)。

tensorflow中,我假设使用了COO格式,因为它对其他操作更有效,例如它支持数据结构中的O(1)更新,插入和删除。在稀疏矩阵向量乘法中交换~50%的性能似乎是合理的,以提高这些操作的性能。