http://www.cnblogs.com/chenbjin/p/5021314.html?utm_source=tuicool&utm_medium=referral
之前學習了CNN的相關知識,提到Yoon Kim(2014)的論文,利用CNN進行文本分類,雖然該CNN網絡結構簡單效果可觀,但論文沒有給出具體訓練時間,這便值得進一步探讨。

Yoon Kim代碼:https://github.com/yoonkim/CNN_sentence
利用作者提供的源碼進行學習,在本人機子上訓練時,做一次CV的平均訓練時間如下,縱坐标為min/CV(供參考):
機子配置:Intel(R) Core(TM) i3-4150 CPU @ 3.50GHz, 32G,x64
顯然,訓練非常慢慢慢!!!在CPU上訓練,做10次CV,得10多個小時啊,朋友發郵件和Yoon Kim求證過,他說确實很慢慢慢,難怪論文中沒有出現訓練時間資料~.~
考慮改進的話,要麼就是多線程作并行,卷積層可做并行,但代碼不容易寫啊:(,是以我考慮GPU加速。
流程:1、安裝NVIDIA驅動;2、安裝配置CUDA;3、修改程式用GPU跑;
1、安裝NVIDA驅動
(0)看看你有沒有符合的顯示卡:lspci | grep -i nvidia,參考教程
(1)下載下傳對應顯示卡的nVidia驅動:http://www.nvidia.com/Download/index.aspx?lang=en-us
本人機子GPU:GeForce GTX 660 Ti,對應下載下傳的驅動為NVIDIA-Linux-x86_64-352.63.run
(2)添加可執行權限: sudo chmod +x NVIDIA-Linux-x86_64-352.63.run
(3)關閉X-window:sudo service lightdm stop,然後切換到tty1:Ctrl+Alt+F1
(4)安裝驅動:sudo ./NVIDIA-Linux-x86_64-352.63.run。按照其中提示進行安裝,可能要設定compat32-libdir
(5)重新開機X-window:sudo service lightdm start.
(6)驗證驅動安裝是否成功:cat /proc/driver/nvidia/version
2、安裝配置CUDA
(1)安裝教程:http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/index.html#ubuntu-installation
(2)下載下傳cuda-toolkit:https://developer.nvidia.com/cuda-downloads。選擇和你配置符合的cuda下載下傳:cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
(3)注意不同系統的安裝指令不同,下面是ubuntu14.04安裝指令。有什麼問題看上面的教程可以搞定。
sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
sudo apt-get update
sudo apt-get install cuda
(4)驗證toolkit是否成功:nvcc -V
(5)配置路徑:vim .bashrc
PATH=$PATH:/usr/local/cuda-7.0/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda7.0/lib64
export PATH
export LD_LIBRARY_PATH
3、修改程式用GPU跑
根據theano官方文檔:http://deeplearning.net/software/theano/tutorial/using_gpu.html
可以先用下列代碼測試CUDA配置是否正确,能否正常使用GPU。
View Code
将上述代碼儲存為check_GPU.py,使用以下指令進行測試,根據測試結果可知gpu能否正常使用,若出錯有可能是上面路徑配置問題。
$ THEANO_FLAGS=mode=FAST_RUN,device=cpu,floatX=float32 python check1.py
[Elemwise{exp,no_inplace}(<TensorType(float32, vector)>)]
Looping 1000 times took 3.06635117531 seconds
Result is [ 1.23178029 1.61879337 1.52278066 ..., 2.20771813 2.29967761
1.62323284]
Used the cpu
$ THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python check1.py
Using gpu device 0: GeForce GTX 580
[GpuElemwise{exp,no_inplace}(<CudaNdarrayType(float32, vector)>), HostFromGpu(GpuElemwise{exp,no_inplace}.0)]
Looping 1000 times took 0.638810873032 seconds
Result is [ 1.23178029 1.61879349 1.52278066 ..., 2.20771813 2.29967761
1.62323296]
Used the gpu
由于目前Nvidia GPU主要是針對float32位浮點數計算進行優化加速,是以需要将代碼中的資料及變量類型置成float32。
具體對代碼做如下更改:
(1)process_data.py
line 55, W = np.zeros(shape=(vocab_size+1, k), dtype='float32')
line 56, W[0] = np.zeros(k, dtype='float32')
修改後運作指令,獲得每個word對應的詞向量(float32)。
python process_data.py GoogleNews-vectors-negative300.bin
(2)conv_net_sentence.py
添加allow_input_downcast=True,程式中間運算過程若産生float64,會cast到float32。
lin 82, set_zero = theano.function([zero_vec_tensor], updates=[(Words, T.set_subtensor(Words[0,:], zero_vec_tensor))], allow_input_downcast=True)
lin131, val_model = theano.function([index], classifier.errors(y),
givens={
x: val_set_x[index * batch_size: (index + 1) * batch_size],
y: val_set_y[index * batch_size: (index + 1) * batch_size]}, allow_input_downcast=True)
lin 137, test_model = theano.function([index], classifier.errors(y),
givens={
x: train_set_x[index * batch_size: (index + 1) * batch_size],
y: train_set_y[index * batch_size: (index + 1) * batch_size]}, allow_input_downcast=True)
lin 141, train_model = theano.function([index], cost, updates=grad_updates,
givens={
x: train_set_x[indexbatch_size:(index+1)batch_size],
y: train_set_y[indexbatch_size:(index+1)batch_size]}, allow_input_downcast=True)
lin 155, test_model_all = theano.function([x,y], test_error, allow_input_downcast=True)
(3)運作程式
THEANO_FLAGS=mode=FAST_RUN,device=gpu0,floatX=float32,warn_float64=raise python conv_net_sentence.py -static -word2vec
THEANO_FLAGS=mode=FAST_RUN,device=gpu0,floatX=float32,warn_float64=raise python conv_net_sentence.py -nonstatic -word2vec
THEANO_FLAGS=mode=FAST_RUN,device=gpu0,floatX=float32,warn_float64=raise python conv_net_sentence.py -nonstatic -rand
(4)結果驚人,訓練時間提升了20x。
第一次跑gpu,以上過程,若有疏忽,還請多多指導。
Reference:
1、有關theano配置:http://deeplearning.net/software/theano/library/config.html
2、Ubuntu安裝Theano+CUDA:http://www.linuxidc.com/Linux/2014-10/107503.htm