Tensorflow是否将稀疏矩阵使用CSR以外的COO格式作为显而易见的原因?

You*_* Oh 4 sparse-matrix tensorflow

我正在尝试从Tensorflow的内置稀疏矩阵乘法API中获得性能优势。并且,keveman建议tf.embedding_lookup_sparse是正确的方法。

但是,似乎embedding_lookup_sparse的性能在我的实验中有些令人失望。尽管它执行<1,3196>和<3196,1024>较小的矩阵乘法,但稀疏度为0.1的稀疏矩阵无法赢得密集的矩阵乘法。

如果我的实现是正确的,我认为原因之一是Tensorflow使用COO格式保存所有索引-非零对。我不是该领域的专家,但是,众所周知,CSR格式在这种计算中性能更高吗?Tensorflow内部使用除CSR以外的COO格式进行稀疏矩阵表示的任何明显原因是什么?

pau*_*l-g 5

仅作记录,您说的是矩阵乘法,但是您的矩阵之一实际上是一个向量(1 x 3196)。因此,这将使其成为矩阵向量乘法(不同的BLAS内核)。我将假设您的意思是矩阵向量乘法。

是的,在矩阵向量乘法方面,CSR 理论上应该比COO更快;这是因为CSR格式的存储大小为O(2nnz + n)vsO(3nnzs),而稀疏矩阵矢量乘法在很多情况下受内存限制。

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

尤其是当矩阵和向量大小太小而几乎所有内容都适合缓存时,我预计性能收益将有限。稀疏矩阵结构通常对于10sK x 10sK到1B x 1B的真正大型矩阵更有用,而使用密集表示法甚至无法容纳在主内存中。根据我的经验,对于小问题大小,与局部格式和算术效率的损失通常会抵消与密集格式相比的存储优势。在某种程度上,这可以通过混合存储格式(例如Block CSR)来解决,这种格式试图兼顾两者的优势,并且在某些应用程序中非常有用(看起来并不像tensorflow支持此功能)。

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