Linux下的CUDA多版本管理

Linux下的CUDA多版本管理

關于CUDA、cuDNN等的簡介和安裝可參考:顯卡、顯卡驅動、CUDA、CUDA Toolkit、cuDNN 梳理。

CUDA多版本

有時我們會在一臺機器上同時看到多個版本的CUDA,比如nvcc -Vnvidia-smi的輸出就可能會不同:

在我們實驗室的服務器上nvcc --version顯示的結果如下:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Tue_Jun_12_23:07:04_CDT_2018
Cuda compilation tools, release 9.2, V9.2.148

nvidia-smi顯示結果如下:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-PCIE...  On   | 00000000:01:00.0 Off |                  Off |
| N/A   28C    P0    26W / 250W |      0MiB / 16130MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-PCIE...  On   | 00000000:02:00.0 Off |                  Off |
| N/A   24C    P0    30W / 250W |      0MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

可以看到nvcc的CUDA 版本是9.2,而nvidia-smi的CUDA版本是10.0。如果nvidia-smi命令列出的CUDA版本與nvcc -V列出的版本號不一致,可能是由以下原因之一引起的:

1)安裝多版本cuda后,還沒有刷新環境變量,刷新即可;

2)CUDA有兩種API,分別是運行時API和驅動API,即所謂的Runtime API與Driver API,nvidia-smi的結果除了有GPU驅動版本型號,還有CUDA Driver API的版本號,這里是10.0,而nvcc的結果是對應CUDA Runtime API。

對于原因二的一個具體解釋如下:

CUDA有兩個主要的API:runtime(運行時) APIdriver(驅動) API。這兩個API都有對應的CUDA版本(如9.2和10.0等)。

  • 用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安裝的。nvidia-smi就屬于這一類API。
  • 用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安裝的。(CUDA Toolkit Installer有時可能會集成了GPU driver Installer)。nvcc是與CUDA Toolkit一起安裝的CUDA compiler-driver tool,它只知道它自身構建時的CUDA runtime版本。它不知道安裝了什么版本的GPU driver,甚至不知道是否安裝了GPU driver。

綜上,如果driver API和runtime API的CUDA版本不一致可能是因為你使用的是單獨的GPU driver installer,而不是CUDA Toolkit installer里的GPU driver installer。

補充說明:在安裝CUDA 時候會安裝3大組件,分別是 NVIDIA 驅動、toolkit和samples。NVIDIA驅動是用來控制GPU硬件,toolkit里面包括nvcc編譯器等,samples或者說SDK 里面包括很多樣例程序包括查詢設備、帶寬測試等等。上面說的CUDA Driver API是依賴于NVIDIA驅動安裝的,而CUDA Runtime API 是通過CUDA toolkit安裝的。

runtime API 與 driver API 的區別

下圖很清楚的展示前面提到的各種概念之間的關系,其中runtime API和driver API在很多情況非常相似,也就是說用起來的效果是等價的,但是你不能混合使用這兩個API,因為二者是互斥的。也就是說在開發過程中,你只能選擇其中一種API。簡單理解二者的區別就是:runtime是更高級的封裝,開發人員用起來更方便,而driver API更接近底層,速度可能會更快。

在這里插入圖片描述

兩種API詳細的區別如下:

  • 復雜性

    • runtime API通過提供隱式初始化、上下文管理和模塊管理來簡化設備代碼管理。這使得代碼更簡單,但也缺乏驅動程序API所具有的控制級別。
    • 相比之下,driver API提供了更細粒度的控制,特別是在上下文和模塊加載方面。實現內核啟動要復雜得多,因為執行配置和內核參數必須用顯式函數調用指定。
  • 控制

    • 對于runtime API,其在運行時,所有內核都在初始化期間自動加載,并在程序運行期間保持加載狀態。
    • 而使用driver API,可以只加載當前需要的模塊,甚至動態地重新加載模塊。driver API也是語言獨立的,因為它只處理cubin對象。
  • 上下文管理

    上下文管理可以通過driver API完成,但是在runtime API中不公開。相反,runtime API自己決定為線程使用哪個上下文:

    • 如果一個上下文通過driver API成為調用線程的當前上下文,runtime將使用它,
    • 如果沒有這樣的上下文,它將使用“主上下文(primary context)”。

主上下文會根據需要創建,每個設備每個進程一個上下文,并進行引用計數,然后在沒有更多的引用時銷毀它們。在一個進程中,所有runtime API的用戶都將共享主上下文,除非上下文已成為每個線程的當前上下文。runtime使用的上下文,即當前上下文或主上下文,可以用cudaDeviceSynchronize()同步,也可以用cudaDeviceReset()銷毀。

