打算記錄兩部分,一部分是關于編譯gpu版本的syntaxnet的內容,另一部分是關于中文句法依存模型訓練方面的內容。本文是GPU版本Syntaxnet環境搭建部分。
關鍵字
Syntaxnet; GPU; Ubuntu16.04; TITANX (Pascal); CUDA8.0
環境
- 操作系統: Ubuntu 16.04
- 顯卡:TITANX (PASCAL)
- CUDA版本: 8.0
- cuDNN版本:5.1
動機
由于CPU版本下的Syntaxnet訓練數據太過于緩慢,所以考慮利用GPU進行訓練(ps: 在syntaxnet中GPU還是有較明顯的加速效果)
目標
目前通用的句法依存工具,比如哈工大的語言云效果也不錯了,但是在使用中還是發現了一些問題。利用syntaxnet工具訓練中文句法依存模型,通過人工加入領域相關的標注預料,期望提高在特定領域下中文句法分析的效果。
操作要點
- 安裝TITAN X的驅動
- 安裝CUDA8.0
- cuDNN 5.1
- 安裝syntaxnet需要依賴
- 編譯gpu版的syntaxnet
- 測試安裝結果
以下針對上述的步驟展開描述
1. 安裝TITAN X(PASCAL)驅動
- 去nvidia網站上下載驅動,選擇對應版本信息。(http://www.nvidia.cn/Download/index.aspx?lang=cn)
- 安裝驅動時,需要關閉ubuntu中的開源驅動 nouveau(可以百度如何在ubuntu中禁用nouveau), 關閉x server(不要問我為啥,因為安裝成功的這次是關閉的), 同時也不安裝OpenGL。對于這三個操作,除了禁用nouveau,其他兩個操作都是可以在安裝驅動時候的選擇的。網上,提供了一種更加簡便的方法,即在運行驅動文件時指定參數。
# 參考: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版本總感覺有些問題。如果已經安裝了TITAN X驅動,那么在安裝的時候不要再次安裝驅動。(下載地址:https://developer.nvidia.com/cuda-downloads)
cuda8.0默認安裝在/usr/local/cuda-8.0, 注意/usr/local/cuda時它的symbolic link, 注意在cuda安裝完成以后需要配置環境變量(其實,在cuda安裝完成以后,打印的消息也有提示需要配置環境變量)
# 執行如下命令
vim ~/.bashrc
# 在~/.bashrc文件中添加如下環境變量
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的安裝方法,進行安裝以及測試,此處感覺坑少。驅動和cuDNN安裝都可以參考官方文檔,在cuDNN下載選項,可以選擇cuDNN-Installation-Guide。
cuDNN7.0linux .tgz安裝方法
如果選擇了*.deb的方法安裝, 選擇安裝樣例,安裝完成以后可以進行測試,如下。
cuDNN7.0linux .deb安裝方法.png
4. 安裝syntaxnet依賴
參考syntaxnet的github網站https://github.com/tensorflow/models/tree/master/syntaxnet
5. 編譯gpu版的syntaxnet
安裝完syntaxnet運行可能需要的依賴以后,接著執行syntaxnet的編譯過程,參考https://github.com/tensorflow/models/issues/248中的utkrist的答案,如下圖
注意,在./configure的執行過程中,如果出現了找不到cuDNN相應的文件,那么使我們在輸入cuDNN的版本號時輸入有問題,比如輸入7和7.0是不一樣的。嚴格安裝utkrist的方法來即可。
ps: 我在安裝的過程中,沒有報錯,但是在進行測試的試試,有一些test無法通過,比如train_parser,有提示顯示數據數據太大的之類的原因,我忽略了。
6. 測試安裝結果
編譯完全通過以后,可以運行syntaxnet自帶的例子,不過我選了手上有的中文預料,進行測試。測試腳本大量參考了這個項目https://github.com/dsindex/syntaxnet(是一個利用syntaxnet訓練韓語句法依存模型的項目)。運行測試腳本后,輸出如下,表面已經使用上了TITAN X顯卡。
此時,在查看nvidia-smi,發現所有顯存都已經被占滿, 但是只有一個GPU在工作。
在同一的數據集上,GPU版本syntaxnet相比于CPU版本syntaxnet, 計算效率只有80 %多的提升,在運行過程中發現,大多數時間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
其他