如何使用tf.matmul执行有效的稀疏矩阵乘法?

时间:2017-07-01 09:20:09

标签: tensorflow sparse-matrix

我正在尝试使用tf.matmul()执行稀疏矩阵乘法。

然而,推理速度比密集矩阵乘法慢得多。

根据tf.sparse_matmul()中的描述:

  • 在一个平台上使用此与密集矩阵相乘的盈亏平衡是稀疏矩阵中的30%零值。

因此,我使用7/8零值制作稀疏矩阵。

这是我的代码:

import tensorflow as tf
import numpy as np
import time
a = tf.Variable(np.arange(1000).reshape(250,4) ,dtype=tf.float32) #dense matrix
b = tf.Variable(np.array([0,0,0,0,0,0,0,1],dtype=np.float32).reshape(4,2),dtype=tf.float32) # sparse matrix
c = tf.matmul(a,b,b_is_sparse=True) # do the sparse matrix multiplication

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    num_iteration = 5000
    num_burnin = 50
    duration = 0

    for i in range(num_iteration+num_burnin):
        startTime  = time.time()
        result = sess.run(c)
        endTime = time.time()
        if i > num_burnin :
            duration+= endTime-startTime

   print(" Average Inference Time = %.3f  ms"%(duration*1000/num_iteration))

我设置“b_is_sparse = True”来进行稀疏矩阵乘法,我的GeForce GTX 960M需要大约0.380 ms。

但是,如果我设置“b_is_sparse = False”来进行密集矩阵乘法,则大约需要0.280 ms。

我曾尝试使用tf.sparse_tensor_dense_matmul和tf.embedding_lookup_sparse来执行稀疏矩阵乘法,但推理速度仍然比密集矩阵乘法慢。

我的代码或其他方法是否存在执行稀疏矩阵乘法的错误?

任何建议都将不胜感激!!

1 个答案:

答案 0 :(得分:4)

相对表现取决于很多因素。稀疏乘法可以比使用密集矩阵的密集乘法更快(希望如此),但你说它也可以更慢。

首先,它取决于矩阵的大小。

这是两个方阵的乘法结果,一个是随机的,一个用零填充,并记录了密集和备用乘法的计算时间。

enter image description here

正如您所看到的,即使矩阵完全为零,对于较小的矩阵大小,稀疏乘法也可能比密集乘法慢 - 事实上,对于120x120的矩阵,稀疏乘法几乎慢了三倍。在我的计算机上进行的这个实验中,稀疏矩阵乘法开始接管大约700x700的大小,最终加快约2倍。当然YMMV取决于您的配置。