但是,將runtime API與主上下文一起使用會有tradeoff。例如,對于那些需要給較大的軟件包寫插件的開發者來說者會帶來不少麻煩,因為如果所有的插件都在同一個進程中運行,它們將共享一個上下文,但可能無法相互通信。也就是說,如果其中一個在完成所有CUDA工作后調用cudaDeviceReset(),其他插件將失敗,因為它們使用的上下文在它們不知情的情況下被破壞。為了避免這個問題,CUDA clients可以使用driver API來創建和設置當前上下文,然后使用runtime API來處理它。但是,上下文可能會消耗大量的資源,比如設備內存、額外的主機線程和設備上上下文切換的性能成本。當將driver API與基于runtime API(如cuBLAS或cuFFT)構建的庫一起使用時,這種runtime-driver上下文共享非常重要。

CUDA多版本管理

我們可以通過:

ls -l /usr/local | grep cuda

來查看自己的機器上有多少個cuda版本,通常不帶版本號的 cuda 會是其他帶版本號的cuda-x.x的軟鏈接。即像下面這樣:

lrwxrwxrwx  1 root root    21 12月 10  2020 cuda -> /usr/local/cuda-11.1/

而我們只要把我們使用cuda時都指向這個軟鏈接/usr/local/cuda,并在需要切換版本時切換這個軟鏈接的指向即可。

sudo rm -rf cuda
sudo ln -s /usr/local/cuda-9.0/  /usr/local/cuda

注意此時如果nvcc -V的輸出還是更改之前的CUDA版本的話,要修改環境變量:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

并且要去 ~/.bashrc 中查看以下是不是會顯式地指定CUDA版本如:

export PATH=/usr/local/cuda-11.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH

如果有這兩句的話,直接換成上面兩句指向軟鏈接 /usr/local/cuda 的兩句即可。

Ref

https://bbs.huaweicloud.com/blogs/detail/140384

https://blog.csdn.net/weixin_38705903/article/details/101850116

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

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

相關文章

電腦顯示無法連接sql服務器,他人的電腦為什么無法連接我電腦上的sql sever服務器...

如果SQL2005連接不上,并且服務器上所有與防火相關的東西都關閉了,還是連接不上。進行如下操作:一、為 SQL 啟用遠程連接1. 單擊“開始”,依次指向“程序”、“Microsoft SQL Server 2005”和“配置工具”,然后單擊“SQL Server 外…

ONNX初探

ONNX初探 轉載自:https://blog.csdn.net/just_sort/article/details/112912272 0x0. 背景 最近看了一些ONNX的資料,一個最大的感受就是這些資料太凌亂了。大多數都是在介紹ONNX模型轉換中碰到的坑點以及解決辦法。很少有文章可以系統的介紹ONNX的背景…

服務器修改地址,服務器修改管理地址

服務器修改管理地址 內容精選換一換在彈性云服務器上安裝完成后輸入公網IP,無法連接目的虛擬機,端口無法訪問工具。源端網絡未連通目的端。目的端安全組未開放8084端口。目的端網絡ACL禁用了8084端口。登錄源端服務器后,在源端服務器中ping 目…

ONNX再探

ONNX再探 本文轉自:https://blog.csdn.net/just_sort/article/details/113802330 這篇文章從多個角度探索了ONNX,從ONNX的導出到ONNX和Caffe的對比,以及使用ONNX遭遇的困難以及一些解決辦法,另外還介紹了ONNXRuntime以及如何基于…

圖像卷積及其計算(特征圖尺寸、參數量、計算量)

圖像卷積及其計算(特征圖尺寸、參數量、計算量) 卷積前后特征圖尺寸的計算 定義參數如下: 輸入特征圖尺寸: WWWWWW卷積核尺寸: FFFFFF步長: SSS填充的像素數:PPP 則有輸出特征圖尺寸為 NNNN…

圖解自監督學習(CV)

圖解自監督學習(CV) 譯自:https://amitness.com/2020/02/illustrated-self-supervised-learning/ 作者:Amit Chaudhary 注:譯者在某些地方對原文的表述做了調整,使其適合漢語的閱讀習慣,并在…

機器學習中的歸納偏置

機器學習中的歸納偏置 帶著偏見看世界,否則你根本沒有看待世界的方式。 本文主要參考整理自知乎問題:如何理解Inductive bias? No-Free-Lunch(NLF)定理指出學習是不可能的,除非有先驗知識。通常情況下&…

編譯型與解釋型、動態語言與靜態語言、強類型語言與弱類型語言概念辨析

編譯型與解釋型、動態語言與靜態語言、強類型語言與弱類型語言概念辨析 轉自:https://blog.csdn.net/u010533843/article/details/76215487 編譯型和解釋型 我們先看看編譯型,其實它和匯編語言是一樣的:也是有一個負責翻譯的程序來對我們的…

Linux環境變量詳解

