【二者區別】cuda和cudatoolkit

Pytorch 使用不同版本的 cuda

  由于課題的原因,筆者主要通過?Pytorch?框架進行深度學習相關的學習和實驗。在運行和學習網絡上的 Pytorch 應用代碼的過程中,不少項目會標注作者在運行和實驗時所使用的 Pytorch 和 cuda 版本信息。由于 Pytorch 和 cuda 版本的更新較快,可能出現程序的編譯和運行需要之前版本的 Pytorch 和 cuda 進行運行環境支持的情況。比如筆者遇到的某個項目中編寫了 CUDAExtension 拓展,而其中使用的 cuda 接口函數在新版本的 cuda 中做了修改,使得直接使用系統上已有的新版本 cuda 時會無法編譯使用。

  為了滿足應用程序和框架本身對不同版本的 cuda 的需求,(如上面遇到的問題中,即需要 Pytorch 能夠切換使用系統上不同版本的 cuda ,進而編譯對應的 CUDAExtension),這里即記錄筆者了解到的 Ubuntu 環境下 Pytorch 在編輯 cpp 和 cuda 拓展時確定所使用 cuda 版本的基本流程以及 Pytorch 使用不同版本的 cuda 進行運行的方法。 

cuda 與 cudatoolkit 的區別

  在使用 Anaconda 安裝 Pytorch?深度學習框架時,可以發現 Anaconda 會自動為我們安裝 cudatoolkit,如下圖所示。

  

  上述安裝的 cudatoolkit 與通過 Nvidia 官方提供的?CUDA Toolkit?是不一樣的。具體而言,Nvidia 官方提供的 CUDA Toolkit 是一個完整的工具安裝包,其中提供了 Nvidia 驅動程序、開發 CUDA 程序相關的開發工具包等可供安裝的選項。使用 Nvidia 官網提供的 CUDA Toolkit 可以安裝開發 CUDA 程序所需的工具,包括 CUDA 程序的編譯器、IDE、調試器等,CUDA 程序所對應的各式庫文件以及它們的頭文件。上述 CUDA Toolkit 的具體組成可參考?CUDA Toolkit Major Componentsicon-default.png?t=N7T8https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#major-components????????實際上,Nvidia 官方提供安裝的 CUDA Toolkit 包含了進行 CUDA 相關程序開發的編譯、調試等過程相關的所有組件。但對于 Pytorch 之類的深度學習框架而言,其在大多數需要使用 GPU 的情況中只需要使用 CUDA 的動態鏈接庫支持程序的運行( Pytorch 本身與 CUDA 相關的部分是提前編譯好的 ),就像常見的可執行程序一樣,不需要重新進行編譯過程,只需要其所依賴的動態鏈接庫存在即可正常運行。故而,Anaconda 在安裝 Pytorch 等會使用到 CUDA 的框架時,會自動為用戶安裝 cudatoolkit,其主要包含應用程序在使用 CUDA 相關的功能時所依賴的動態鏈接庫。在安裝了 cudatoolkit 后,只要系統上存在與當前的 cudatoolkit 所兼容的 Nvidia 驅動,則已經編譯好的 CUDA 相關的程序就可以直接運行,而不需要安裝完整的 Nvidia 官方提供的 CUDA Toolkit .

  通過 Anaconda 安裝的應用程序包位于安裝目錄下的 /pkg 文件夾中,如筆者的目錄即為 /home/xxx/anaconda3/pkgs/ ,用戶可以在其中查看 conda 安裝的 cudatoolkit 的內容,如下圖所示。可以看到 conda 安裝的 cudatoolkit 中主要包含的是支持已經編譯好的 CUDA 程序運行的相關的動態鏈接庫。( Ubuntu 環境下 )

  

  在大多數情況下,上述 cudatoolkit 是可以滿足 Pytorch 等框架的使用需求的。但對于一些特殊需求,如需要為 Pytorch 框架添加 CUDA 相關的拓展時(?Custom C++ and CUDA Extensions?),需要對編寫的 CUDA 相關的程序進行編譯等操作,則需安裝完整的 Nvidia 官方提供的 CUDA Toolkit.

  本文的后續內容,即對應的是當 Pytorch 等框架需要編譯對應的 CUDA 相關拓展程序時,如何設置使用不同版本的 cuda toolkit( 完整的包含有編譯器的安裝包 )對程序進行編譯,進而滿足特定的 CUDA 版本依賴。

