打算記錄兩部分,一部分是關于編譯gpu版本的syntaxnet的內(nèi)容,另一部分是關于中文句法依存模型訓練方面的內(nèi)容。本文是GPU版本Syntaxnet環(huán)境搭建部分。
關鍵字
Syntaxnet; GPU; Ubuntu16.04; TITANX (Pascal); CUDA8.0
環(huán)境
- 操作系統(tǒng): Ubuntu 16.04
- 顯卡:TITANX (PASCAL)
- CUDA版本: 8.0
- cuDNN版本:5.1
動機
由于CPU版本下的Syntaxnet訓練數(shù)據(jù)太過于緩慢,所以考慮利用GPU進行訓練(ps: 在syntaxnet中GPU還是有較明顯的加速效果)
目標
目前通用的句法依存工具,比如哈工大的語言云效果也不錯了,但是在使用中還是發(fā)現(xiàn)了一些問題。利用syntaxnet工具訓練中文句法依存模型,通過人工加入領域相關的標注預料,期望提高在特定領域下中文句法分析的效果。
操作要點
- 安裝TITAN X的驅(qū)動
- 安裝CUDA8.0
- cuDNN 5.1
- 安裝syntaxnet需要依賴
- 編譯gpu版的syntaxnet
- 測試安裝結果
以下針對上述的步驟展開描述
1. 安裝TITAN X(PASCAL)驅(qū)動
- 去nvidia網(wǎng)站上下載驅(qū)動,選擇對應版本信息。(http://www.nvidia.cn/Download/index.aspx?lang=cn)

- 安裝驅(qū)動時,需要關閉ubuntu中的開源驅(qū)動 nouveau(可以百度如何在ubuntu中禁用nouveau), 關閉x server(不要問我為啥,因為安裝成功的這次是關閉的), 同時也不安裝OpenGL。對于這三個操作,除了禁用nouveau,其他兩個操作都是可以在安裝驅(qū)動時候的選擇的。網(wǎng)上,提供了一種更加簡便的方法,即在運行驅(qū)動文件時指定參數(shù)。
# 參考:http://blog.csdn.net/chaihuimin/article/details/71006654?locationNum=2&fps=1
sudo ./NVIDIA_xxxx.run -no-x-check -no-nouveau-check -no-opengl-files
2. 安裝CUDA8.0
下載指定版本的cuda 8.0,然后按照圖中的Installation instructions進行安裝。建議選擇*.run版本的,.deb版本總感覺有些問題。如果已經(jīng)安裝了TITAN X驅(qū)動,那么在安裝的時候不要再次安裝驅(qū)動。(下載地址:https://developer.nvidia.com/cuda-downloads)

cuda8.0默認安裝在/usr/local/cuda-8.0, 注意/usr/local/cuda時它的symbolic link, 注意在cuda安裝完成以后需要配置環(huán)境變量(其實,在cuda安裝完成以后,打印的消息也有提示需要配置環(huán)境變量)
# 執(zhí)行如下命令
vim ~/.bashrc
# 在~/.bashrc文件中添加如下環(huán)境變量
export CUDA_HOME=/usr/local/cuda-8.0
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8
3. 安裝cuDNN
- 此處我選擇的是cuDNN5.1 for CUDA 8.0的版本, 下載cuDNN的時候需要注冊NVIDIA的賬號,注冊完成以后既可以下載(https://developer.nvidia.com/rdp/cudnn-download),在下載時既可以下載.deb版本,也可以下載.tgz版本。此處的安裝方法,可以參考官方文檔。不過5.1的文檔寫的比較復雜,我當時參考了7.0的安裝方法,進行安裝以及測試,此處感覺坑少。驅(qū)動和cuDNN安裝都可以參考官方文檔,在cuDNN下載選項,可以選擇cuDNN-Installation-Guide。
cuDNN7.0linux .tgz安裝方法
如果選擇了*.deb的方法安裝, 選擇安裝樣例,安裝完成以后可以進行測試,如下。
cuDNN7.0linux .deb安裝方法.png
4. 安裝syntaxnet依賴
參考syntaxnet的github網(wǎng)站https://github.com/tensorflow/models/tree/master/syntaxnet

5. 編譯gpu版的syntaxnet
安裝完syntaxnet運行可能需要的依賴以后,接著執(zhí)行syntaxnet的編譯過程,參考https://github.com/tensorflow/models/issues/248中的utkrist的答案,如下圖

注意,在./configure的執(zhí)行過程中,如果出現(xiàn)了找不到cuDNN相應的文件,那么使我們在輸入cuDNN的版本號時輸入有問題,比如輸入7和7.0是不一樣的。嚴格安裝utkrist的方法來即可。
ps: 我在安裝的過程中,沒有報錯,但是在進行測試的試試,有一些test無法通過,比如train_parser,有提示顯示數(shù)據(jù)數(shù)據(jù)太大的之類的原因,我忽略了。
6. 測試安裝結果
編譯完全通過以后,可以運行syntaxnet自帶的例子,不過我選了手上有的中文預料,進行測試。測試腳本大量參考了這個項目https://github.com/dsindex/syntaxnet(是一個利用syntaxnet訓練韓語句法依存模型的項目)。運行測試腳本后,輸出如下,表面已經(jīng)使用上了TITAN X顯卡。

此時,在查看nvidia-smi,發(fā)現(xiàn)所有顯存都已經(jīng)被占滿, 但是只有一個GPU在工作。

在同一的數(shù)據(jù)集上,GPU版本syntaxnet相比于CPU版本syntaxnet, 計算效率只有80 %多的提升,在運行過程中發(fā)現(xiàn),大多數(shù)時間GPU的使用效率都是非常非常低的,3%左右。這個問題,希望有小伙伴能夠指導一下。
參考文獻
https://github.com/dsindex/syntaxnet
https://github.com/tensorflow/models/tree/master/syntaxnet
https://github.com/tensorflow/models/issues/248
https://github.com/tensorflow/serving/issues/327
其他

