Tensorflow 对稀疏矩阵使用除 CSR 以外的 COO 格式有什么明显的原因吗?
Is there any obvious reason that Tensorflow uses COO format other than CSR for sparse matrix?
我正在尝试利用 Tensorflow 的内置稀疏矩阵乘法 API 的性能优势。
而keveman推荐tf.embedding_lookup_sparse才是正道
但是,embedding_lookup_sparse的表现似乎对my experiments有些失望。虽然它执行相当小的矩阵乘法,<1, 3196> 和 <3196, 1024>,但稀疏度为 0.1 的稀疏 matmul 无法赢得密集矩阵乘法。
如果我的实现是正确的,我认为原因之一是 Tensorflow 使用 COO 格式保存所有索引非零对。我不是这个领域的专家,但是 CSR 格式在这种计算上的性能更高不是广为人知吗? Tensorflow 内部使用 COO 格式而不是 CSR 来表示稀疏矩阵有什么明显的原因吗?
为了记录,您说 矩阵乘法 ,但您的一个矩阵实际上是一个向量 (1 x 3196)。所以这将使它成为一个 矩阵向量乘法 (不同的 BLAS 内核)。我假设你的答案是矩阵向量乘法。
是的,在矩阵向量乘法方面,CSR 理论上 应该比 COO 更快;这是因为 CSR 格式的存储大小为 O(2nnz + n)
与 O(3nnzs)
并且稀疏矩阵向量乘法在许多情况下受内存限制。
与密集矩阵乘法相比的确切性能差异因问题大小、稀疏模式、数据类型和实现而异。很难马上说出哪个应该更快,因为稀疏存储格式引入了间接性,这可能会导致局部性降低和算术单元的利用率低(例如,不使用矢量化)。
特别是当矩阵和向量的大小非常小以至于几乎所有内容都适合缓存时,我预计性能优势有限。稀疏矩阵结构通常对真正的大矩阵更有用,范围从 10sK x 10sK 到 1B x 1B,使用密集表示甚至无法容纳在主内存中。对于小问题,根据我的经验,与密集格式相比的存储优势通常会被局部性和算术效率的损失所抵消。在某种程度上,这是通过混合存储格式(例如 Block CSR)解决的,它试图兼顾两全其美,并且对某些应用程序非常有用(看起来 tensorflow
不支持这个)。
在tensorflow
中,我假设使用COO格式,因为它对其他操作更有效,例如它支持O(1)
数据结构的更新、插入和删除。在稀疏矩阵向量乘法中牺牲 ~50% 的性能以提高这些操作的性能似乎是合理的。
我正在尝试利用 Tensorflow 的内置稀疏矩阵乘法 API 的性能优势。 而keveman推荐tf.embedding_lookup_sparse才是正道
但是,embedding_lookup_sparse的表现似乎对my experiments有些失望。虽然它执行相当小的矩阵乘法,<1, 3196> 和 <3196, 1024>,但稀疏度为 0.1 的稀疏 matmul 无法赢得密集矩阵乘法。
如果我的实现是正确的,我认为原因之一是 Tensorflow 使用 COO 格式保存所有索引非零对。我不是这个领域的专家,但是 CSR 格式在这种计算上的性能更高不是广为人知吗? Tensorflow 内部使用 COO 格式而不是 CSR 来表示稀疏矩阵有什么明显的原因吗?
为了记录,您说 矩阵乘法 ,但您的一个矩阵实际上是一个向量 (1 x 3196)。所以这将使它成为一个 矩阵向量乘法 (不同的 BLAS 内核)。我假设你的答案是矩阵向量乘法。
是的,在矩阵向量乘法方面,CSR 理论上 应该比 COO 更快;这是因为 CSR 格式的存储大小为 O(2nnz + n)
与 O(3nnzs)
并且稀疏矩阵向量乘法在许多情况下受内存限制。
与密集矩阵乘法相比的确切性能差异因问题大小、稀疏模式、数据类型和实现而异。很难马上说出哪个应该更快,因为稀疏存储格式引入了间接性,这可能会导致局部性降低和算术单元的利用率低(例如,不使用矢量化)。
特别是当矩阵和向量的大小非常小以至于几乎所有内容都适合缓存时,我预计性能优势有限。稀疏矩阵结构通常对真正的大矩阵更有用,范围从 10sK x 10sK 到 1B x 1B,使用密集表示甚至无法容纳在主内存中。对于小问题,根据我的经验,与密集格式相比的存储优势通常会被局部性和算术效率的损失所抵消。在某种程度上,这是通过混合存储格式(例如 Block CSR)解决的,它试图兼顾两全其美,并且对某些应用程序非常有用(看起来 tensorflow
不支持这个)。
在tensorflow
中,我假设使用COO格式,因为它对其他操作更有效,例如它支持O(1)
数据结构的更新、插入和删除。在稀疏矩阵向量乘法中牺牲 ~50% 的性能以提高这些操作的性能似乎是合理的。