Pytorch 確定所使用的 cuda 版本

  實際使用過程中,Pytorch 檢測運行時使用的 cuda 版本的代碼位于 torch/utils/cpp_extension.py 的_find_cuda_home 函數??( Pytorch 1.1.0,?Line 24?)中.這里主要介紹 Linux 環境下的 cuda 版本的確認過程,關于 Windows 環境下多版本 cuda 的使用可以參考上述文件中的具體實現.

  確定 cuda 路徑

  若在運行時需要使用 cuda 進行程序的編譯或其他 cuda 相關的操作,Pytorch 會首先定位一個 cuda 安裝目錄( 來獲取所需的特定版本 cuda 提供的可執行程序、庫文件和頭文件等文件 )。具體而言,Pytorch 首先嘗試獲取環境變量 CUDA_HOME/CUDA_PATH 的值作為運行時使用的 cuda 目錄。若直接設置了 CUDA_HOME/CUDA_PATH 變量,則 Pytorch 使用 CUDA_HOME/CUDA_PATH 指定的路徑作為運行時使用的 cuda 版本的目錄。

  若上述環境變量不存在,則 Pytorch 會檢查系統是否存在固定路徑 /usr/local/cuda 。默認情況下,系統并不存在對環境變量 CUDA_HOME 設置,故而 Pytorch 運行時默認檢查的是 Linux 環境中固定路徑 /usr/local/cuda 所指向的 cuda 目錄。 /usr/local/cuda 實際上是一個軟連接文件,當其存在時一般被設置為指向系統中某一個版本的 cuda 文件夾。使用一個固定路徑的軟鏈接的好處在于,當系統中存在多個安裝的 cuda 版本時,只需要修改上述軟連接實際指向的 cuda 目錄,而不需要修改任何其他的路徑接口,即可方便的通過唯一的路徑使用不同版本的 cuda. 如筆者使用的服務器中,上述固定的 /usr/local/cuda 路徑即指向一個較老的 cuda-8.0 版本的目錄。  

  需要注意的是, /usr/local/cuda 并不是一個 Linux 系統上默認存在的路徑,其一般在安裝 cuda 時創建( 為可選項,不強制創建 )。故而 Pytorch 檢測上述路徑時也可能會失敗。   

  若 CUDA_HOME 變量指定的路徑和默認路徑 /usr/local/cuda 均不存在安裝好的 cuda 目錄,則 Pytorch 通過運行命令 which nvcc 來找到一個包含有 nvcc 命令的 cuda 安裝目錄,并將其作為運行時使用的 cuda 版本。具體而言,系統會根據環境變量 PATH 中的目錄去依次搜索可用的 nvcc 可執行文件,若環境變量 PATH 中包含多個安裝好的 cuda 版本的可執行文件目錄( 形如/home/test/cuda-10.1/bin ),則排在 PATH 中的第一個 cuda 的可執行文件目錄中的 nvcc 命令會被選中,其所對應的路徑被選為 Pytorch 使用的 cuda 路徑。同樣的,若 PATH 中不存在安裝好的 cuda 版本的可執行目錄,則上述過程會失敗,Pytorch 最終會由于找不到可用的 cuda 目錄而無法使用 cuda.比較推薦的做法是保持 PATH 路徑中存在唯一一個對應所需使用的 cuda 版本的可執行目錄的路徑。

  在確定好使用的 cuda 路徑后,基于 cuda 的 Pytorch 拓展即會使用確定好的 cuda 目錄中的可執行文件( /bin )、頭文件( /include )和庫文件( /lib64 )完成所需的編譯過程。

