最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pytorch 高效使用GPU的操作

 更新時(shí)間:2020年06月27日 10:47:02   作者:血_影  
這篇文章主要介紹了Pytorch 高效使用GPU的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

前言

深度學(xué)習(xí)涉及很多向量或多矩陣運(yùn)算,如矩陣相乘、矩陣相加、矩陣-向量乘法等。深層模型的算法,如BP,Auto-Encoder,CNN等,都可以寫成矩陣運(yùn)算的形式,無須寫成循環(huán)運(yùn)算。然而,在單核CPU上執(zhí)行時(shí),矩陣運(yùn)算會(huì)被展開成循環(huán)的形式,本質(zhì)上還是串行執(zhí)行。GPU(Graphic Process Units,圖形處理器)的眾核體系結(jié)構(gòu)包含幾千個(gè)流處理器,可將矩陣運(yùn)算并行化執(zhí)行,大幅縮短計(jì)算時(shí)間。隨著NVIDIA、AMD等公司不斷推進(jìn)其GPU的大規(guī)模并行架構(gòu),面向通用計(jì)算的GPU已成為加速可并行應(yīng)用程序的重要手段。得益于GPU眾核(many-core)體系結(jié)構(gòu),程序在GPU系統(tǒng)上的運(yùn)行速度相較于單核CPU往往提升幾十倍乃至上千倍。

目前,GPU已經(jīng)發(fā)展到了較為成熟的階段。利用GPU來訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),可以充分發(fā)揮其數(shù)以千計(jì)計(jì)算核心的能力,在使用海量訓(xùn)練數(shù)據(jù)的場(chǎng)景下,所耗費(fèi)的時(shí)間大幅縮短,占用的服務(wù)器也更少。如果對(duì)適當(dāng)?shù)纳疃壬窠?jīng)網(wǎng)絡(luò)進(jìn)行合理優(yōu)化,一塊GPU卡相當(dāng)于數(shù)十甚至上百臺(tái)CPU服務(wù)器的計(jì)算能力,因此GPU已經(jīng)成為業(yè)界在深度學(xué)習(xí)模型訓(xùn)練方面的首選解決方案。

如何使用GPU?現(xiàn)在很多深度學(xué)習(xí)工具都支持GPU運(yùn)算,使用時(shí)只要簡(jiǎn)單配置即可。Pytorch支持GPU,可以通過to(device)函數(shù)來將數(shù)據(jù)從內(nèi)存中轉(zhuǎn)移到GPU顯存,如果有多個(gè)GPU還可以定位到哪個(gè)或哪些GPU。Pytorch一般把GPU作用于張量(Tensor)或模型(包括torch.nn下面的一些網(wǎng)絡(luò)模型以及自己創(chuàng)建的模型)等數(shù)據(jù)結(jié)構(gòu)上。

單GPU加速

使用GPU之前,需要確保GPU是可以使用,可通過torch.cuda.is_available()的返回值來進(jìn)行判斷。返回True則具有能夠使用的GPU。

通過torch.cuda.device_count()可以獲得能夠使用的GPU數(shù)量。

如何查看平臺(tái)GPU的配置信息?在命令行輸入命令nvidia-smi即可 (適合于Linux或Windows環(huán)境)。圖5-13是GPU配置信息樣例,從中可以看出共有2個(gè)GPU。

圖 GPU配置信息

把數(shù)據(jù)從內(nèi)存轉(zhuǎn)移到GPU,一般針對(duì)張量(我們需要的數(shù)據(jù))和模型。 對(duì)張量(類型為FloatTensor或者是LongTensor等),一律直接使用方法.to(device)或.cuda()即可。

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#或device = torch.device("cuda:0")
device1 = torch.device("cuda:1") 
for batch_idx, (img, label) in enumerate(train_loader):
  img=img.to(device)
  label=label.to(device)

對(duì)于模型來說,也是同樣的方式,使用.to(device)或.cuda來將網(wǎng)絡(luò)放到GPU顯存。

#實(shí)例化網(wǎng)絡(luò)
model = Net()
model.to(device)  #使用序號(hào)為0的GPU
#或model.to(device1) #使用序號(hào)為1的GPU

多GPU加速

這里我們介紹單主機(jī)多GPUs的情況,單機(jī)多GPUs主要采用的DataParallel函數(shù),而不是DistributedParallel,后者一般用于多主機(jī)多GPUs,當(dāng)然也可用于單機(jī)多GPU。

使用多卡訓(xùn)練的方式有很多,當(dāng)然前提是我們的設(shè)備中存在兩個(gè)及以上的GPU。

使用時(shí)直接用model傳入torch.nn.DataParallel函數(shù)即可,如下代碼:

#對(duì)模型

net = torch.nn.DataParallel(model)

這時(shí),默認(rèn)所有存在的顯卡都會(huì)被使用。

如果你的電腦有很多顯卡,但只想利用其中一部分,如只使用編號(hào)為0、1、3、4的四個(gè)GPU,那么可以采用以下方式:

