Warp-CTC

https://github.com/baidu-research/warp-ctc/blob/master/README.zh_cn.md

Warp-CTC是一个可以应用在CPU和GPU上高效并行的CTC代码库 (library) 介绍 CTCConnectionist Temporal Classification作为一个损失函数,用于在序列数据上进行监督式学习,不需要对齐输入数据及标签。比如,CTC可以被用来训练端对端的语音识别系统,这正是我们在百度硅谷试验室所使用的方法。 端到端 系统 语音识别

DSCTC

上图展示了CTC计算输出序列(“THE CAT”)概率的过程,是对可能映射成“THE CAT”的所有可能输入序列对齐的和。这一过程考虑了标签会被复制的可能性,因为标签有可能在输入数据的几个时间步(time steps)时被拉伸 (请见上图底部的声谱图)。由于涉及到了组合学,计算所有可能概率的和的成本会很高,但是CTC运用了动态规划以大幅降低计算的复杂性。作为一个可微函数,CTC可以被用于深度神经网络的标准SGD训练。 我们实验室专注于递归神经网络(RNN)的可扩展性 (scalibility), 而CTC损失函数是其中很重要的一部分。为了让我们的系统更有效率,我们并行处理了CTC算法,正如这篇文章中所描述的 。这个项目包含了我们的高性能CPU以及CUDA版本的CTC损失函数, 以及绑定的Torch. 该代码库提供了简单的C接口,易于与深度学习框架整合。

这种执行方式提高了训练的的可扩展性,超过了并行CTC的实现方式。对于以GPU为核心的训练, 我们可用所有的的网络带宽来增加数据的可并行性。 性能 相起其他的开源工具,Warp-CTC的实现方式相对高效,且代码的数值稳定性也较好。因为CTC本身对数值较为敏感,因此即使使用双精度标准计算,也会出现下溢 (underflow)的情况。 具体来说,两个数值趋近于无穷小且相近的数字相除的结果应该大约为1,却因为分母接近为0而变成无穷。 然而,如果直接取对数执行运算,CTC会在数值上较为稳定,虽然会在单精度浮点中以高成本运算为代价。 我们将Warp-CTC和Eesen (建立在Theano上的CTC)以及仅运行Stanford-CTC的Cython CPU进行了比较。为了进行比较,我们对在32位浮点数上运行的Theano进行了基准测试,并且取对数计算。 而Stanford-CTC由于本身不支持对数运算,因此需要被修改。而且它也不支持大于1的迷你批处理 (minibatches), 所以需要在真正的训练流水线上布局非常规内存(我们假设成本与迷你批处理的规模是成正线性关系)。 我们在Deep Speech 2中分别展示了英文及中文端对端模型的结果, 其中T代表输入CTC的时间步数量,L代表每个例子的标签长度,A代表字母数量。 在GPU上,Warp-CTC对64个例子迷你批处理的表现比Eesen快7倍到155倍,比Theano快46倍到68倍

GPU性能

单核NVIDIA Titan X GPU基准测试

T=150, L=40, A=28warp-ctcEesenTheano
N=13.1 ms.5 ms67 ms
N=163.2 ms6 ms94 ms
N=323.2 ms12 ms119 ms
N=643.3 ms24 ms153 ms
N=1283.5 ms49 ms231 ms
T=150, L=20, A=5000warp-ctcEesenTheano
N=17 ms40 ms120 ms
N=169 ms619 ms385 ms
N=3211 ms1238 ms665 ms
N=6416 ms2475 ms1100 ms
N=12823 ms4950 ms2100 ms

CPU性能

在一台有两个Intel E5-2660 v3处理器的双槽机上进行基准测试。Warp-CTC用了40个线程从而最大化了对CPU资源的利用。Eesen没有提供CPU实现方式。我们注意到Theano没有在多线程上进行并行计算。同样,Stanford-CTC没有提供多线程并行计算的机制。

T=150, L=40, A=28warp-ctcStanford-CTCTheano
N=12.6 ms13 ms15 ms
N=163.4 ms208 ms180 ms
N=323.9 ms416 ms375 ms
N=646.6 ms832 ms700 ms
N=12812.2 ms1684 ms1340 ms
T=150, L=20, A=5000warp-ctcStanford-CTCTheano
N=121 ms31 ms850 ms
N=1637 ms496 ms10800 ms
N=3254 ms992 ms22000 ms
N=64101 ms1984 ms42000 ms
N=128184 ms3968 ms86000 ms

接口

接口在include/ctc.h中,它支持在CPU或者GPU上执行。 如果是在CPU上运行,可以指定OpenMP并行计算; 如果是在GPU上运行,请用CUDA stream。 为避免内存分配而导致的竞争及间接成本,我们会确保代码库不会在内部进行内存分配。

编译器

Warp-CTC已经在Ubuntu 14.04以及OSX 10.10进行了测试,现不支持Windows. 首先,请获取代码

git clone https://github.com/baidu-research/warp-ctc.git
cd warp-ctc

创建目录

mkdir build
cd build

假如使用非标准CUDA,请安装 export CUDA_BIN_PATH=/path_to_cuda 以便被CMake检测。且确保Torch被监测到,注意(this in $PATH) 运行cmake, 创建

cmake ../
make

现在,C代码库以及与torch分享的代码库应当和测试可执行文件一同被创建。假如CUDA被检测到,test_gpu则被创建。 测试 为了运行测试,确保CUDA代码库在LD_LIBRARY_PATH (DYLD_LIBRARY_PATH for OSX)中。 Torch测试必须在 torch_binding/tests/ 目录中运行。

Torch安装

luarocks make torch_binding/rocks/warp-ctc-scm-1.rockspec

即使不复制存储库(repository),你也可以安装

luarocks install http://raw.githubusercontent.com/baidu-research/warp-ctc/master/torch_binding/rocks/warp-ctc-scm-1.rockspec

请见Torch CTC教程

限制

CUDA的执行需要至少3.0的计算能力, 所支持的标签长度最大值为639 (时间步数是有限的)。

最后我们欢迎大家提出宝贵的意见及建议以改进我们的开源服务。

在此鸣谢新智元编译 http://chuansong.me/account/AI_era允许我们参考部分译文,http://chuansong.me/n/2168385

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值