Pytorch 使用特定的 cuda 版本

  從 Pytorch 確定使用的 cuda 版本的流程來看,想要指定 Pytorch 使用的 cuda 版本,主要有兩種方法,第一種是修改軟鏈接 /usr/local/cuda 所指向的 cuda 安裝目錄( 若不存在則新建 ),第二種是通過設置環境變量 CUDA_HOME 指向所需使用的 cuda 版本的安裝目錄。除此之外,還建議將對應 cuda 目錄中的可執行文件目錄( 形如/home/test/cuda-10.1/bin )加入環境變量 PATH 中。

  對于第一種方法,由于 /usr/ 和 /usr/local/ 目錄下的文件均為 root 用戶所管理,故而普通用戶無法對其進行修改。對于具備了 root 權限的用戶而言,在安裝有多版本 cuda 的 Linux 系統上,只需切換 /usr/local/cuda 所指向的 cuda 目錄,讓其指向所需的 cuda 版本的安裝位置,即可讓 Pytorch 在運行時使用指定版本的 cuda 運行程序。修改軟鏈接的方法如下命令所示,命令刪除原有的軟鏈接,并新建指向新路徑的軟鏈接。

  sudo rm -rf /usr/local/cuda           //刪除軟鏈接,注意是 /usr/local/cuda 而不是 /usr/local/cuda/,前者僅刪除軟鏈接,而后者會刪除軟鏈接所指向的目錄的所有內容,操作請小心sudo ln -s cuda_path /usr/local/cuda    //創建名為 /usr/local/cuda 的軟鏈接,其指向 cuda_path 所指定的 cuda 安裝目錄

  或者直接強制修改原始的軟鏈接

    sudo ln -sf cuda_path /usr/local/cuda    //修改或創建軟鏈接 /usr/local/cuda 使其指向指定版本的 cuda 目錄

  對于非 root 用戶而言,主要通過第二種方法進行設置。若想要指定 Pytorch 使用的 cuda 版本,則首先需要設置 CUDA_HOME 環境變量,之后在?PATH 中加入指定 cuda 版本的可執行目錄,也就時 cuda_path/bin/ 目錄。完成設置后,運行 Pytorch 時所使用的即為對應的 cuda 版本。

  實例

  以筆者的服務器賬戶為例,筆者在 /home/test/cuda-10.1 目錄中安裝了 cuda-10.1 ,而服務器上的 /usr/local/cuda 目錄指向的是之前安裝的老版本的 cuda-8.0,直接運行 Pytorch 時,其會基于上面的確認流程直接使用老版本的 cuda .若想要臨時設置 Pytorch 使用新安裝的 cuda ,則可以通過 export 命令修改全局變量。這種設置方式在當前終端退出后即失效。

    export CUDA_HOME=/home/test/cuda-10.1/           //設置全局變量 CUDA_HOMEexport PATH=$PATH:/home/test/cuda-10.1/bin/        //在 PATH 變量中加入需要使用的 cuda 版本的路徑,使得系統可以使用 cuda 提供的可執行文件,包括 nvcc

  想要永久設置上述 cuda 設置,用戶可以直接在自己的 bash 設置文件 ~/.bashrc 文件尾部加入上述命令,保存后再通過 source ~/.bashrc 執行文件,即可完成當前終端的環境變量修改。如果需要使用新的 cuda 來編譯文件,還可以通過 LD_LIBRARY_PATH 變量指定進行鏈接的 cuda 庫文件的路徑。

  

  位于 ~/.bashrc 文件中的指令在每次終端啟動時均會自動運行,后續本用戶所打開的終端中的環境變量均會首先執行上述文件中的命令,從而獲得對應的 cuda 變量。

