近日,百度位于硅谷的人工智能实验室(SVAIL)开源了其核心的人工智能系统: Warp-CTC ,该系统是一种在CPU和GPU上快速的CTC的并行实现。这项举动举动对于促进机器学习、人工智能领域的技术研究与发展与有重要意义。Warp-CTC可用于解决比如语音识别这样的,将输入序列映射到输出序列的监督问题。基于Apache 协议,WARP-CTC的C语言库和可选Torch绑定都已托管到GitHub:
https://github.com/baidu-research/warp-ctc
许多现实世界的序列学习任务都要求从嘈杂的、不分段的输入数据中进行标签序列的预测。例如语音识别中,声音信号就被转化成语句或单词。递归神经网络(RNN)对于这样的任务来说是有力的序列训练方法,然而由于RNN需要预分段的训练数据,以及需要后处理才能将输出数据转化成标签序列,因此RNN的性能受到了限制。Warp-CTC使用了Connectionist Temporal Classification的方法,该方法可以直接训练RNN来标记未分段序列,从而规避上述问题。Connectionist Temporal Classification是一种损失函数,用于执行针对序列数据的监督学习,不需要输入数据和标签之间进行对应。举例来说,CTC可以用于训练语音识别中端对端系统,而这项技术在百度硅谷人工智能实验室中早已开始使用了。
上图显示了CTC计算出输出序列“ THE CAT ”的可能性概率,考虑到由于标签可能延伸若干个输入数据的时间步长而导致标签被复制(用图像底部的光谱来表示),上图结果是所有输入序列可能映射到“ THE CAT ”上的比对总和。计算这些概率的总和由于涉及到组合学,显然是十分耗费时间和运算成本的,但是CTC利用动态编程极大地降低了运算成本。因为CTC是可微分的方程,它可用于深度神经网络的标准SGD训练。
百度实验室聚焦于扩展递归神经网络,CTC损失就是一个十分重要的组成部分。为了使整个系统有效运行,百度将整个CTC算法并行化处理。该项目包含了百度的高性能CPU以及CTC损失的CUDA版本,并绑定了Torch。代码库中提供了简单了C语言界面,以便于更好地融合深度学习框架。
这一实例通过执行更快地并行调度,极大地改进了性能,改善了训练的可扩展性。对于聚焦于GPU的训练管道来说,将数据本地化放置于GPU内存中可以用互联带宽增加数据的并行性。
相对于其它公共开放的实例来说,Warp-CTC要高效得多。该项目在编写时也是尽可能做到数值稳定。该算法对于数值十分敏感,甚至在内存消耗的多得多的单精度浮点运算当中,对于Log运算,其数值也是相当稳定。除了机器指令,此外还需要对于多重超越函数的评价。正因为如此,这些CTC实例的仅当使用相同方式计算时才能相互比较。
百度将Warp-CTC与运行在Theano上的CTC实例:Eesen,以及仅适用于Cython CPU 的实例Stanford-CTC进行过比较。百度参照了Theano在32位浮点数字环境下进行Log运算,目的是与其它百度相比较的实例进行匹配。他们还将Stanford-CTC进行了改良,以便于在Log空间下进行运算,但是Stanford-CTC也不支持大于1的minibatch。所以百度需要一个训练管道中更加庞大的内存布局,他们假设随着minibatch尺寸的增加,内存消耗是线性递增的。
百度将与英文和中文端对端模型( end-to-end model )相关的两个问题尺寸的结果分别展示了出来,在这里T代表了输入CTC的时间步长的数目,L代表了每个example的长度,A代表了字母的大小。
在GPU上,每64个example的minibatch的表现都在比Eesen快7倍和快155倍、比Theano实例快46倍和快68倍的范围之间波动。
基于单NVIDIA Titan X GPU
基于两个Intel E5-2660 v3处理器的双卡插槽机器,Warp-CTC用了40个线程去充分利用CPU资源,Eesen没有提供CPU实例,Theano实例没有进行跨多线程并行计算,Stanford-CTC并未提供跨线程并行计算的机制。
接口在 include/ctc.h 里面,它支持CPU或GPU执行。如果运行在CPU上,你可以指定OpenMP并行;或者如果运行在GPU上,你可以指定CUDA流。百度针对该项目进行了设置,确保代码库不会在内部进行内存分配,目的在于避免由内存分配导致的同步和开销(synchronizations and overheads)。
目前,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可以检测到CUDA,并且确保Torch也被检测到,确保 th 在 $PATH 里面。
运行cmake并创建
cmake ../ make
C代码库和Torch共享库会随着测试的可执行文件一同被创建。如果CUDA被检测到,那么 test_gpu 就会被创建; test_cpu 无论何种情况都会被创建。
为了运行该项测试,对于OSX系统来说,百度确保了CUDA库在 LD_LIBRARY_PATH (DYLD_LIBRARY_PATH 。Torch测试必须从 torch_binding/tests/ 库中运行。
luarocks make torch_binding/rocks/warp-ctc-scm-1.rockspec
我们也可以不克隆存储库来进行安装。
luarocks install http://raw.githubusercontent.com/baidu-research/warp-ctc/master/torch_binding/rocks/warp-ctc-scm-1.rockspec