#假設(shè)有4個(gè)GPU,其id設(shè)置如下
device_ids =[0,1,2,3]
#對(duì)數(shù)據(jù)
input_data=input_data.to(device=device_ids[0])
#對(duì)于模型
net = torch.nn.DataParallel(model)
net.to(device)

或者

os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(map(str, [0,1,2,3]))

net = torch.nn.DataParallel(model)

其中CUDA_VISIBLE_DEVICES 表示當(dāng)前可以被Pytorch程序檢測(cè)到的GPU。

下面為單機(jī)多GPU的實(shí)現(xiàn)代碼。

背景說明

這里使用波士頓房?jī)r(jià)數(shù)據(jù)為例,共506個(gè)樣本,13個(gè)特征。數(shù)據(jù)劃分成訓(xùn)練集和測(cè)試集,然后用data.DataLoader轉(zhuǎn)換為可批加載的方式。采用nn.DataParallel并發(fā)機(jī)制,環(huán)境有2個(gè)GPU。當(dāng)然,數(shù)據(jù)量很小,按理不宜用nn.DataParallel,這里只是為了說明使用方法。

加載數(shù)據(jù)

boston = load_boston()
X,y  = (boston.data, boston.target)
 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
#組合訓(xùn)練數(shù)據(jù)及標(biāo)簽
myset = list(zip(X_train,y_train))

把數(shù)據(jù)轉(zhuǎn)換為批處理加載方式批次大小為128,打亂數(shù)據(jù)

from torch.utils import data
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
dtype = torch.FloatTensor
train_loader = data.DataLoader(myset,batch_size=128,shuffle=True)

定義網(wǎng)絡(luò)

class Net1(nn.Module):
  """
  使用sequential構(gòu)建網(wǎng)絡(luò),Sequential()函數(shù)的功能是將網(wǎng)絡(luò)的層組合到一起
  """
  def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
    super(Net1, self).__init__()
    self.layer1 = torch.nn.Sequential(nn.Linear(in_dim, n_hidden_1))
    self.layer2 = torch.nn.Sequential(nn.Linear(n_hidden_1, n_hidden_2))
    self.layer3 = torch.nn.Sequential(nn.Linear(n_hidden_2, out_dim))
    
 
  def forward(self, x):
    x1 = F.relu(self.layer1(x))
    x1 = F.relu(self.layer2(x1))
    x2 = self.layer3(x1)
    #顯示每個(gè)GPU分配的數(shù)據(jù)大小
    print("\tIn Model: input size", x.size(),"output size", x2.size())
    return x2

把模型轉(zhuǎn)換為多GPU并發(fā)處理格式

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#實(shí)例化網(wǎng)絡(luò)
model = Net1(13, 16, 32, 1)
if torch.cuda.device_count() > 1:
  print("Let's use", torch.cuda.device_count(), "GPUs")
  # dim = 0 [64, xxx] -> [32, ...], [32, ...] on 2GPUs
  model = nn.DataParallel(model)
model.to(device)

運(yùn)行結(jié)果

Let's use 2 GPUs
DataParallel(
(module): Net1(
(layer1): Sequential(
(0): Linear(in_features=13, out_features=16, bias=True)
)
(layer2): Sequential(
(0): Linear(in_features=16, out_features=32, bias=True)
)
(layer3): Sequential(
(0): Linear(in_features=32, out_features=1, bias=True)
)
)
)

選擇優(yōu)化器及損失函數(shù)

optimizer_orig = torch.optim.Adam(model.parameters(), lr=0.01)

loss_func = torch.nn.MSELoss()

模型訓(xùn)練,并可視化損失值

from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter(log_dir='logs')
for epoch in range(100):    
  model.train()
  for data,label in train_loader:
    input = data.type(dtype).to(device)
    label = label.type(dtype).to(device)
    output = model(input)    
    loss = loss_func(output, label)
    # 反向傳播
    optimizer_orig.zero_grad()
    loss.backward()
    optimizer_orig.step()
    print("Outside: input size", input.size() ,"output_size", output.size())
  writer.add_scalar('train_loss_paral',loss, epoch)

運(yùn)行的部分結(jié)果

In Model: input size torch.Size([64, 13]) output size torch.Size([64, 1])
In Model: input size torch.Size([64, 13]) output size torch.Size([64, 1])
Outside: input size torch.Size([128, 13]) output_size torch.Size([128, 1])
In Model: input size torch.Size([64, 13]) output size torch.Size([64, 1])
In Model: input size torch.Size([64, 13]) output size torch.Size([64, 1])
Outside: input size torch.Size([128, 13]) output_size torch.Size([128, 1])

從運(yùn)行結(jié)果可以看出,一個(gè)批次數(shù)據(jù)(batch-size=128)拆分成兩份,每份大小為64,分別放在不同的GPU上。此時(shí)用GPU監(jiān)控也可發(fā)現(xiàn),兩個(gè)GPU都同時(shí)在使用。

