“exp”的计算成本如何?

时间:2014-12-03 19:45:31

标签: gpu cpu speech-recognition computer-architecture exp

我目前正在听一个关于自动语音识别(ASR)的讲座。最后一个讲座是关于矢量量化(VQ)和k最近邻(kNN)以及二叉树和高斯混合模型(GMM)。

根据讲师的说法,VQ用于通过计算GMM的近似值来加速GMM的评估。这是通过在GMM中找到具有最高值的高斯并查看该向量的值来完成的(来自先前构建的字典,存储为二叉树)。每个GMM有大约42个高斯。根据讲师的说法,这应该加快计算速度,因为电子函数(exp,自然指数函数)的计算在计算上是昂贵的。

我很好奇,如果这仍然是真的,搜索Python实现并找到this answer,这解释了exp是由硬件计算的。

今天的CPU(和GPU)很复杂,我对它们的了解非常有限。 exp比例如exp贵得多,这可能仍然是真的。浮点数,加法或乘法的比较。

问题

  • 与浮点比较,加法,乘法和类似的基本命令相比,#!/usr/bin/env python import math import time import random # Experiment settings numbers = 5000000 seed = 0 repetitions = 10 # Experiment random.seed(seed) values = [random.uniform(-5, 5) for _ in range(numbers)] v2 = [random.uniform(-5, 5) for _ in range(numbers)] # Exp for i in range(repetitions): t0 = time.time() ret = [math.exp(x) for x in values] t1 = time.time() time_delta = t1 - t0 print("Exp time: %0.4fs (%0.4f per second)" % (time_delta, numbers/time_delta)) # Comparison for i in range(repetitions): t0 = time.time() ret = [x+y for x, y in zip(values, v2)] t1 = time.time() time_delta = t1 - t0 print("x+y time: %0.4fs (%0.4f per second)" % (time_delta, numbers/time_delta)) 有多贵?
  • 我最终理解为什么VQ在ASR中完成了?

实验评估

我尝试通过开始实验来获得结果。但是我很难消除使我的数字错误的其他影响(例如缓存,变量查找时间,随机数生成器的时间......)。

目前,我有

zip

但我猜Exp time: 1.3640s (3665573.5997 per second) Exp time: 1.7404s (2872978.6149 per second) Exp time: 1.5441s (3238178.6480 per second) Exp time: 1.5161s (3297876.5227 per second) Exp time: 1.9912s (2511009.5658 per second) Exp time: 1.3086s (3820818.9478 per second) Exp time: 1.4770s (3385254.5642 per second) Exp time: 1.5179s (3294040.1828 per second) Exp time: 1.3198s (3788392.1744 per second) Exp time: 1.5752s (3174296.9903 per second) x+y time: 9.1045s (549179.7651 per second) x+y time: 2.2017s (2270981.5582 per second) x+y time: 2.0781s (2406097.0233 per second) x+y time: 2.1386s (2338005.6240 per second) x+y time: 1.9963s (2504681.1570 per second) x+y time: 2.1617s (2313042.3523 per second) x+y time: 2.3166s (2158293.4313 per second) x+y time: 2.2966s (2177155.9497 per second) x+y time: 2.2939s (2179730.8867 per second) x+y time: 2.3094s (2165055.9488 per second) 使这个失败,因为结果是:

{{1}}

1 个答案:

答案 0 :(得分:1)

  

根据讲师的说法,VQ用于通过计算GMM的近似值来加速GMM的评估。这是通过在GMM中找到具有最高值的高斯并查看该向量的值来完成的(来自先前构建的字典,存储为二叉树)。每个GMM有大约42个高斯。

这是正确的描述。您可以在下面的论文中找到最佳高斯计算的有趣描述:

George Saon,Daniel Povey& Geoffrey Zweig,"极快的LVCSR解码器解剖," Interspeech 2005。 http://www.danielpovey.com/files/eurospeech05_george_decoder.pdf

似然计算部分

  

根据讲师的说法,这应该加快计算速度,因为电子函数(exp,自然指数函数)的计算在计算上是昂贵的。

在这部分你可能误解了讲师。 exp不是很重要的问题,由于其他原因,高斯计算是昂贵的:每个帧都有几千个高斯得分,每个帧有40个浮点数,每个都有几十个成分。由于您需要提供和存储的内存量,处理所有这些数据的成本很高。高斯选择有助于减少高斯几倍的数量,从而加快计算速度。

GPU是解决这个问题的另一个解决方案,通过将得分移动到GPU可以显着加快评分,但是,HMM搜索存在一个无法轻松并行化的问题。这是解码的另一个重要部分,即使你将得分降低到零,由于搜索,解码仍然会很慢。

  

到期时间:1.5752s(每秒3174296.9903)   x + y时间:9.1045s(每秒549179.7651)

这不应该是一个有意义的比较,你在这里忽略了很多东西,比如Python zip调用的成本(izip更好)。这样您就可以轻松演示任何结果。