百度開源其人工智能系統:Warp-CTC

jopen 8年前發布 | 13K 次閱讀 人工智能 開源

近日,百度位于硅谷的人工智能實驗室(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可以用于訓練語音識別中端對端系統,而這項技術在百度硅谷人工智能實驗室中早已開始使用了。

百度開源其人工智能系統:Warp-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倍的范圍之間波動。

GPU 表現

基于單NVIDIA Titan X GPU

百度開源其人工智能系統:Warp-CTC

百度開源其人工智能系統:Warp-CTC

CPU表現

基于兩個Intel E5-2660 v3處理器的雙卡插槽機器,Warp-CTC用了40個線程去充分利用CPU資源,Eesen沒有提供CPU實例,Theano實例沒有進行跨多線程并行計算,Stanford-CTC并未提供跨線程并行計算的機制。

百度開源其人工智能系統:Warp-CTC

百度開源其人工智能系統:Warp-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/ 庫中運行。

Torch安裝

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

來自: http://www.infoq.com/cn/news/2016/01/Baidu-Open-Source-Warp-CTC

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!