本文目錄一覽:
pytorch用什麼顯卡
1. 利用CUDA_VISIBLE_DEVICES設置可用顯卡
在CUDA中設定可用顯卡,一般有2種方式:
(1) 在代碼中直接指定
import os
os.environ[‘CUDA_VISIBLE_DEVICES’] = gpu_ids
(2) 在命令行中執行代碼時指定
CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py
如果使用sh腳本文件運行代碼,則有3種方式可以設置
(3) 在命令行中執行腳本文件時指定:
CUDA_VISIBLE_DEVICES=gpu_ids sh run.sh
(4) 在sh腳本中指定:
source bashrc
export CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py
(5) 在sh腳本中指定
source bashrc
CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py
如果同時使用多個設定可用顯卡的指令,比如
source bashrc
export CUDA_VISIBLE_DEVICES=gpu_id1 CUDA_VISIBLE_DEVICES=gpu_id2 python3 train.py
那麼高優先級的指令會覆蓋第優先級的指令使其失效。優先級順序為:不使用sh腳本 (1)(2); 使用sh腳本(1)(5)(4)(3)
個人感覺在煉丹時建議大家從(2)(3)(4)(5)中選擇一個指定可用顯卡,不要重複指定以防造成代碼的混亂。方法(1)雖然優先級最高,但是需要修改源代碼,所以不建議使用。
2 .cuda()方法和torch.cuda.set_device()
我們還可以使用.cuda()[包括model.cuda()/loss.cuda()/tensor.cuda()]方法和torch.cuda.set_device()來把模型和數據加載到對應的gpu上。
(1) .cuda()
以model.cuda()為例,加載方法為:
model.cuda(gpu_id) # gpu_id為int類型變量,只能指定一張顯卡
model.cuda(‘cuda:’+str(gpu_ids)) #輸入參數為str類型,可指定多張顯卡
model.cuda(‘cuda:1,2’) #指定多張顯卡的一個示例
(2) torch.cuda.set_device()
使用torch.cuda.set_device()可以更方便地將模型和數據加載到對應GPU上, 直接定義模型之前加入一行代碼即可
torch.cuda.set_device(gpu_id) #單卡
torch.cuda.set_device(‘cuda:’+str(gpu_ids)) #可指定多卡
但是這種寫法的優先級低,如果model.cuda()中指定了參數,那麼torch.cuda.set_device()會失效,而且pytorch的官方文檔中明確說明,不建議用戶使用該方法。
第1節和第2節所說的方法同時使用是並不會衝突,而是會疊加。比如在運行代碼時使用
CUDA_VISIBLE_DEVICES=2,3,4,5 python3 train.py
而在代碼內部又指定
model.cuda(1)
loss.cuda(1)
tensor.cuda(1)
那麼代碼會在GPU3上運行。原理是CUDA_VISIBLE_DEVICES使得只有GPU2,3,4,5可見,那麼這4張顯卡,程序就會把它們看成GPU0,1,2,3,.cuda(1)把模型/loss/數據都加載到了程序所以為的GPU1上,則實際使用的顯卡是GPU3。
如果利用.cuda()或torch.cuda.set_device()把模型加載到多個顯卡上,而實際上只使用一張顯卡運行程序的話,那麼程序會把模型加載到第一個顯卡上,比如如果在代碼中指定了
model.cuda(‘cuda:2,1’)
在運行代碼時使用
CUDA_VISIBLE_DEVICES=2,3,4,5 python3 train.py
這一指令,那麼程序最終會在GPU4上運行。
3.多卡數據並行torch.nn.DataParallel
多卡數據並行一般使用
torch.nn.DataParallel(model,device_ids)
其中model是需要運行的模型,device_ids指定部署模型的顯卡,數據類型是list
device_ids中的第一個GPU(即device_ids[0])和model.cuda()或torch.cuda.set_device()中的第一個GPU序號應保持一致,否則會報錯。此外如果兩者的第一個GPU序號都不是0,比如設置為:
model=torch.nn.DataParallel(model,device_ids=[2,3])
model.cuda(2)
那麼程序可以在GPU2和GPU3上正常運行,但是還會佔用GPU0的一部分顯存(大約500M左右),這是由於pytorch本身的bug導致的(截止1.4.0,沒有修復這個bug)。
device_ids的默認值是使用可見的GPU,不設置model.cuda()或torch.cuda.set_device()等效於設置了model.cuda(0)
4. 多卡多線程並行torch.nn.parallel.DistributedDataParallel
(這個我是真的沒有搞懂,,,,)
參考了這篇文章和這個代碼,關於GPU的指定,多卡多線程中有2個地方需要設置
torch.cuda.set_device(args.local_rank)
torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank])
模型/loss/tensor設置為.cuda()或.cuda(args.local_rank)均可,不影響正常運行。
5. 推薦設置方式:
(1) 單卡
使用CUDA_VISIBLE_DEVICES指定GPU,不要使用torch.cuda.set_device(),不要給.cuda()賦值。
(2) 多卡數據並行
直接指定CUDA_VISIBLE_DEVICES,通過調整可見顯卡的順序指定加載模型對應的GPU,不要使用torch.cuda.set_device(),不要給.cuda()賦值,不要給torch.nn.DataParallel中的device_ids賦值。比如想在GPU1,2,3中運行,其中GPU2是存放模型的顯卡,那麼直接設置
CUDA_VISIBLE_DEVICES=2,1,3
(3) 多卡多線程
使用python在GPU上構建和訓練卷積神經網絡
我將對代碼進行補充演練,以構建在數據集上訓練的任何類型的圖像分類器。在這個例子中,我將使用花卉數據集,其中包括102種不同類型的花。需要數據集和代碼都可以私信我。
Pytorch是機器學習和Python上的免費軟件包,非常易於使用。語法模擬numpy,因此,如果你在python中有一些科學計算經驗,那麼會相當有用的。只需幾行代碼,就可以下載預先訓練的數據集,使用定義的變換對圖像進行標準化,然後運行訓練。
創建和擴充數據集
為了增加數據集,我使用’ google_images_download’API 從互聯網上下載了相關圖像。顯然,您可以使用此API不僅可以擴充現有數據集,還可以從頭開始創建自己的數據集。
確保從圖像中挑選出異常值(損壞的文件或偶然出現的無關圖像)。
圖像標準化
為了使圖像具有相同的大小和像素變化,可以使用pytorch的transfors模塊:
轉移學習
從頭開始訓練的模型可能不是最明智的選擇,因為有許多網絡可用於各種數據集。簡單地說,像edge-和其他簡單形狀檢測器等低級特徵對於不同的模型是相似的,即使clasificators是針對不同目的進行訓練的。在本項目中,我使用了一個預訓練網絡Resnet152,只有最後一個完全連接的層重新用於新任務,即使這樣也會產生相當好的效果。
在這裡,我將除最後一層之外的所有層都設置為具有固定權重(requires_grad = False),因此只有最後層中的參數將通過梯度下降進行更新。
訓練模型
下面介紹一下進行訓練的函數:
如何獲得GPU?
當然,對CPU的訓練太慢了。根據我自己的經驗,在GPU僅需要一個小時就可以完成12次訓練周期,但是在CPU上相同數量的訓練周期可能需要花費大約15個小時。
如果您沒有本地可用的GPU,則可以考慮使用雲GPU。為了加速CNN的訓練,我使用了floydhub()上提供的雲GPU 。
這項服務非常指的使用:總有很好的文檔和大量的提示,所以你會很清楚的知道下一步需要如何去做。在floydhub上對於使用GPU的收費也是可以接受的。
首先,需要將數據集上傳到服務器
然後,需要創建項目。需要在計算機上安裝floydhub客戶端,將數據集上載到其網站並在終端中運行以下命令:
其中’username’是您的登錄名,’i’是數據集所在的文件夾。
這樣子在訓練網絡時就會很輕鬆了
結果和改進想法
得到的模型在數據集上訓練了1.5小時,並在驗證數據集上達到了95%的準確度。
caffe python代碼怎麼用 gpu運行
編譯和安裝Caffe 。。。但我在編譯caffe時 輸入make all 指令時報錯 :提示找不到hdf5.h 我百度後 按照這個解決了。這樣make all 成功 make test也成功 make runtest也成功。 再開始其第3步:增加python支持這步 開始我看不清 就從這裡開始參考: 編譯python時: make pycaffe報錯:找不到arrayobject.h 解決辦法:sudo apt-get install python-numpy 這樣就解決了。這樣第3步的幾條指令均成功。再開始第4步 第4.2步報錯說:pip 找不到指令 於是我在終端輸入sudo apt-get install python-pip即解決了。 接着執行4.2步 第一個ipython[all]裝時失敗了 我就先裝後面的幾個 有的成功 有的失敗 失敗的是protobuf和skimage 解決辦法是:自己
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/242222.html