其他

  獲取 Pytorch 使用的 cuda 版本

  目前,網絡上比較多的資源會討論如何獲得 Pytorch 使用的 cuda 的版本的方法。比較主流的一種方法是使用 Pytorch 提供的方法 torch.version.cuda .

    >>>import torch>>>torch.version.cuda    #輸出一個 cuda 版本

  如筆者環境下上述命令的輸出如下圖所示。

  

  事實上,上述輸出的 cuda 的版本并不一定是 Pytorch 在實際系統上運行時使用的 cuda 版本,而是編譯該 Pytorch release 版本時使用的 cuda 版本

  torch.version.cuda 是位于 torch/version.py 中的一個變量, Pytorch 在基于源碼進行編譯時,通過?tools/setup_helpers/cuda.py?來確定編譯 Pytorch 所使用的 cuda 的安裝目錄和版本號,確定的具體流程與 Pytorch 運行時確定運行時所使用的 cuda 版本的流程較為相似,具體可以見其源碼(?Pytorch 1.1.0, Line 66?).在進行 Pytorch 源碼編譯時,根目錄下的 setup.py 會調用上述代碼,確定編譯 Pytorch 所使用的 cuda 目錄和版本號,并使用獲得的信息修改 torch/version.py 中的 cuda 信息( Pytorch,?Line 286?)。上述 torch.version.cuda 輸出的信息即為編譯該發行版 Pytorch 時所使用的 cuda 信息。若系統上的 Pytorch 通過 conda 安裝,用戶也可以直接通過 conda list | grep pytorch 命令查看安裝的 Pytorch 的部分信息。   

    conda list | grep pytorch    //查看安裝的 Pytorch 的信息

  筆者環境下上述命令的結果如圖所示,可以看到顯示的 cuda 信息與 torch.version.cuda 保持一致。

  

  想要查看 Pytorch 實際使用的運行時的 cuda 目錄,可以直接輸出之前介紹的 cpp_extension.py 中的 CUDA_HOME 變量。

    >>> import torch>>> import torch.utils>>> import torch.utils.cpp_extension>>> torch.utils.cpp_extension.CUDA_HOME        #輸出 Pytorch 運行時使用的 cuda 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215078.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mac安裝elasticsearch8.x

es下載地址: Past Releases of Elastic Stack Software | Elastic https://www.elastic.co/cn/downloads/past-releases#elasticsearch 選擇8.10版本 進入es bin目錄下執行啟動命令 ./elasticsearch 這個時候localhost:9200無法訪問 原因是是因為開啟了ssl認證…

R語言,table()函數實現統計每個元素出現的頻數+并將最終統計頻數結果轉換成dataframe數據框形式

在 R中,要統計dataframe數據框中每個元素出現的頻數,可以使用table()函數。以下是一個示例: 目錄 一、創建數據 二、統計第一列每個元素出現的頻數 三、統計第二列每個元素出現的頻數 四、將頻數結果轉換為數據框,并改列名 一…

Cannot find cache named ‘‘ for Builder Redis

當引入 Redissson 時,springCache 緩存機制失效 原因:springCache 默認使用本地緩存 Redisson 使用redis 緩存 最后都轉成redis了。。。 總感覺哪不對 兩者居然不共存

nodejs+vue+微信小程序+python+PHP的外賣數據分析-計算機畢業設計推薦django

構建一種完全可實現、可操作的開放源代碼信息收集系統,幫助記者完成工作任務。采編人員僅需輸入所收集到的網址及題目即可迅速啟動收集工作并進行信息歸類。 2.根據新的數據收集要求,采用云計算技術實現新的收集器的迅速部署。對于資料采集點的改版&…

Java接入ChatGPT接口簡單示例

