首页 文章

Tensorflow是否有任何明显的理由使用除CSR之外的COO格式用于稀疏矩阵?

提问于
浏览
4

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

但是,似乎 embedding_lookup_sparse 的表现在_2813727中有些失望 . 虽然它执行相当小的矩阵乘法,<1,3196>和<3196,1024>,但是具有0.1稀疏度的稀疏matmul无法赢得密集矩阵乘法 .

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

1 回答

  • 4

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

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

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

    特别是当矩阵和矢量大小太小以至于几乎所有东西都适合缓存时,我会期望有限的性能优势 . 稀疏矩阵结构通常对于真正大的矩阵更有用,范围从10sK x 10sK到1B x 1B,这看起来不像 tensorflow 支持这一点 .

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

相关问题