我运行了一个小实验来对 tf.sparse_tensor_dense_matmul 操作进行基准测试。不幸的是,我对结果感到惊讶。
我正在运行稀疏矩阵、密集 vector 乘法和变化
- 稀疏矩阵的列数(递减)
- 密集 vector 的行数(递减)
- 稀疏矩阵的稀疏度(递增)
在增加每次运行的稀疏性的同时,我减少了列。这意味着非零值的数量 (nnz) 始终保持不变(每行 100 个)。
在测量计算 matml 操作所需的时间时,我希望它会保持不变(因为输出大小和 nnz 会发生变化)。
我查看了 C++ 代码,看是否能找出导致该结果的任何原因。不过,考虑到 C++ 代码,我希望每次运行的时间相同。如果我对代码的理解正确,它会遍历稀疏矩阵 ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L239) 的所有 nnz 值。对于每个 nnz 值,它循环遍历第二个密集矩阵的所有列(在我的例子中它只有一列,因为它是一个 vector )(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L245)。
我可以想象第二个矩阵/vector 的行数影响性能的唯一一点是 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L246如果它遍历第二个矩阵/vector 的所有行,则洞察“maybe_adjoint_b”函数以到达当前需要的行。
[“maybe_adjoint_b”调用让我感到不安的是,调用它时使用作为行索引传递的变量“k”。不过,我认为“m”是行索引,“k”是稀疏矩阵的列索引。]
问题:为什么 matmul 运算的执行时间不同,即使 nnz 和输出大小始终相同?
最佳答案
我实际上认为这不是 TensorFlow 的问题,而是第一种情况下输入 vector 的 8MB 输入不适合 L2 内存。在所有其他情况下, vector <= 800kb 并适合 L2 内存。
关于python - TensorFlow tf.sparse_tensor_dense_matmul,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39135024/