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

Col*_*869 3 sparse-matrix tensorflow

我正在尝试使用 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))
Run Code Online (Sandbox Code Playgroud)

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

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

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

我的代码或执行稀疏矩阵乘法的其他方式有问题吗?

任何建议将不胜感激!

P-G*_*-Gn 5

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

一方面,这取决于矩阵的大小。

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

在此处输入图片说明

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