8. 通過web查看損失值的變化情況

圖 并發(fā)運(yùn)行訓(xùn)練損失值變化情況

圖形中出現(xiàn)較大振幅,是由于采用批次處理,而且數(shù)據(jù)沒有做任何預(yù)處理,對(duì)數(shù)據(jù)進(jìn)行規(guī)范化應(yīng)該更平滑一些,大家可以嘗試一下。

單機(jī)多GPU也可使用DistributedParallel,它多用于分布式訓(xùn)練,但也可以用在單機(jī)多GPU的訓(xùn)練,配置比使用nn.DataParallel稍微麻煩一點(diǎn),但是訓(xùn)練速度和效果更好一點(diǎn)。具體配置為:

#初始化使用nccl后端
torch.distributed.init_process_group(backend="nccl")
#模型并行化
model=torch.nn.parallel.DistributedDataParallel(model)

單機(jī)運(yùn)行時(shí)使用下面方法啟動(dòng)

python -m torch.distributed.launch main.py

使用GPU注意事項(xiàng)

使用GPU可以提升我們訓(xùn)練的速度,如果使用不當(dāng),可能影響使用效率,具體使用時(shí)要注意以下幾點(diǎn):

GPU的數(shù)量盡量為偶數(shù),奇數(shù)的GPU有可能會(huì)出現(xiàn)異常中斷的情況;

GPU很快,但數(shù)據(jù)量較小時(shí),效果可能沒有單GPU好,甚至還不如CPU;

如果內(nèi)存不夠大,使用多GPU訓(xùn)練的時(shí)候可通過設(shè)置pin_memory為False,當(dāng)然使用精度稍微低一點(diǎn)的數(shù)據(jù)類型有時(shí)也效果。

以上這篇Pytorch 高效使用GPU的操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Numpy中的shape、reshape函數(shù)的區(qū)別

    Numpy中的shape、reshape函數(shù)的區(qū)別

    本文主要介紹了Numpy中的shape、reshape函數(shù)的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Python與數(shù)據(jù)庫交互:入門指南

    Python與數(shù)據(jù)庫交互:入門指南

    這篇文章主要介紹了Python與數(shù)據(jù)庫交互:入門指南的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • Python使用re模塊驗(yàn)證危險(xiǎn)字符

    Python使用re模塊驗(yàn)證危險(xiǎn)字符

    這篇文章主要介紹了如何基于python驗(yàn)證危險(xiǎn)字符,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • django url到views參數(shù)傳遞的實(shí)例

    django url到views參數(shù)傳遞的實(shí)例

    今天小編就為大家分享一篇django url到views參數(shù)傳遞的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • PyQt5 pyqt多線程操作入門

    PyQt5 pyqt多線程操作入門

    本篇文章主要介紹了PyQt5 pyqt多線程操作入門,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • 對(duì)python打亂數(shù)據(jù)集中X,y標(biāo)簽對(duì)的方法詳解

    對(duì)python打亂數(shù)據(jù)集中X,y標(biāo)簽對(duì)的方法詳解

    今天就為大家分享一篇對(duì)python打亂數(shù)據(jù)集中X,y標(biāo)簽對(duì)的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python程序打包工具py2exe和PyInstaller詳解

    Python程序打包工具py2exe和PyInstaller詳解

    這篇文章主要介紹了Python程序打包工具py2exe和PyInstaller詳解,如果可以提前將程序打包成 Windows平臺(tái)的 .exe 文件或者是Linux下的 .sh 腳本,那么使用起來就會(huì)方便很多,需要的朋友可以參考下
    2019-06-06
  • python快速進(jìn)階利用Tkinter定制一個(gè)信息提示框

    python快速進(jìn)階利用Tkinter定制一個(gè)信息提示框

    這篇文章主要介紹了python快速進(jìn)階利用Tkinter定制一個(gè)信息提示框,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 解決tensorflow 與keras 混用之坑

    解決tensorflow 與keras 混用之坑

    這篇文章主要介紹了解決tensorflow 與keras 混用之坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Tensorflow實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的詳細(xì)代碼

    Tensorflow實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的詳細(xì)代碼

    這篇文章主要為大家詳細(xì)介紹了Tensorflow實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的詳細(xì)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評(píng)論

平邑县| 盐池县| 平定县| 乌审旗| 东乌珠穆沁旗| 博乐市| 苏尼特右旗| 东光县| 渝中区| 台中市| 乌拉特后旗| 南溪县| 尖扎县| 商南县| 布尔津县| 卢氏县| 安阳县| 廊坊市| 朔州市| 鄂伦春自治旗| 沙雅县| 大足县| 林芝县| 札达县| 日土县| 莲花县| 宿州市| 郁南县| 印江| 天峻县| 乐山市| 江源县| 保德县| 会宁县| 北碚区| 汾西县| 洛宁县| 收藏| 年辖:市辖区| 固镇县| 襄汾县|