1. 程式人生 > 其它 >動手學深度學習 | 使用和購買GPU | 15

動手學深度學習 | 使用和購買GPU | 15

目錄

使用GPU

其實如果沒有錢買GPU的話,使用Google Colab也是一個不錯的選擇,大概是10 dollar一個月。

算力其實是很貴的... 利用好算力是一件很重要的事情!

關於Nvidia Driver too old的問題,如果是伺服器的話,這裡不要盲目的去更新顯示卡驅動,這樣子會把別人的環境搞壞的。

正確的方式應該是去安裝適合自己驅動的版本的框架。

# 下面命令來確認cuda的版本,然後在進行相應cuda的下載
cat /usr/local/cuda/version.txt 

使用GPU是簡單的,只要把權重copy到GPU上,在把輸入copy到GPU上,就可以在GPU上進行運算了。

購買GPU

GPU的效能主要由以下3個引數構成:

  • 計算能力。通常我們關心的是32位浮點計算能力。16位浮點訓練也開始流行,如果只做預測的話也可以用8位整數。

  • 視訊記憶體大小。當模型越大或者訓練時的批量越大時,所需要的視訊記憶體就越多。

  • 視訊記憶體頻寬。只有當視訊記憶體頻寬足夠時才能充分發揮計算能力。

當然只推薦消費類的GPU(GTX、RTX),對於企業類的GPU這是不推薦的,一般會貴5~6倍。

顯示卡儘量要買新的,因為工藝在進步,新一代對比舊一代,同樣的計算效能,價格會便宜。(電子裝置都是如此,買新不買舊)

整機配置

通常,我們主要用GPU做深度學習訓練。因此,不需要購買高階的CPU。至於整機配置,儘量參考網上推薦的中高檔的配置就好。不過,考慮到GPU的功耗、散熱和體積,在整機配置上也需要考慮以下3個額外因素:

  1. 機箱體積。顯示卡尺寸較大,通常考慮較大且自帶風扇的機箱。
  2. 電源。購買GPU時需要查一下GPU的功耗,如50 W到300 W不等。購買電源要確保功率足夠,且不會造成機房供電過載。
  3. 主機板的PCIe卡槽。推薦使用PCIe 3.0 16x來保證充足的GPU到記憶體的頻寬。如果搭載多塊GPU,要仔細閱讀主機板說明,以確保多塊GPU一起使用時仍然是16倍頻寬。注意,有些主機板搭載4塊GPU時會降到8倍甚至4倍頻寬。

QA

  1. 如果買GPU的話,視訊記憶體是越大越好嗎?還有什麼評價指標嗎?

當然是越大越好,但是視訊記憶體是一個很貴的事情,視訊記憶體比CPU的記憶體貴。

GPU的視訊記憶體是越大越好的,但是越大越貴,所以你要在你的承受範圍能力買。

後面會講解CPU和GPU的工作原理的不同,也就是為什麼說GPU視訊記憶體越大越好。

  1. 跑專案的時候視訊記憶體不夠怎麼辦,如果把batch_size調小,視訊記憶體夠用了但是cuda佔用一直很低怎麼辦?

如果是視訊記憶體不夠用的話,那麼只有把batch_size給調小。

但是如果把batch_size調小的話,那麼Volatile GPU-Util(GPU計算單元的利用率)不高。

那麼這裡給的建議就是把模型給調小一點,比如如果是使用ResNet152的話,這裡就建議修改成ResNet50。

  1. GPU使用率是不是越高越好,長時間滿負荷是不是對顯示卡不太好?

滿負荷對GPU是沒有問題的,唯一的問題是溫度不要過熱!最好建議就是不要超過80度,90度太久。

沐神說他是燒過很多塊卡的... 滿負荷是沒有問題的,但是就是要注意溫度!溫度是一個很重要的事情。

  1. 一般使用gpu訓練,data在哪一步to gpu比較好?

一般是在最後network train的時候。

因為很多資料的變化,做data preprocess在GPU上不一定支援的比較好,如果data在GPU上做的比較好,那麼可以往前走,比如很多時候在GPU上做一些圖片的處理。

  1. tensor.cuda() 和 to(device)有什麼區別?

都是將tensor挪到GPU上,但是to(device)是講module,也就是模型挪到GPU上。

  1. 使用GPU後加速效果不明顯有哪些可能的原因?執行GPU使用率在60%~70%。

其實60~70%的使用頻率已經不低了,看看能不能優化下網路。

對於CNN的話,GPU的使用率很容易到80%以上。

  1. 怎麼評價apple M1 gpu和cpu共用記憶體?

整合顯示卡基本都是個cpu共用記憶體的,而且共不共用記憶體不是關鍵,而是要看記憶體的頻寬,其實M1的記憶體頻寬還行。

  1. cuda和GPU到底是什麼關係?

GPU是硬體,cuda可以認為是開發的一個SDK。

  1. 自定義的block被放在同一個Sequential內的不同layer,但是不想共享引數,該怎麼做?

只要new新的物件就可以了,傳入的也是物件,如果不是同一個物件,預設是不會共享引數的。