我們定義了一個名為ChartGPTConfig的類,它有兩個私有成員變量apiKey和apiUrl,分別表示ChartGPT的API密鑰和API URL。 public class ChartGPTConfig {private final String apiKey;private final String apiUrl;public ChartGPTConfig(String apiKey, St…

angular hero學習

install nodehttps://nodejs.org C:\xxx\Downloads\node-v20.10.0-x64 C:\Program Files\nodejs\ C:\angular>node -v v20.10.0 C:\angular>npm -v 10.2.3 install angualr npm install -g angular/cli error # 設置淘寶源npm config set registry https://registry.…

基于Qt的登錄頁面設計

題目: 完善對話框,點擊登錄對話框,如果賬號和密碼匹配,則彈出信息對話框,給出提示”登錄成功“,提供一個Ok按鈕,用戶點擊Ok后,關閉登錄界面,跳轉到其他界面 如果賬號和…

Node.js管理工具npm簡單介紹

1.npm用途說明 我們在寫node.js項目的時候npm工具是避免不的,那么我們如何使用該工具去管理包文具呢?首先我們先介紹npm工具的幾種用途: 可以從npm服務器下載別人編寫的第三方包到本地使用。可以從npm服務器下載并安裝別人編寫的命令行程序…

音樂制作工具 Ableton Live 12中文最新 for Mac

Ableton Live 12 Mac具有直觀的界面和強大的功能,使得音樂制作變得更加簡單和高效。它支持實時錄制、編輯和混音,用戶可以在創作過程中隨時進行修改和調整。此外,該軟件還提供了各種音頻效果、虛擬樂器和采樣器,使用戶可以創建出更…

Springboot入門篇

一、概述 Spring是一個開源框架,2003 年興起的一個輕量級的Java 開發框架,作者Rod Johnson 。Spring是為了解決企業級應用開發的復雜性而創建的,簡化開發。 1.1對比 對比一下 Spring 程序和 SpringBoot 程序。如下圖 坐標 Spring 程序中的…

深入理解模板引擎:解鎖 Web 開發的新境界(下)

🤍 前端開發工程師(主業)、技術博主(副業)、已過CET6 🍨 阿珊和她的貓_CSDN個人主頁 🕠 牛客高級專題作者、在牛客打造高質量專欄《前端面試必備》 🍚 藍橋云課簽約作者、已在藍橋云…

TrustZone之完成器:外圍設備和內存

到目前為止,在本指南中,我們集中討論了處理器,但TrustZone遠不止是一組處理器功能。要充分利用TrustZone功能,我們還需要系統其余部分的支持。以下是一個啟用了TrustZone的系統示例: 本節探討了該系統中的關鍵組件以及它們在TrustZone中的作用。 完成器:外圍設備…

11、vue3(十一):sku管理:商品上下架,商品詳情,刪除sku

目錄 一、sku查詢頁面完成 1.代碼實現 (1)完成入參出參、接口代碼 (2)首頁頁面

點評項目——秒殺優化

2023.12.11 上一張的秒殺券下單還可以進行優化,先來回顧一下下單流程: 可以看出流程設計多次查詢和操作數據庫的操作,并且執行順序是一個線程串行執行,執行性能是比較低的。 優化方案:我們將判斷秒殺庫存和校驗一人一單…

WPF里面的Dispatcher詳解

在WPF應用程序中,Application.Current.Dispatcher是一個重要的屬性。它允許開發者在WPF應用程序的主線程上執行操作,這對于確保UI響應性和避免假死(程序沒有響應用戶輸入)非常關鍵。主線程負責接收輸入、處理事件、繪制屏幕等任務。為了避免在主線程上執行耗時的操作,開發…

websocket和SSE通信示例(無需安裝任何插件)

websocket和SSE通信示例(無需安裝任何插件) 源碼示例(兩種方案任意切換) data(){return {heartBeatInterval:5000,// 心跳間隔時間,單位為毫秒webSocket:null,heartBeatTimer:null,} }, mounted() {// this.initWebS…

從零開始實現神經網絡(三)_RNN循環神經網絡

參考文章:rnn循環神經網絡介紹 循環神經網絡 (RNN) 是一種專門處理序列的神經網絡。它們通常用于自然語言處理 (NLP) 任務,因為它們在處理文本方面很有效。在這篇文章中,我們將探討什么是 RNN&a…

圖文教程:從0開始安裝stable-diffusion

現在AI繪畫還是挺火,Midjourney雖然不錯,但是對于我來說還是挺貴的。今天我就來安一下開源的AI繪畫stable-diffusion,它的缺點就是對電腦的要求比較高,尤其是顯卡。 話不多說開搞。 訪問sd的github,https://github.com/AUTOMATIC…

〖大前端 - 基礎入門三大核心之JS篇(51)〗- 面向對象之認識上下文與上下文規則

說明:該文屬于 大前端全棧架構白寶書專欄,目前階段免費,如需要項目實戰或者是體系化資源,文末名片加V!作者:哈哥撩編程,十余年工作經驗, 從事過全棧研發、產品經理等工作,目前在公司…

qt-C++筆記之addAction和addMenu的區別以及QAction的使用場景

qt-C筆記之addAction和addMenu的區別以及QAction的使用場景 code review! 文章目錄 qt-C筆記之addAction和addMenu的區別以及QAction的使用場景1.QMenu和QMenuBar的關系與區別2.addMenu和addAction的使用場景區別3.將QAction的信號連接到槽函數4.QAction的使用場景5.將例1修改…