本篇文章為大家展示了如何在Pytorch中使用不同版本的cuda,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
cuda 與 cudatoolkit 的區(qū)別
在使用 Anaconda 安裝 Pytorch 深度學(xué)習(xí)框架時(shí),可以發(fā)現(xiàn) Anaconda 會自動為我們安裝 cudatoolkit,如下圖所示。
上述安裝的 cudatoolkit 與通過 Nvidia 官方提供的CUDA Toolkit是不一樣的。具體而言,Nvidia 官方提供的 CUDA Toolkit 是一個完整的工具安裝包,其中提供了 Nvidia 驅(qū)動程序、開發(fā) CUDA 程序相關(guān)的開發(fā)工具包等可供安裝的選項(xiàng)。使用 Nvidia 官網(wǎng)提供的 CUDA Toolkit 可以安裝開發(fā) CUDA 程序所需的工具,包括 CUDA 程序的編譯器、IDE、調(diào)試器等,CUDA 程序所對應(yīng)的各式庫文件以及它們的頭文件。上述 CUDA Toolkit 的具體組成可參考CUDA Toolkit Major Components.
實(shí)際上,Nvidia 官方提供安裝的 CUDA Toolkit 包含了進(jìn)行 CUDA 相關(guān)程序開發(fā)的編譯、調(diào)試等過程相關(guān)的所有組件。但對于 Pytorch 之類的深度學(xué)習(xí)框架而言,其在大多數(shù)需要使用 GPU 的情況中只需要使用 CUDA 的動態(tài)鏈接庫支持程序的運(yùn)行( Pytorch 本身與 CUDA 相關(guān)的部分是提前編譯好的 ),就像常見的可執(zhí)行程序一樣,不需要重新進(jìn)行編譯過程,只需要其所依賴的動態(tài)鏈接庫存在即可正常運(yùn)行。故而,Anaconda 在安裝 Pytorch 等會使用到 CUDA 的框架時(shí),會自動為用戶安裝 cudatoolkit,其主要包含應(yīng)用程序在使用 CUDA 相關(guān)的功能時(shí)所依賴的動態(tài)鏈接庫。在安裝了 cudatoolkit 后,只要系統(tǒng)上存在與當(dāng)前的 cudatoolkit 所兼容的 Nvidia 驅(qū)動,則已經(jīng)編譯好的 CUDA 相關(guān)的程序就可以直接運(yùn)行,而不需要安裝完整的 Nvidia 官方提供的 CUDA Toolkit .
通過 Anaconda 安裝的應(yīng)用程序包位于安裝目錄下的 /pkg 文件夾中,如筆者的目錄即為 /home/xxx/anaconda3/pkgs/ ,用戶可以在其中查看 conda 安裝的 cudatoolkit 的內(nèi)容,如下圖所示??梢钥吹?conda 安裝的 cudatoolkit 中主要包含的是支持已經(jīng)編譯好的 CUDA 程序運(yùn)行的相關(guān)的動態(tài)鏈接庫。( Ubuntu 環(huán)境下 )
在大多數(shù)情況下,上述 cudatoolkit 是可以滿足 Pytorch 等框架的使用需求的。但對于一些特殊需求,如需要為 Pytorch 框架添加 CUDA 相關(guān)的拓展時(shí)(Custom C++ and CUDA Extensions),需要對編寫的 CUDA 相關(guān)的程序進(jìn)行編譯等操作,則需安裝完整的 Nvidia 官方提供的 CUDA Toolkit. 本文的后續(xù)內(nèi)容,即對應(yīng)的是當(dāng) Pytorch 等框架需要編譯對應(yīng)的 CUDA 相關(guān)拓展程序時(shí),如何設(shè)置使用不同版本的 cuda toolkit( 完整的包含有編譯器的安裝包 )對程序進(jìn)行編譯,進(jìn)而滿足特定的 CUDA 版本依賴。
Pytorch 確定所使用的 cuda 版本
實(shí)際使用過程中,Pytorch 檢測運(yùn)行時(shí)使用的 cuda 版本的代碼位于 torch/utils/cpp_extension.py 的_find_cuda_home 函數(shù)( Pytorch 1.1.0, Line 24)中.這里主要介紹 Linux 環(huán)境下的 cuda 版本的確認(rèn)過程,關(guān)于 Windows 環(huán)境下多版本 cuda 的使用可以參考上述文件中的具體實(shí)現(xiàn).
確定 cuda 路徑
若在運(yùn)行時(shí)需要使用 cuda 進(jìn)行程序的編譯或其他 cuda 相關(guān)的操作,Pytorch 會首先定位一個 cuda 安裝目錄( 來獲取所需的特定版本 cuda 提供的可執(zhí)行程序、庫文件和頭文件等文件 )。具體而言,Pytorch 首先嘗試獲取環(huán)境變量 CUDA_HOME/CUDA_PATH 的值作為運(yùn)行時(shí)使用的 cuda 目錄。若直接設(shè)置了 CUDA_HOME/CUDA_PATH 變量,則 Pytorch 使用 CUDA_HOME/CUDA_PATH 指定的路徑作為運(yùn)行時(shí)使用的 cuda 版本的目錄。
若上述環(huán)境變量不存在,則 Pytorch 會檢查系統(tǒng)是否存在固定路徑 /usr/local/cuda 。默認(rèn)情況下,系統(tǒng)并不存在對環(huán)境變量 CUDA_HOME 設(shè)置,故而 Pytorch 運(yùn)行時(shí)默認(rèn)檢查的是 Linux 環(huán)境中固定路徑 /usr/local/cuda 所指向的 cuda 目錄。 /usr/local/cuda 實(shí)際上是一個軟連接文件,當(dāng)其存在時(shí)一般被設(shè)置為指向系統(tǒng)中某一個版本的 cuda 文件夾。使用一個固定路徑的軟鏈接的好處在于,當(dāng)系統(tǒng)中存在多個安裝的 cuda 版本時(shí),只需要修改上述軟連接實(shí)際指向的 cuda 目錄,而不需要修改任何其他的路徑接口,即可方便的通過唯一的路徑使用不同版本的 cuda. 如筆者使用的服務(wù)器中,上述固定的 /usr/local/cuda 路徑即指向一個較老的 cuda-8.0 版本的目錄。
需要注意的是, /usr/local/cuda 并不是一個 Linux 系統(tǒng)上默認(rèn)存在的路徑,其一般在安裝 cuda 時(shí)創(chuàng)建( 為可選項(xiàng),不強(qiáng)制創(chuàng)建 )。故而 Pytorch 檢測上述路徑時(shí)也可能會失敗。
若 CUDA_HOME 變量指定的路徑和默認(rèn)路徑 /usr/local/cuda 均不存在安裝好的 cuda 目錄,則 Pytorch 通過運(yùn)行命令 which nvcc 來找到一個包含有 nvcc 命令的 cuda 安裝目錄,并將其作為運(yùn)行時(shí)使用的 cuda 版本。具體而言,系統(tǒng)會根據(jù)環(huán)境變量 PATH 中的目錄去依次搜索可用的 nvcc 可執(zhí)行文件,若環(huán)境變量 PATH 中包含多個安裝好的 cuda 版本的可執(zhí)行文件目錄( 形如/home/test/cuda-10.1/bin ),則排在 PATH 中的第一個 cuda 的可執(zhí)行文件目錄中的 nvcc 命令會被選中,其所對應(yīng)的路徑被選為 Pytorch 使用的 cuda 路徑。同樣的,若 PATH 中不存在安裝好的 cuda 版本的可執(zhí)行目錄,則上述過程會失敗,Pytorch 最終會由于找不到可用的 cuda 目錄而無法使用 cuda.比較推薦的做法是保持 PATH 路徑中存在唯一一個對應(yīng)所需使用的 cuda 版本的可執(zhí)行目錄的路徑。
在確定好使用的 cuda 路徑后,基于 cuda 的 Pytorch 拓展即會使用確定好的 cuda 目錄中的可執(zhí)行文件( /bin )、頭文件( /include )和庫文件( /lib64 )完成所需的編譯過程。
Pytorch 使用特定的 cuda 版本
從 Pytorch 確定使用的 cuda 版本的流程來看,想要指定 Pytorch 使用的 cuda 版本,主要有兩種方法,第一種是修改軟鏈接 /usr/local/cuda 所指向的 cuda 安裝目錄( 若不存在則新建 ),第二種是通過設(shè)置環(huán)境變量 CUDA_HOME 指向所需使用的 cuda 版本的安裝目錄。除此之外,還建議將對應(yīng) cuda 目錄中的可執(zhí)行文件目錄( 形如/home/test/cuda-10.1/bin )加入環(huán)境變量 PATH 中?! ?/p>
對于第一種方法,由于 /usr/ 和 /usr/local/ 目錄下的文件均為 root 用戶所管理,故而普通用戶無法對其進(jìn)行修改。對于具備了 root 權(quán)限的用戶而言,在安裝有多版本 cuda 的 Linux 系統(tǒng)上,只需切換 /usr/local/cuda 所指向的 cuda 目錄,讓其指向所需的 cuda 版本的安裝位置,即可讓 Pytorch 在運(yùn)行時(shí)使用指定版本的 cuda 運(yùn)行程序。修改軟鏈接的方法如下命令所示,命令刪除原有的軟鏈接,并新建指向新路徑的軟鏈接。
sudo rm -rf /usr/local/cuda //刪除軟鏈接,注意是 /usr/local/cuda 而不是 /usr/local/cuda/,前者僅刪除軟鏈接,而后者會刪除軟鏈接所指向的目錄的所有內(nèi)容,操作請小心 sudo ln -s cuda_path /usr/local/cuda //創(chuàng)建名為 /usr/local/cuda 的軟鏈接,其指向 cuda_path 所指定的 cuda 安裝目錄
或者直接強(qiáng)制修改原始的軟鏈接
sudo ln -sf cuda_path /usr/local/cuda //修改或創(chuàng)建軟鏈接 /usr/local/cuda 使其指向指定版本的 cuda 目錄
對于非 root 用戶而言,主要通過第二種方法進(jìn)行設(shè)置。若想要指定 Pytorch 使用的 cuda 版本,則首先需要設(shè)置 CUDA_HOME 環(huán)境變量,之后在PATH 中加入指定 cuda 版本的可執(zhí)行目錄,也就時(shí) cuda_path/bin/ 目錄。完成設(shè)置后,運(yùn)行 Pytorch 時(shí)所使用的即為對應(yīng)的 cuda 版本?! ?/p>
實(shí)例
以筆者的服務(wù)器賬戶為例,筆者在 /home/test/cuda-10.1 目錄中安裝了 cuda-10.1 ,而服務(wù)器上的 /usr/local/cuda 目錄指向的是之前安裝的老版本的 cuda-8.0,直接運(yùn)行 Pytorch 時(shí),其會基于上面的確認(rèn)流程直接使用老版本的 cuda .若想要臨時(shí)設(shè)置 Pytorch 使用新安裝的 cuda ,則可以通過 export 命令修改全局變量。這種設(shè)置方式在當(dāng)前終端退出后即失效。
export CUDA_HOME=/home/test/cuda-10.1/ //設(shè)置全局變量 CUDA_HOME export PATH=$PATH:/home/test/cuda-10.1/bin/ //在 PATH 變量中加入需要使用的 cuda 版本的路徑,使得系統(tǒng)可以使用 cuda 提供的可執(zhí)行文件,包括 nvcc
想要永久設(shè)置上述 cuda 設(shè)置,用戶可以直接在自己的 bash 設(shè)置文件 ~/.bashrc 文件尾部加入上述命令,保存后再通過 source ~/.bashrc 執(zhí)行文件,即可完成當(dāng)前終端的環(huán)境變量修改。如果需要使用新的 cuda 來編譯文件,還可以通過 LD_LIBRARY_PATH 變量指定進(jìn)行鏈接的 cuda 庫文件的路徑。
位于 ~/.bashrc 文件中的指令在每次終端啟動時(shí)均會自動運(yùn)行,后續(xù)本用戶所打開的終端中的環(huán)境變量均會首先執(zhí)行上述文件中的命令,從而獲得對應(yīng)的 cuda 變量。
其他
獲取 Pytorch 使用的 cuda 版本
目前,網(wǎng)絡(luò)上比較多的資源會討論如何獲得 Pytorch 使用的 cuda 的版本的方法。比較主流的一種方法是使用 Pytorch 提供的方法 torch.version.cuda .
>>>import torch >>>torch.version.cuda #輸出一個 cuda 版本
如筆者環(huán)境下上述命令的輸出如下圖所示。
事實(shí)上,上述輸出的 cuda 的版本并不一定是 Pytorch 在實(shí)際系統(tǒng)上運(yùn)行時(shí)使用的 cuda 版本,而是編譯該 Pytorch release 版本時(shí)使用的 cuda 版本?! ?/p>
torch.version.cuda 是位于 torch/version.py 中的一個變量, Pytorch 在基于源碼進(jìn)行編譯時(shí),通過 tools/setup_helpers/cuda.py 來確定編譯 Pytorch 所使用的 cuda 的安裝目錄和版本號,確定的具體流程與 Pytorch 運(yùn)行時(shí)確定運(yùn)行時(shí)所使用的 cuda 版本的流程較為相似,具體可以見其源碼(Pytorch 1.1.0, Line 66).在進(jìn)行 Pytorch 源碼編譯時(shí),根目錄下的 setup.py 會調(diào)用上述代碼,確定編譯 Pytorch 所使用的 cuda 目錄和版本號,并使用獲得的信息修改 torch/version.py 中的 cuda 信息( Pytorch, Line 286 )。上述 torch.version.cuda 輸出的信息即為編譯該發(fā)行版 Pytorch 時(shí)所使用的 cuda 信息。若系統(tǒng)上的 Pytorch 通過 conda 安裝,用戶也可以直接通過 conda list | grep pytorch 命令查看安裝的 Pytorch 的部分信息。
conda list | grep pytorch //查看安裝的 Pytorch 的信息
筆者環(huán)境下上述命令的結(jié)果如圖所示,可以看到顯示的 cuda 信息與 torch.version.cuda 保持一致。
想要查看 Pytorch 實(shí)際使用的運(yùn)行時(shí)的 cuda 目錄,可以直接輸出之前介紹的 cpp_extension.py 中的 CUDA_HOME 變量。
>>> import torch >>> import torch.utils >>> import torch.utils.cpp_extension >>> torch.utils.cpp_extension.CUDA_HOME #輸出 Pytorch 運(yùn)行時(shí)使用的 cuda
上述內(nèi)容就是如何在Pytorch中使用不同版本的cuda,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
新聞標(biāo)題:如何在Pytorch中使用不同版本的cuda-創(chuàng)新互聯(lián)
轉(zhuǎn)載來于:http://www.rwnh.cn/article30/doedso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、App開發(fā)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容