1. 程式人生 > 其它 >windows下同一個顯示卡配置多個CUDA工具包以及它們之間的切換

windows下同一個顯示卡配置多個CUDA工具包以及它們之間的切換

技術標籤:tensorflow

1、多版本的CUDA以及cudnn安裝

2、不同版本的tensorflow在CUDA之間的切換

3、驗證自己的CUDA是否安裝成功

前面的一片文章裡面講到了tensorflow、NVIDIA顯示卡驅動、CUDA工具包、cudnn之間的一些關係,詳情請參考原文:

https://blog.csdn.net/qq_27825451/article/details/89082978

tensorflow最大的問題就是版本問題,各個版本之間差異比較明顯,我們有時候需要不同的tensorflow版本,而不同的版本對於CUDA toolKit的版本要求和cudnn的要求又不一樣,我們肯定不能每次使用一個版本都重新安裝,前面的那篇文章明確了幾個基本觀點:

(1)NVIDIA顯示卡驅動和CUDA ToolKit不是一一對應的,我們一般保持最新的驅動程式,安裝其他不同版本的CUDA即可;

(2)CUDA和cudnn也不是嚴格的一一對應關係,但是這個官網上有著明確的對應連線,即很麼版本的cuda配置什麼樣的cudnn;

所以如果需要在一臺電腦上安裝多個版本的CUDA和cudnn是完全可行的,由於Linux上面的配置教程很多,這裡就不講了,本文以windows為例來說明,

1、多版本的CUDA以及cudnn安裝

由於裡顯得CUDA會預設捆綁NVIDIA驅動程式,所以在安裝的時候不要預設安裝,一定要自定義安裝,只選擇安裝CUDA即可,其他的那些就不要安裝了,我的電腦上安裝的版本如下:

我們一般安裝CUDA的時候就使用預設路徑,安裝到C盤即可,這樣方便管理。

然後在NVIDIA官網上面下載CUDA對應的cudnn版本,解壓之後將cudnn對應的三個檔案拷貝到CUDA對應的資料夾之下,這個時候我們的環境變數應該如下所示:

現在多個版本的CUDA就安裝完成了。

2、不同版本的tensorflow在CUDA之間的切換

網上有很多在Linux下面的CUDA的切換,其實都是通過環境變數的設定與配置來實現的,但是window這一點坐的很方便,

不需要切換,不需要切換,不需要切換,只要環境變數PATH中有相應的CUDA路徑即可,無需手動切換了。

比如我的電腦上同事安裝了

tensorflow1.9,它對應於CUDA9.0

tensorflow1.13,它對應於CUDA10.0

tensorflow2.0.0 alpha0,它對應於CUDA10.0

我可以使用任何一個版本,只要在環境變數中有對應的CUDA路徑即可,

本人也是通過實驗得出來的,首先我刪除了CUDA10.0的環境變數,重啟之後,發現tensorflow1.13和tensorflow2.0.0都不能使用了,但是tensorflow1.9還可以用;然後我又刪除了CUDA9.0的環境變數,重啟,這個時候tensorflow1.9也不能使用了;

接下來我又新增CUDA10.0的環境變數,重啟,此時tensorflow1.13和tensorflow2.0.0又可以1使用了,然後我又通過新增CUDA9.0環境變數,重啟,這時tensorflow1.9又可以使用了。

總結:windows多個不同版本的CUDA使用時需要切換,只要環境變數PATH中有相應的CUDA路徑即可,無需手動切換了。tensorflow在執行的時候會自動在環境變數中尋找合適的CUDA版本,直到找到為止,如果沒有,則會報錯。

3、驗證自己的CUDA是否安裝成功

每一個版本的CUDA配置完成後,我們可以驗證是否配置成功,主要使用CUDA內建的deviceQuery.exe 和 bandwithTest.exe這兩個程式來驗證。
首先win+R啟動cmd,cd到安裝目錄下的 ,比如我的安裝目錄是(以CUDA 10.1為例):

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite

執行bandwidthTest.exedeviceQuery.exe這兩個應用程式,得到下面的結果:


C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite>deviceQuery
deviceQuery Starting...
 
 CUDA Device Query (Runtime API) version (CUDART static linking)
 
Detected 1 CUDA Capable device(s)
 
Device 0: "GeForce GTX 1070"
  CUDA Driver Version / Runtime Version          10.1 / 10.1
  CUDA Capability Major/Minor version number:    6.1
  Total amount of global memory:                 8192 MBytes (8589934592 bytes)
  (15) Multiprocessors, (128) CUDA Cores/MP:     1920 CUDA Cores
  GPU Max Clock rate:                            1785 MHz (1.78 GHz)
  Memory Clock rate:                             4004 Mhz
  Memory Bus Width:                              256-bit
  L2 Cache Size:                                 2097152 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
  Total amount of constant memory:               zu bytes
  Total amount of shared memory per block:       zu bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          zu bytes
  Texture alignment:                             zu bytes
  Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  CUDA Device Driver Mode (TCC or WDDM):         WDDM (Windows Display Driver Model)
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            No
  Supports Cooperative Kernel Launch:            No
  Supports MultiDevice Co-op Kernel Launch:      No
  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
 
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.1, CUDA Runtime Version = 10.1, NumDevs = 1, Device0 = GeForce GTX 1070
Result = PASS


C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite>bandwidthTest
[CUDA Bandwidth Test] - Starting...
Running on...
 
 Device 0: GeForce GTX 1070
 Quick Mode
 
 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     12180.7
 
 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     12782.8
 
 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     191225.0
 
Result = PASS

當兩個Result=PASS的時候,說明我們的安裝配置是沒有問題的。