標籤:
未經允許請不要轉載,原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.92 sudo apt-get update3 sudo apt-get --yes --force-yes install gcc-4.8 g++-4.84 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 stop2 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.tgz2 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 aptitude2 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以下的版本,避免做無用功,CMAKEhttps://cmake.org/
1 echo "cmake install"2 rm -rf ./cmake-3.3.23 sudo tar -xvf ./cmake-3.3.2.tar.gz4 cd ./cmake-3.3.2/5 ./configure6 make -j 47 sudo make install8 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.gz4 cd ./mpich-3.2b4/5 ./configure6 make -j 47 sudo make install8 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-compiler2 sudo apt-get --yes --force-yes install libprotobuf-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler libboost-dev3 sudo apt-get --yes --force-yes install libatlas-base-dev libatlas3gf-base4 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 640 1 641 0 64
HOSTFILE
AB
將這兩個設定檔拷貝到不同機器的purine目錄下,這裡要保證每台機器都有purine目錄,並且其可執行檔都是一樣的,此外,由於我們沒有Distributed File System,所以必須保證每台機器上都有資料。
接下來執行如下命令:
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
深度學習多機多卡解決方案-purine