未經允許請不要轉載,原作者:zhxfl,http://www.cnblogs.com/zhxfl/p/5287644.html
目錄:
一、簡介
二、環境配置
三、運行demo
四、硬件配置建議
五、其他
一、簡介
深度學習多機多卡集群已經成為主流,相對於caffe和mxnet這兩個比較活躍的開源,purine顯得更值得在高校的學生細讀,因為purine的代碼顯得更加短小精悍,作者的C++功力也相當渾厚,其采用的思想也是非常有價值和啟發性的。但是purine已經停止維護,所以其實並不適合企業用戶,但是依然有很大的學術價值,特別適合高校研究軟件體系結構,深度學習,甚至機器學習GPU集群性能優化等方向的學生閱讀。
二、環境配置
2.1、支持C++11
由於purine使用了C++11的標准,所以在ubuntu執行安裝gcc-4.8和g++-4.8的命令,此外,為了避免多個版本沖突的問題,可以把其他版本的都卸載掉,免得要去管理和切換編譯器的版本。這里我選的是gcc-4.8
1 sudo apt-get --yes --force-yes remove gcc-4.6 g++-4.6 gcc-4.7 g++-4.7 gcc-4.9 g++-4.9 2 sudo apt-get update 3 sudo apt-get --yes --force-yes install gcc-4.8 g++-4.8 4 sudo apt-get --yes --force-yes install gfortran
2.2、安裝CUDA和CUDNN
這里我使用的是CUDA-7.0版本,目前知道的是支持的版本有(6.5,7.0,7.5)。需要注意的是,如果安裝了其他版本的CUDA,需要先卸載原來版本的CUDA才能安裝新的,避免沖突。
卸載CUDA的方法如下:
1 sudo perl /usr/local/cuda/bin/uninstall_cuda_7.5.pl
卸載完原來版本的CUDA之后,需要卸載ubuntu自帶的驅動,因為CUDA的安裝包中已經自帶了相應的驅動。
1 sudo apt-get --yes --force-yes remove nvidia*
由於桌面會占用驅動導致CUDA無法安裝顯卡驅動,所以在安裝CUDA之前,需要先關閉桌面,再執行CUDA的安裝包,cuda的安裝包可以從官方網站下載:https://developer.nvidia.com/cuda-downloads
1 sudo /etc/init.d/lightdm stop 2 sudo sh ./cuda_7.5.18_linux.run
接下來需要配置cudnn,cudnn是NVIDIA官方維護的深度學習加速庫,在某種程度上將,這個庫的性能是最快的,所以purine也借用了cudnn來優化性能。cudnn下載前要先注冊和申請,稍微比較麻煩一點,地址如下:https://developer.nvidia.com/cudnn,我使用的是cudnn7.0的版本,直接解壓然后把對應的文件拷貝到cuda的安裝目錄即可。
1 sudo tar -xvf ./cudnn-7.0-linux-x64-v3.0-prod.tgz 2 sudo mv ./cuda/include/* /usr/local/cuda/include/ 3 sudo mv ./cuda/lib64/* /usr/local/cuda/lib64/ 4 sudo rm -rf cuda/
2.3、安裝libuv
libuv是一個異步編程的C++庫,通過libuv可以很容易實現“事件”,“線程同步”,“線程等待”,“線程池”等邏輯。libuv是個開源庫,可以現在源碼下來編譯:https://github.com/libuv/libuv,我使用的是1.x的版本。
先安裝libuv依賴庫:
1 sudo apt-get --yes --force-yes install aptitude 2 sudo apt-get --yes --force-yes install libtool automake autoconf autogen
解壓下載的安裝包進行編譯和安裝:
1 echo "Install libuv" 2 rm -rf ./libuv-1.x.zi 3 sudo unzip libuv-1.x.zip 4 cd ./libuv-1.x/ 5 sudo sh autogen.sh 6 sudo ./configure/ 7 sudo make -j4 8 sudo make install 9 cd ../ 10 rm -rf ./libuv-1.x/
2.4、CMake安裝
CMake是一個跨平台組織編譯依賴的工具,可以下載源碼進行安裝編譯,建議使用3.3.2或者以上的版本,一方面是因為我驗證過了,第二方面是因為CMAKE對CUDA的支持較晚,建議不要使用3.3.2以下的版本,避免做無用功,CMAKE下載地址https://cmake.org/
1 echo "cmake install" 2 rm -rf ./cmake-3.3.2 3 sudo tar -xvf ./cmake-3.3.2.tar.gz 4 cd ./cmake-3.3.2/ 5 ./configure 6 make -j 4 7 sudo make install 8 cd ../ 9 rm -rf ./cmake-3.3.2
2.5、安裝opencv
opencv是一個圖像處理的庫,caffe和purine依賴於這個庫,建議選擇3.0以上的版本,http://opencv.org/downloads.html,這里我使用的是3.0版本,並且使用源碼進行編譯,此外,建議關閉WITH_CUDA 和 WITH_IPP,因為這兩個實際上在purine的項目里面用不上,命令如下:
1 echo "Install opencv" 2 sudo apt-get remove libopencv-dev 3 rm -rf opencv-3.0.0/ 4 sudo unzip ./opencv-3.0.0.zip 5 cd ./opencv-3.0.0/ 6 cmake -D WITH_CUDA=OFF -D WITH_IPP=OFF . 7 make -j 4 8 sudo make install 9 cd ../ 10 rm -rf opencv-3.0.0/
2.6、安裝MPI
MPI是一套並行編程的接口,其主要是依賴於SPMD(單個程序,多個數據流,具體到集群就是每個節點所處理的邏輯都是一樣的,但是數據流不一樣)思想進行編程設計的,由於purine只支持mpich,所以我使用的版本是mpich-3.2b4,地址如下:https://www.mpich.org/2015/07/25/mpich-3-2b4-released/
1 echo "Install mpich" 2 rm -rf ./mpich-3.2b4/ 3 tar -xvf ./mpich-3.2b4.tar.gz 4 cd ./mpich-3.2b4/ 5 ./configure 6 make -j 4 7 sudo make install 8 cd ../ 9 rm -rf ./mpich-3.2b4/
2.7、其他依賴:
1 #sudo apt-get --yes --force-yes install libprotobuf-dev libleveldb-dev libsnappy-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler 2 sudo apt-get --yes --force-yes install libprotobuf-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler libboost-dev 3 sudo apt-get --yes --force-yes install libatlas-base-dev libatlas3gf-base 4 sudo apt-get install libatlas-base-dev libatlas3gf-base
三、運行demo
3.1 編譯
先從git上把代碼拉下來,原作者的官網在https://github.com/purine/purine2,但是原來git上的工程不能編譯通過,其發布的CMakeList.txt有一些bug導致無法編譯。也可以使用我fork的分支https://github.com/zhxfl/purine2,我的分支將cmakelist.txt做了修改保證其能正常編譯。我后續還在上面做了不少改進的嘗試,不過都是增量維護的,並沒有曲解作者的初衷,所以可以放心使用我的分支代碼。
1 git clone https://github.com/zhxfl/purine2
代碼下載下來之后,使用下面命令進行編譯,如果這里"cmake ."命令沒有順利通過,可以聯系我"zhxfl##mail.ustc.edu.cn",將“##”替換為@,可能是我前面描述少了導致某些依賴出了問題。
1 cd purine2/ 2 cmake . 3 make -j2
3.2 demo數據庫制作
這里選用cifar-10數據集,運行
1 ~/tmp/purine2/data/cifar-10/get_cifar10.sh
到purine根目錄下執行cifar10_data生成數據庫,代碼如下,這里強調一下,因為代碼利用的是相對目錄,所以必須在purine2/目錄下執行,執行完畢之后會在purine2/data/cifar-10目錄下會生成兩個數據庫文件cifar-10-train-lmdb和cifar-10-test-lmdb兩個目錄。
./test/cifar10_data
3.3 單機多卡
運行demo之前,需要先配置兩個文件,parallel_config文件中加入
0 0 64
0 1 64
這三個參數分別表示(機器編號,顯卡標號,迭代對應的batch_size)
接下來要配置一下HOSTFILE文件,填入本機的IP地址,一個地址一行,接下來使用如下命令啟動purine運行,該命令表示啟動兩個進程,
mpirun -n 1 -hostfile HOSTFILE ./test/nin_cifar10
3.4 多機多卡
1、在進行多機多卡之前,在不同機器之間配置一下ssh無密碼認證。
2、確認不同機器之間已經可以無密碼認證之后,先配置一下每台機器上的hosts文件,給每個機器取一個名字,比如我們有兩個節點,分別為A,B,其中A上面有兩塊顯卡。那么parallel_config文件配置如下:
0 0 64 0 1 64 1 0 64
HOSTFILE
A
B
將這兩個配置文件拷貝到不同機器的purine目錄下,這里要保證每台機器都有purine目錄,並且其可執行文件都是一樣的,此外,由於我們沒有分布式文件系統,所以必須保證每台機器上都有數據。
接下來執行如下命令:
mpirun -n 2 -hostfile HOSTFILE ./test/nin_cifar10
此外,所有log都保存在系統/tmp/目錄下
四、硬件配置建議
如果是用於學術研究而不是商業化,推薦一個經濟實惠的硬件方案:
1、顯卡:titianx顯卡2個,gtx98ti也可以,
2、主板可以選可以插幾塊顯卡的,一般也就幾千塊錢,如“技嘉LGA2011-3 GA-X99”
機箱和電源什么讓供應商配就行了,整個解決方案可以控制在2,3w之間。
五、其他
如果你不是研究集群性能的,只是有做做實驗,甚至希望在windows上進行開發和研究,
可以考慮我們實驗室的其他開源CUDA-CNN和CUDA-MCDNN,我們大部分修改算法的嘗試都是在這兩個項目上進行的。
如果有其他問題,可以聯系我:zhxfl##mail.ustc.edu.cn
