TensorFlow tf.sparse_tensor_dense_matmul

Posted

技术标签:

【中文标题】TensorFlow tf.sparse_tensor_dense_matmul【英文标题】: 【发布时间】:2016-08-25 00:43:29 【问题描述】:

我运行了一个小实验来对 tf.sparse_tensor_dense_matmul 操作进行基准测试。不幸的是,我对结果感到惊讶。

我正在运行稀疏矩阵、密集向量乘法和变化

稀疏矩阵的列数(递减) 密集向量的行数(递减) 稀疏矩阵的稀疏度(递增)

在增加每次运行的稀疏度的同时,我减少了列。这意味着非零值 (nnz) 的数量始终保持不变(每行 100 个)。

在测量计算 matml 操作所需的时间时,我希望它保持不变(因为输出大小和 nnz 都不同)。

我看到的是以下内容:

我查看了 C++ 代码,看看是否能找出导致结果的任何原因。不过,考虑到 C++ 代码,我希望每次运行的时间相同。如果我理解正确的代码,它会循环遍历稀疏矩阵的所有 nnz 值 (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L239)。对于每个 nnz 值,它会遍历第二个密集矩阵的所有列(在我的情况下,它只有一列,因为它是一个向量)(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L245)。

我可以想象第二个矩阵/向量的行数影响性能的唯一一点是https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L246,如果它遍历第二个矩阵/向量的所有行洞察“maybe_adjoint_b”函数来获得当前需要的行。

[让我对“maybe_adjoint_b”调用感到不安的是,它被调用时使用了作为行索引传递的变量“k”。不过,我认为“m”是行索引,“k”是稀疏矩阵的列索引。]

问题:为什么我得到不同的 matmul 操作执行时间,即使 nnz 和输出大小始终相同?

【问题讨论】:

【参考方案1】:

我实际上认为这不是 TensorFlow 的问题,而是第一种情况下输入向量的 8MB 输入不适合 L2 内存。在所有其他情况下,向量

【讨论】:

以上是关于TensorFlow tf.sparse_tensor_dense_matmul的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Tensorflow Profiler 在 Tensorflow 2.5 中使用“tensorflow-macos”和“tensorflow-metal”工作

python [test tensorflow] test tensorflow installation #tensorflow

关于tensorflow的显存占用问题

java调用tensorflow训练好的模型

tensorflow新手必看,tensorflow入门教程,tensorflow示例代码

tensorflow 如何在线训练模型