問題:
命令行出現CUDA_VISIBLE_DEVICES=0 python trainer.py這種命令
這是Linux可以的,但是Windows不行。
解決方案:
這條命令的含義是指定某個GPU來運行程序,我們可以在程序開頭添加指定GPU的代碼,效果是一樣的:
import osos.environ["CUDA_VISIBLE_DEVICES"]='0'
或者在程序外部cmd命令行里執行以下命令,設置臨時變量:
set CUDA_VISIBLE_DEVICES=0
或者直接添加到環境變量,同時記得刪除原命令的CUDA_VISIBLE_DEVICES=0
GPU卡號編碼規則:
當主機有多個GPU設備時,設置CUDA_VISIBLE_DEVICES 環境變量可以改變CUDA程序所能使用的GPU設備。假如主機中有4塊GPU設備,那么這些GPU設備的默認編號為[0,1,2,3],在默認情況下,編號為0的顯卡為第一塊卡。多卡設置規則如下:
備注規則:
CUDA應用運行時,CUDA將遍歷當前可見的設備,并從零開始為可見設備編號。
第一種情況,卡1設置為主卡,但CUDA遍歷時會設置為可見編號0。
最后一種情況,設備0,2,3將顯示為設備0,1,2。
如果將字符串的順序更改為“2,3,0”,則設備2,3,0將分別被設置為0,1,2。
如果為CUDA_VISIBLE_DEVICES 設置了不存在的設備,所有實際設備將被隱藏,CUDA 應用將無法使用GPU設備;如果設備序列是存在和不存在設備的混合,那么不存在設備前的所有存在設備將被重新編號,不存在設備之后的所有設備將被屏蔽。
當前可見的(重新編號后的)設備可使用CUDA 程序來查看,代碼如下:
import torch
print(torch.cuda.current_device())
1. 臨時設置
1.1 命令提前設置環境變量
#Linux: 后面的值為要使用的GPU編號,正常的話是從0開始
export CUDA_VISIBLE_DEVICES=0
#windows:
set CUDA_VISIBLE_DEVICES=0
1.2 Python代碼中設置環境變量
import os
# 僅設置一塊可見
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
# 設置多塊可見
os.environ['CUDA_VISIBLE_DEVICES'] = '0,2,3'
1.3 命令行前指定
# 以下方法linux可用, windows 需要提前設置環境變量
CUDA_VISIBLE_DEVICES=0 python some-app.py
2. 永久設置
2.1 linux
通過編輯 ~/.bashrc 文件來永久設置,系統啟動時將加載 ~/.bashrc 文件,達到自動設置的目的。
export CUDA_VISIBLE_DEVICES=1,2,3
然后通過 如下命令刷新環境變量
. ~/.bashrc
2.2 windows
添加到環境變量,同時記得刪除原命令的CUDA_VISIBLE_DEVICES=0
3. 使用torch.cuda接口
import torch
#當前可見的(重新編號后的)設備可使用如下代碼來查看
print(torch.cuda.current_device())torch.cuda.set_device(0)
#或者 使用pytorch的并行GPU接口
net = torch.nn.DataParallel(model, device_ids=[0])#確定GPU的個數
count = torch.cuda.device_count()
#決策使用哪個設備
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#把一個模型放到GPU上device = torch.device("cuda:0")
model.to(device)
4. 使用torch.nn.DataParallel
多卡數據并行一般使用torch.nn.DataParallel
torch.nn.DataParallel(model,device_ids)'''使用的GPU一定是編號連續的其中model是需要運行的模型,device_ids指定部署模型的顯卡,數據類型是list/device。device_ids中的第一個GPU(即device_ids[0])和model.cuda()或torch.cuda.set_device()中的第一個GPU序號應保持一致,否則會報錯
舉例:
'''
torch.nn.DataParallel(model, device_ids=device_ids)
torch.nn.DataParallel(modul, device_ids=[x1,x2,x3,x4,x5,x6,x7])torch.nn.DataParallel(model,device_ids = range(torch.cuda.device_count()) )
此外如果兩者的第一個GPU序號都不是0,比如設置為:
'''
如下代碼,程序可以在GPU2和GPU3上正常運行。
device_ids的默認值是使用可見的GPU,不設置model.cuda()或torch.cuda.set_device()等效于設置了model.cuda(0)
'''
model=torch.nn.DataParallel(model,device_ids=[2,3])
model.cuda(2)#模型綁定GPU代碼
model = model.cuda()
device_ids = [0, 1]
model = torch.nn.DataParallel(model, device_ids=device_ids)
參考:
【疑難雜癥】‘CUDA_VISIBLE_DEVICES‘ 不是內部或外部命令,也不是可運行的程序或批處理文件。
CUDA 指定設備的方法,CUDA_VISIBLE_DEVICES 設置當前pytorch程序使用那些GPU設備