Python 点积和矩阵乘法的Tensorflow
我目前正在尝试用Tensorflow编写一些线性代数代码,并将其性能与numpy实现进行比较。对于重复矩阵向量乘法或重复矩阵矩阵乘法,Tensorflow代码的速度要慢几个数量级,这是一个难题。我目前正在测试Tensorflow,没有GPU,只使用CPU。我的意图是在Tensorflow中实现我的项目,这样它在CPU和GPU上都能快速运行,这取决于用户拥有什么。矩阵大小可以在大约10x10到非常大的矩阵之间变化。当使用tensorflow拥有一个公共代码库时,我愿意接受小矩阵的性能损失,只要它不像下面那样剧烈 以下是IPython提供的两个计时示例:Python 点积和矩阵乘法的Tensorflow,python,performance,numpy,tensorflow,Python,Performance,Numpy,Tensorflow,我目前正在尝试用Tensorflow编写一些线性代数代码,并将其性能与numpy实现进行比较。对于重复矩阵向量乘法或重复矩阵矩阵乘法,Tensorflow代码的速度要慢几个数量级,这是一个难题。我目前正在测试Tensorflow,没有GPU,只使用CPU。我的意图是在Tensorflow中实现我的项目,这样它在CPU和GPU上都能快速运行,这取决于用户拥有什么。矩阵大小可以在大约10x10到非常大的矩阵之间变化。当使用tensorflow拥有一个公共代码库时,我愿意接受小矩阵的性能损失,只要它不
%%timeit
dim=10000
m1=np.随机均匀(尺寸)
m2=np.随机均匀(尺寸,尺寸)
tmp=np.dot(m2,m1)
对于范围(200)内的i:
tmp=np.dot(m2,tmp)
这需要151µs±6.56µs
现在使用Tensorflow:
%%timeit
a1=tf.随机.均匀([尺寸,尺寸])
a2=tf.随机.均匀([dim])
tmp=tf.tensordot(a1,a2,1)
对于范围(200)内的i:
tmp=tf.tensordot(a1,tmp,1)
仅需1.07 s±128 ms。然后,评估再次需要7.5 s
sess=tf.Session()
使用sess.as_default():
out=tmp.eval()
我在使用matmul时也观察到了同样的趋势
非常感谢您的任何提示
Peter您的代码中有几个问题
np.random.uniform(dim)
和np.random.uniform(dim,dim)
返回两个浮点数,而不是两个矩阵。您可能希望使用np.random.rand(dim)
和np.random.rand(dim,dim)
np.dot
和sess.run()
tf.matmul
和np.dot
的基准代码,它改编自
将tensorflow导入为tf
将numpy作为np导入
导入操作系统
导入时间
n=10000
dtype=tf.32
使用tf.device(“/cpu:0”):
matrix1=tf.Variable(tf.ones((n,n),dtype=dtype))
matrix2=tf.Variable(tf.ones((n,n),dtype=dtype))
product=tf.matmul(matrix1,matrix2)
#避免优化冗余节点
config=tf.ConfigProto(graph\u options=tf.GraphOptions(optimizer\u options=tf.Optimizations(opt\u level=tf.Optimizations.L0)))
sess=tf.Session(config=config)
sess.run(tf.global\u variables\u initializer())
iters=10
#预热
sess.run(product.op)
开始=时间。时间()
对于范围内的i(iters):
sess.run(product.op)
end=time.time()
已用=(结束-开始)
打印('tensorflow cpu:%d x%d个matmul占用了%.2f秒“%(n,n,已用/iters))
###########努比试验###########
np_m1=np.one((n,n),dtype=np.float32)
np_m2=np.one((n,n),dtype=np.float32)
开始=时间。时间()
对于范围内的i(iters):
np.dot(np_m1,np_m2)
end=time.time()
已用=(结束-开始)
打印('numpy:%d x%d个matmul占用:%.2f秒'%(n,n,已用/iters))
在我的机器中,输出是
#tensorflow cpu:10000 x 10000 matmul耗时:2.79秒
#numpy:10000 x 10000 matmul耗时:4.36秒
非常感谢您的回复。我完全可以看到我的实现中的缺陷。但是,我不认为您的比较是一个公平的比较,因为所有的图形定义的东西和初始化不是基准的一部分。如果我将它们包括在基准中,那么numpy要小得多。这也适用于增加矩阵维数。特别是在这里,会话初始化可以轻松地占用实际计算时间的10倍(对于增加矩阵维数来说不是固定的)。此外,当包含重复矩阵mult时。定义如上所述,图形构建要慢得多。…。@P.Egli实际上,与实际训练神经网络时的训练时间相比,创建图形的时间可以忽略不计。另外,由于您比较的是矩阵乘法,因此图形构建不被视为矩阵计算的一部分。感谢您的澄清。是的,也许我应该说我试着加速一些线性代数计算,它们只运行一次。这与训练神经网络完全不同。我的意图是为我建模的某个系统加速大量矩阵乘法运算。因此,我对“一次性拍摄”感兴趣。我很高兴,如果您有任何想法如何加速它们…。@P.Egli也许您可以检查包含GEMM函数的blas库。他们以某种方式优化了矩阵乘法。希望您能获得一些见解。:)