caffe安装_Ubuntu 16.04 下 Theano 安装,及配置多 GPU使用(Multiple GPUs)
寫在前面
本文主要是針對 theano 的多 GPU 使用問題,做一個記錄與總結(jié)。 在此之前我沒有接觸過關(guān)于 Theano 框架的內(nèi)容,也是因為某些原因需要研究一下 theano 框架是否可以使用 GPU,如果可以,如何配置使用多 GPU。下面的內(nèi)容寫的很詳細(xì),甚至有點冗長,為了詳細(xì)說明,貼了很多中間的步驟圖,可以說很詳細(xì)了,無非也是記錄自己在一個之前沒有任何接觸的情況下,遇到了哪些問題,包括遇到這些問題我是如何處理和解決的。還好最后問題都一一解決了,不然也不會有這篇文章了 :( ,剛開始接觸和配置的前一個小時內(nèi),只配置好了Theano 單 GPU,當(dāng)時查多 GPU 問題,沒有什么答案,我甚至也給這個框架下了定義,它只能指定一塊 GPU 訓(xùn)練,但是一步一步去查找,最后柳暗花明了。有些問題還是不能輕易放棄!可能不是沒有方法,只是我們了解的還不夠,希望給看到這篇文章的朋友,提供一些經(jīng)驗(當(dāng)然了,對大牛肯定是很平常的事情,大牛請自動忽略)。重要的不是內(nèi)容,而是解決問題的思路和方法。
內(nèi)容概括
因為文章很長,寫的又很詳細(xì),看完需要一定的耐心和時間,這里先給出一個內(nèi)容概括:
本文是在 Ubuntu 16.04 + CUDA9.0 + CUDNN 7 + Anaconda 3(python 3.6) 下進行的,配置了 Platoon 和 Synkhronos 兩個數(shù)據(jù)并行庫來使用多 GPU:
- Synkhronos 只支持 Python3,并且不支持 Windows 平臺,有提供官方學(xué)習(xí)文檔,但是需要額外的一些經(jīng)歷去學(xué)習(xí)如何使用
- Platoon 并未看見有什么限制,而且被 theano 官方文檔所推薦,并且theano 官方文檔給出了一些使用例程
就安裝過程中的測試樣例來看, Platoon 的學(xué)習(xí)成本更低一些(即可以更快上手使用),Synkhronos 需要一定時間摸索它的使用方法,所以推薦安裝 Platoon.
正文
Theano 框架在2017年9月29日,Yoshua Bengio 教授宣布將不再更新。稍微使用過現(xiàn)在比較流行的框架,例如: Pytorch, Keras, Tensorflow 等,在框架環(huán)境安裝完成以后都可以通過在訓(xùn)練時直接設(shè)置一些語句實現(xiàn)多 GPU 的使用,只要環(huán)境配置好無需額外安裝其他東西,但是對于一些相對來說老牌的框架步驟就會復(fù)雜一些,例如本文的主角 Theano ,以及Caffe, Caffe 需要在配置前安裝 NCCL,然后在編譯Caffe 的時候選擇 USE_NCCL 選項,才可以在后面的使用中使用多GPU來訓(xùn)練,theano 也需要做一些準(zhǔn)備工作。
下面的配置和安裝均是在: Ubuntu 16.04 + CUDA9.0 + CUDNN 7 + Anaconda 3(python 3.6) 下進行的。
1. 安裝 Theano
這里不多提,官方文檔也給出了安裝方法:
這里直接:
conda install theano pygpu默默根據(jù)步驟下載完即可。
下載完,有的會在 python 環(huán)境里直接 import theano ,有的會在程序運行時,報出含有下面關(guān)鍵詞的錯誤:
Can not use cuDNN on context None: cannot compile with cuDNN. xxxxxx
包括另一個錯誤:
ERROR (theano.gpuarray): Could not initialize pygpu, support disabled
所以我們還應(yīng)該完成一些配置工作,首先新建一個 .theanorc 配置文件:
sudo gedit ~/.theanorc在其中輸入:
這里根據(jù)自己的 cuda 版本替換一下對應(yīng)的位置就可以了
到這里我們的 theano 環(huán)境基本搭建完成!
2. Theano 的多 GPU 使用問題
下面主要說明一下,查找 theano 如何使用多 GPU 相關(guān)資料的過程,以及一些第三方庫配置過程中可能出現(xiàn)的問題。
前面提到的官方文檔,其實給出了一些答案。
.
可以看到,device=cuda 我們在 .theanorc 文件中已經(jīng)配置好了,在使用中通過添加 THEANO_FLAGS='device=cuda{0,1,...}' 便可以指定某一塊GPU,習(xí)慣了 Caffe 里面 -gpu=0,1,2,3,以及Pytorch里面 CUDA_VISIBLE_DEVICES='0,1,2,3' 設(shè)置多GPU 使用的同學(xué)一定躍躍欲試,THEANO_FLAGS='device=cuda{0,1,2,3}'就可以同樣使用多 GPU 了? No,No,No, 注意這里 {0,1,...} 的意思是在這些數(shù)字里面選一個,cuda0,cuda1,cuda2 分別代表不同的GPU,如果想上面那種寫法,這里我有4塊 GPU, THEANO_FLAGS='device=cuda{0,1,2,3}' 會報錯說不認(rèn)識 '{0' 這個字符的。 然后我轉(zhuǎn)身就去尋求網(wǎng)絡(luò)上的幫助了,百度里基本都只是在安裝及配置 theano 使用單GPU 時的一些問題及回答,該做的都做了,單 GPU 已經(jīng)可以跑通官方文檔給的小例程了,多GPU 無論怎么改還是不行。
那怎么辦呢?
我點進 Github 里 theano 項目的 issues 輸入關(guān)鍵詞: multi GPU ,然后搜索。
在問題的第一頁,目光就鎖定在了上面框出的兩個問題。
題目為: MultiGPU: ValueError: Could not infer context from inputs #6655 的問題,點進去一看,問題其實沒人解決,里面給了個鏈接, google 的,沒翻墻打不開。
最終的解決思路來自于:已經(jīng)被關(guān)閉的問題 theano-0.10.0beta2 even simple funcs crash in multi-GPU setup after recompile #6422,也就是第二個紅框。
點開看完問題描述,下面有一個人的回復(fù)很關(guān)鍵:
.
從上面的回答可以看出,theano 框架不能直接支持多 GPU 訓(xùn)練,但是我們可以借助一些基于 theano 的第三方的庫來實現(xiàn),我們繼續(xù)點開上面的鏈接可以看到:
.
最上面就是介紹了一些在 Theano 上拓展的,使用多 GPU 的并行庫,正是我想要的!
Synkhronos 庫
這里以第一個 Synkhronos 為例,我們點擊進去直接就會跳轉(zhuǎn)到 Synkhronos 的 github 項目,最下面 ReadME 介紹了官方文檔。
.
繼續(xù)點擊這個文檔鏈接,可以看到是一個很全面的手冊:
直接選擇左側(cè)的 1. Installation。 根據(jù)文檔內(nèi)容,要安裝這個庫依次輸入以下內(nèi)容:
git clone https://github.com/astooke/Synkhronoscd Synkhronos
pip install . // 注意 install 的后面有一個小點
然后需要安裝這個庫的一些依賴項:
conda posix_ipcconda pyzmq
至此 Synkhronos 庫就安裝好了。
從官方文檔可以看出,目前只支持 Python3 以及非 Windows 版本。
首先在使用 Synkhronos 給出的測試小程序時會報錯如下錯誤:
好消息是,從上面的內(nèi)容可以看出,可以使用多 GPU 了,但是下面這個問題剛開始還是有點抓不著頭腦的,乍一看,是我自己少東西了吧,百度了這個錯誤,根本沒有相關(guān)結(jié)果,查看了 Synkhronos 項目的 issues(只有 2 個問題),也沒有人問,找了一圈也沒找到我少的這個東西該怎么辦。 我們就來看一下這個函數(shù)的定義吧:
這個函數(shù)不是很復(fù)雜,可以看到上面紅框位置是我們程序報錯的地方,仔細(xì)一讀該函數(shù)的定義,主要是綠框部分的內(nèi)容,大概意思是:這個函數(shù)會自動將 Theano 中的 functions 的數(shù)據(jù)壓縮成一個 pkl 文件,然后再讀取它。
原來這個東西是自己生成的,那我們就刨根問底,去報錯的路徑下看一看,到底有什么:
可以對比上面報錯的信息,這個路徑下連名字為pkl的文件加都沒有,肯定找不到對應(yīng)的.pkl文件,只要在這里手動新建一個名字為 pkl 的文件夾就可以了。 再次運行程序,這個錯誤就解決了。 四個 GPU 就可以使用了。
再追根問底以下,上面的綠色區(qū)域最后一句寫了,可以在 synkhronos/utils.py 中修改對應(yīng)的 pkl 路徑, 下面我們找到這個文件,打開一看,果然有這個子文件夾是因為這里面紅框區(qū)域設(shè)定了,我們不新建文件,直接在這里做改動,將 'pkl/' 改成 '/' 也可以。
反過來,最根本的還是在安裝的第一步 git clone 以后,在項目的 synkhronos/utils.py 中直接修改,然后再運行 pip install . 應(yīng)該就不會有以上 pkl 路徑的錯誤了。
Platoon 庫
其實在 theano 的官方文檔里,也給出了答案,但是剛開始真的沒看到!!! Using the GPU 的下面就是 Using multiple GPUs
我們點進去,可以看到官方文檔說,為了數(shù)據(jù)并行化,你最好使用 platoon, 我們再來看一下剛才那張羅列 theano 第三方庫的圖:
第 3 個就是 Platoon,噢,原來還是要安裝第三方庫,那么我們就也看一下吧。 安裝步驟類似于 Synkhronos,點擊名字直接跳到 platoon 的 Github 項目。
git clone https://github.com/mila-udem/platoonpip install -e /path/to/platoon
安裝完以后就可以了,我們再回到 theano 的官方文檔,里面給了我們測試的命令和小例程,我們新建一個名為 theano_demo.py 的文件,內(nèi)容為 :
import numpy import theanov01 = theano.shared(numpy.random.random((1024, 1024)).astype('float32'),target='dev0') v02 = theano.shared(numpy.random.random((1024, 1024)).astype('float32'),target='dev0') v11 = theano.shared(numpy.random.random((1024, 1024)).astype('float32'),target='dev1') v12 = theano.shared(numpy.random.random((1024, 1024)).astype('float32'),target='dev1')f = theano.function([], [theano.tensor.dot(v01, v02),theano.tensor.dot(v11, v12)])print(f())然后在命令行里輸入:
THEANO_FLAGS="contexts=dev0->cuda0;dev1->cuda1" python theano_demo.py輸出為:
可以看到我指定了 2 個 GPU ,使用了 2 個 GPU。至此兩個 theano 的多 GPU 庫都配置完成了。
總結(jié)
以上是生活随笔為你收集整理的caffe安装_Ubuntu 16.04 下 Theano 安装,及配置多 GPU使用(Multiple GPUs)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中sorted函数的用法_P
- 下一篇: Java啤酒生产系统描述_Java描述设