Linux環境變量詳解 環境變量是操作系統環境設置的變量,適用于整個系統的用戶進程。 環境變量分類 按照權限分類 系統級:系統級的環境變量是每個登錄到系統的用戶都要讀取的系統變量用戶級:用戶級的環境變量則是該用戶使用系統時加載的環境…

[分布式訓練] 單機多卡的正確打開方式:PyTorch

[分布式訓練] 單機多卡的正確打開方式:PyTorch 轉自:https://fyubang.com/2019/07/23/distributed-training3/ PyTorch的數據并行相對于TensorFlow而言,要簡單的多,主要分成兩個API: DataParallel(DP&am…

上學期C語言復習

C語言&#xff1a;面向過程例&#xff1a;完成兩個單元內容的交換 &#xff1a; #include<stdio.h> //定義一個完成兩個數據交換的函數 //void swap(int m,int n) void swap(int*m,int* n) { int temp;//臨時單元 temp*m; *m*n; *ntemp; } int main() {int a5,b10; print…

[分布式訓練] 單機多卡的正確打開方式:Horovod

[分布式訓練] 單機多卡的正確打開方式&#xff1a;Horovod 轉自&#xff1a;https://fyubang.com/2019/07/26/distributed-training4/ 講完了單機多卡的分布式訓練的理論、TensorFlow和PyTorch分別的實現后&#xff0c;今天瓦礫講一個強大的第三方插件&#xff1a;Horovod。 …

【c語言數據結構筆記】1.2 數據結構

1.2數據結構 數據元素并獨立 結構實體關系 形式定義&#xff08;D&#xff0c;S&#xff09; 其中D是數據元素的有限集&#xff0c;S是D上關系的有限集 eg&#xff1a;12位數&#xff1a;132423451233 分成三組四位數 次序關系<a1,a2><a2,a3> 遵守次序關系 eg&…

使用Apex進行混合精度訓練

使用Apex進行混合精度訓練 轉自&#xff1a;https://fyubang.com/2019/08/26/fp16/ 你想獲得雙倍訓練速度的快感嗎&#xff1f; 你想讓你的顯存空間瞬間翻倍嗎&#xff1f; 如果我告訴你只需要三行代碼即可實現&#xff0c;你信不&#xff1f; 在這篇博客里&#xff0c;瓦礫…

【數據結構1.3筆記】研究內容

1.3研究內容 數據結構&#xff08;D&#xff0c;S&#xff09; {邏輯結構&#xff1a; {物理結構&#xff08;存儲結構&#xff09; {數據的運算 1.邏輯結構 1 集合&#xff1a;集合&#xff0c;沒有邏輯關系 2 線性結構 “一對一” 3樹形結構 層次關系 4圖形結構 練習&…

Linux下的LD_PRELOAD環境變量與庫打樁

Linux下的LD_PRELOAD環境變量與庫打樁 LD_PRELOAD是Linux系統的一個環境變量&#xff0c;它可以影響程序的運行時的鏈接&#xff08;Runtime linker&#xff09;&#xff0c;它允許你定義在程序運行前優先加載的動態鏈接庫&#xff0c;一方面&#xff0c;我們可以以此功能來使…

2019年藍橋杯第一題

第一題 標題&#xff1a;組隊&#xff08;本題總分&#xff1a;5 分&#xff09; 作為籃球隊教練&#xff0c;你需要從以下名單中選出 1 號位至 5 號位各一名球員&#xff0c; 組成球隊的首發陣容。 每位球員擔任 1 號位至 5 號位時的評分如下表所示。請你計算首發陣容 1 號位…

深度學習編譯:MLIR初步

深度學習編譯MLIR初步 深度模型的推理引擎 目前深度模型的推理引擎按照實現方式大體分為兩類&#xff1a;解釋型推理引擎和編譯型推理引擎。 解釋型推理引擎 一般包含模型解析器&#xff0c;模型解釋器&#xff0c;模型優化器。 模型解析器負責讀取和解析模型文件&#xff…

深入淺出LLVM

深入淺出LLVM 轉自&#xff1a;https://www.jianshu.com/p/1367dad95445 什么是LLVM&#xff1f; LLVM項目是模塊化、可重用的編譯器以及工具鏈技術的集合。 美國計算機協會 (ACM) 將其2012 年軟件系統獎項頒給了LLVM&#xff0c;之前曾經獲得此獎項的軟件和技術包括:Java、A…

藍橋杯真題訓練 2019.2題

2019第二題 標題&#xff1a;年號字串&#xff08;本題總分&#xff1a;5 分&#xff09; 小明用字母 A 對應數字 1&#xff0c;B 對應 2&#xff0c;以此類推&#xff0c;用 Z 對應 26。對于 27 以上的數字&#xff0c;小明用兩位或更長位的字符串來對應&#xff0c;例如 AA…