精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PyTorch教程-13.3. 自動(dòng)并行

jf_pJlTbmA9 ? 來源:PyTorch ? 作者:PyTorch ? 2023-06-05 15:44 ? 次閱讀

深度學(xué)習(xí)框架(例如 MXNet 和 PyTorch)在后端自動(dòng)構(gòu)建計(jì)算圖。使用計(jì)算圖,系統(tǒng)了解所有依賴關(guān)系,并可以選擇性地并行執(zhí)行多個(gè)非相互依賴的任務(wù)以提高速度。例如,第 13.2 節(jié)中的圖 13.2.2 獨(dú)立地初始化了兩個(gè)變量。因此,系統(tǒng)可以選擇并行執(zhí)行它們。

通常,單個(gè)運(yùn)算符將使用所有 CPU 或單個(gè) GPU 上的所有計(jì)算資源。例如,dot算子將使用所有 CPU 上的所有內(nèi)核(和線程),即使在一臺(tái)機(jī)器上有多個(gè) CPU 處理器。這同樣適用于單個(gè) GPU。因此,并行化對(duì)于單設(shè)備計(jì)算機(jī)不是很有用。有了多個(gè)設(shè)備,事情就更重要了。雖然并行化通常在多個(gè) GPU 之間最相關(guān),但添加本地 CPU 會(huì)略微提高性能。例如,參見 Hadjis等人。( 2016 年)專注于訓(xùn)練結(jié)合 GPU 和 CPU 的計(jì)算機(jī)視覺模型。借助自動(dòng)并行化框架的便利,我們可以在幾行 Python 代碼中實(shí)現(xiàn)相同的目標(biāo)。更廣泛地說,我們對(duì)自動(dòng)并行計(jì)算的討論集中在使用 CPU 和 GPU 的并行計(jì)算,以及計(jì)算和通信的并行化。

請(qǐng)注意,我們至少需要兩個(gè) GPU 才能運(yùn)行本節(jié)中的實(shí)驗(yàn)。

import torch
from d2l import torch as d2l

from mxnet import np, npx
from d2l import mxnet as d2l

npx.set_np()

13.3.1。GPU 上的并行計(jì)算

讓我們首先定義一個(gè)要測(cè)試的參考工作負(fù)載:run 下面的函數(shù)使用分配到兩個(gè)變量中的數(shù)據(jù)在我們選擇的設(shè)備上執(zhí)行 10 次矩陣-矩陣乘法:x_gpu1和 x_gpu2。

devices = d2l.try_all_gpus()
def run(x):
  return [x.mm(x) for _ in range(50)]

x_gpu1 = torch.rand(size=(4000, 4000), device=devices[0])
x_gpu2 = torch.rand(size=(4000, 4000), device=devices[1])

現(xiàn)在我們將函數(shù)應(yīng)用于數(shù)據(jù)。為了確保緩存不會(huì)在結(jié)果中發(fā)揮作用,我們通過在測(cè)量之前對(duì)其中任何一個(gè)執(zhí)行單次傳遞來預(yù)熱設(shè)備。torch.cuda.synchronize() 等待 CUDA 設(shè)備上所有流中的所有內(nèi)核完成。它接受一個(gè)device參數(shù),即我們需要同步的設(shè)備。current_device()如果設(shè)備參數(shù)為(默認(rèn)),則它使用由 給出的當(dāng)前設(shè)備None。

run(x_gpu1)
run(x_gpu2) # Warm-up all devices
torch.cuda.synchronize(devices[0])
torch.cuda.synchronize(devices[1])

with d2l.Benchmark('GPU1 time'):
  run(x_gpu1)
  torch.cuda.synchronize(devices[0])

with d2l.Benchmark('GPU2 time'):
  run(x_gpu2)
  torch.cuda.synchronize(devices[1])

GPU1 time: 0.4967 sec
GPU2 time: 0.5151 sec

如果我們刪除synchronize兩個(gè)任務(wù)之間的語(yǔ)句,系統(tǒng)就可以自由地自動(dòng)在兩個(gè)設(shè)備上并行計(jì)算。

with d2l.Benchmark('GPU1 & GPU2'):
  run(x_gpu1)
  run(x_gpu2)
  torch.cuda.synchronize()

GPU1 & GPU2: 0.5000 sec

devices = d2l.try_all_gpus()
def run(x):
  return [x.dot(x) for _ in range(50)]

x_gpu1 = np.random.uniform(size=(4000, 4000), ctx=devices[0])
x_gpu2 = np.random.uniform(size=(4000, 4000), ctx=devices[1])

Now we apply the function to the data. To ensure that caching does not play a role in the results we warm up the devices by performing a single pass on either of them prior to measuring.

run(x_gpu1) # Warm-up both devices
run(x_gpu2)
npx.waitall()

with d2l.Benchmark('GPU1 time'):
  run(x_gpu1)
  npx.waitall()

with d2l.Benchmark('GPU2 time'):
  run(x_gpu2)
  npx.waitall()

GPU1 time: 0.5233 sec
GPU2 time: 0.5158 sec

If we remove the waitall statement between both tasks the system is free to parallelize computation on both devices automatically.

with d2l.Benchmark('GPU1 & GPU2'):
  run(x_gpu1)
  run(x_gpu2)
  npx.waitall()

GPU1 & GPU2: 0.5214 sec

在上述情況下,總執(zhí)行時(shí)間小于其各部分的總和,因?yàn)樯疃葘W(xué)習(xí)框架會(huì)自動(dòng)安排兩個(gè) GPU 設(shè)備上的計(jì)算,而不需要代表用戶編寫復(fù)雜的代碼。

13.3.2。并行計(jì)算與通信

在許多情況下,我們需要在不同設(shè)備之間移動(dòng)數(shù)據(jù),比如在 CPU 和 GPU 之間,或者在不同 GPU 之間。例如,當(dāng)我們想要執(zhí)行分布式優(yōu)化時(shí)會(huì)發(fā)生這種情況,我們需要在多個(gè)加速器卡上聚合梯度。讓我們通過在 GPU 上計(jì)算然后將結(jié)果復(fù)制回 CPU 來對(duì)此進(jìn)行模擬

def copy_to_cpu(x, non_blocking=False):
  return [y.to('cpu', non_blocking=non_blocking) for y in x]

with d2l.Benchmark('Run on GPU1'):
  y = run(x_gpu1)
  torch.cuda.synchronize()

with d2l.Benchmark('Copy to CPU'):
  y_cpu = copy_to_cpu(y)
  torch.cuda.synchronize()

Run on GPU1: 0.5019 sec
Copy to CPU: 2.7168 sec

這有點(diǎn)低效。請(qǐng)注意,我們可能已經(jīng)開始將 的部分內(nèi)容復(fù)制y到 CPU,而列表的其余部分仍在計(jì)算中。這種情況會(huì)發(fā)生,例如,當(dāng)我們計(jì)算小批量的(反向傳播)梯度時(shí)。一些參數(shù)的梯度將比其他參數(shù)更早可用。因此,在 GPU 仍在運(yùn)行時(shí)開始使用 PCI-Express 總線帶寬對(duì)我們有利。在 PyTorch 中,幾個(gè)函數(shù)(例如to()和)copy_()承認(rèn)一個(gè)顯式non_blocking參數(shù),它允許調(diào)用者在不需要時(shí)繞過同步。設(shè)置non_blocking=True 允許我們模擬這種情況。

with d2l.Benchmark('Run on GPU1 and copy to CPU'):
  y = run(x_gpu1)
  y_cpu = copy_to_cpu(y, True)
  torch.cuda.synchronize()

Run on GPU1 and copy to CPU: 2.4682 sec

def copy_to_cpu(x):
  return [y.copyto(npx.cpu()) for y in x]

with d2l.Benchmark('Run on GPU1'):
  y = run(x_gpu1)
  npx.waitall()

with d2l.Benchmark('Copy to CPU'):
  y_cpu = copy_to_cpu(y)
  npx.waitall()

Run on GPU1: 0.5796 sec
Copy to CPU: 3.0989 sec

This is somewhat inefficient. Note that we could already start copying parts of y to the CPU while the remainder of the list is still being computed. This situation occurs, e.g., when we compute the gradient on a minibatch. The gradients of some of the parameters will be available earlier than that of others. Hence it works to our advantage to start using PCI-Express bus bandwidth while the GPU is still running. Removing waitall between both parts allows us to simulate this scenario.

with d2l.Benchmark('Run on GPU1 and copy to CPU'):
  y = run(x_gpu1)
  y_cpu = copy_to_cpu(y)
  npx.waitall()

Run on GPU1 and copy to CPU: 3.3488 sec

兩個(gè)操作所需的總時(shí)間(正如預(yù)期的那樣)小于它們各部分的總和。請(qǐng)注意,此任務(wù)不同于并行計(jì)算,因?yàn)樗褂貌煌馁Y源:CPU 和 GPU 之間的總線。事實(shí)上,我們可以同時(shí)在兩個(gè)設(shè)備上進(jìn)行計(jì)算和通信。如上所述,計(jì)算和通信之間存在依賴關(guān)系:y[i]必須在將其復(fù)制到 CPU 之前進(jìn)行計(jì)算。幸運(yùn)的是,系統(tǒng)可以y[i-1]邊計(jì)算邊 復(fù)制y[i],以減少總運(yùn)行時(shí)間。

我們以在一個(gè) CPU 和兩個(gè) GPU 上進(jìn)行訓(xùn)練時(shí)簡(jiǎn)單的兩層 MLP 的計(jì)算圖及其依賴關(guān)系的圖示作為結(jié)尾,如圖13.3.1所示。手動(dòng)安排由此產(chǎn)生的并行程序?qū)⒎浅M纯唷_@就是擁有基于圖形的計(jì)算后端進(jìn)行優(yōu)化的優(yōu)勢(shì)所在。

poYBAGR9OqiAEhMjADhnzKcOtWI169.svg

圖 13.3.1兩層 MLP 在一個(gè) CPU 和兩個(gè) GPU 上的計(jì)算圖及其依賴關(guān)系。

13.3.3。概括

現(xiàn)代系統(tǒng)具有多種設(shè)備,例如多個(gè) GPU 和 CPU。它們可以并行、異步使用。

現(xiàn)代系統(tǒng)還具有多種通信資源,例如 PCI Express、存儲(chǔ)(通常是固態(tài)驅(qū)動(dòng)器或通過網(wǎng)絡(luò))和網(wǎng)絡(luò)帶寬。它們可以并聯(lián)使用以達(dá)到最高效率。

后端可以通過自動(dòng)并行計(jì)算和通信來提高性能。

13.3.4。練習(xí)

run在本節(jié)定義的函數(shù)中執(zhí)行了八個(gè)操作。它們之間沒有依賴關(guān)系。設(shè)計(jì)一個(gè)實(shí)驗(yàn),看看深度學(xué)習(xí)框架是否會(huì)自動(dòng)并行執(zhí)行它們。

當(dāng)單個(gè)操作員的工作量足夠小時(shí),并行化甚至可以在單個(gè) CPU 或 GPU 上提供幫助。設(shè)計(jì)一個(gè)實(shí)驗(yàn)來驗(yàn)證這一點(diǎn)。

設(shè)計(jì)一個(gè)實(shí)驗(yàn),在 CPU、GPU 上使用并行計(jì)算,并在兩個(gè)設(shè)備之間進(jìn)行通信。

使用 NVIDIA 的Nsight等調(diào)試器 來驗(yàn)證您的代碼是否有效。

設(shè)計(jì)包含更復(fù)雜數(shù)據(jù)依賴關(guān)系的計(jì)算任務(wù),并運(yùn)行實(shí)驗(yàn)以查看是否可以在提高性能的同時(shí)獲得正確的結(jié)果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5493

    瀏覽量

    120979
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    803

    瀏覽量

    13150
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問這是XC6SLX150-2CSG484I設(shè)備中此Fifo的最大頻率嗎?

    of this Fifo in a XC6SLX150-2CSG484I Device ?Analyze Timing with Floorplanner gives me no timing Results.I am using ISE 13.3. Any Ideas ?
    發(fā)表于 06-20 15:35

    使用ISE 13.3更改8.1 FIFO IP內(nèi)核中的一些參數(shù)可能有什么問題?

    in 8.1 FIFO IP core with ISE 13.3. When I open the project in coregen it warns that the logiccore
    發(fā)表于 06-26 07:52

    Pytorch自動(dòng)求導(dǎo)示例

    Pytorch自動(dòng)微分的幾個(gè)例子
    發(fā)表于 08-09 11:56

    PyTorch如何入門

    PyTorch 入門實(shí)戰(zhàn)(一)——Tensor
    發(fā)表于 06-01 09:58

    iOS13.3和iPadOS13.3對(duì)比,都有哪些差異

    蘋果發(fā)布 iOS 13.3 和 iPadOS 13.3,距離 iOS/iPadOS 13.2.3 發(fā)布相隔兩周時(shí)間。可以通過訪問設(shè)置-通用-軟件更新完成 OTA 升級(jí)。 iOS 13.3
    的頭像 發(fā)表于 10-24 09:56 ?3584次閱讀

    基于PyTorch的深度學(xué)習(xí)入門教程之PyTorch簡(jiǎn)單知識(shí)

    本文參考PyTorch官網(wǎng)的教程,分為五個(gè)基本模塊來介紹PyTorch。為了避免文章過長(zhǎng),這五個(gè)模塊分別在五篇博文中介紹。 Part1:PyTorch簡(jiǎn)單知識(shí) Part2:PyTorch
    的頭像 發(fā)表于 02-16 15:20 ?2221次閱讀

    基于PyTorch的深度學(xué)習(xí)入門教程之PyTorch自動(dòng)梯度計(jì)算

    計(jì)算 Part3:使用PyTorch構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò) Part4:訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)分類器 Part5:數(shù)據(jù)并行化 本文是關(guān)于Part2的內(nèi)容。 Part2:PyTorch自動(dòng)梯度計(jì)算
    的頭像 發(fā)表于 02-16 15:26 ?1992次閱讀

    基于PyTorch的深度學(xué)習(xí)入門教程之使用PyTorch構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)

    PyTorch自動(dòng)梯度計(jì)算 Part3:使用PyTorch構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò) Part4:訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)分類器 Part5:數(shù)據(jù)并行化 本文是關(guān)于Part3的內(nèi)容。 Part3:使
    的頭像 發(fā)表于 02-15 09:40 ?2073次閱讀

    基于PyTorch的深度學(xué)習(xí)入門教程之DataParallel使用多GPU

    前言 本文參考PyTorch官網(wǎng)的教程,分為五個(gè)基本模塊來介紹PyTorch。為了避免文章過長(zhǎng),這五個(gè)模塊分別在五篇博文中介紹。 Part1:PyTorch簡(jiǎn)單知識(shí) Part2:PyTorch
    的頭像 發(fā)表于 02-15 09:55 ?4068次閱讀

    基于PyTorch的深度學(xué)習(xí)入門教程之PyTorch重點(diǎn)綜合實(shí)踐

    前言 PyTorch提供了兩個(gè)主要特性: (1) 一個(gè)n維的Tensor,與numpy相似但是支持GPU運(yùn)算。 (2) 搭建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)的自動(dòng)微分功能。 我們將會(huì)使用一個(gè)全連接的ReLU網(wǎng)絡(luò)作為
    的頭像 發(fā)表于 02-15 10:01 ?1741次閱讀

    PyTorch 的 Autograd 機(jī)制和使用

    PyTorch 作為一個(gè)深度學(xué)習(xí)平臺(tái),在深度學(xué)習(xí)任務(wù)中比 NumPy 這個(gè)科學(xué)計(jì)算庫(kù)強(qiáng)在哪里呢?我覺得一是 PyTorch 提供了自動(dòng)求導(dǎo)機(jī)制,二是對(duì) GPU 的支持。由此可見,自動(dòng)
    的頭像 發(fā)表于 08-15 09:37 ?1075次閱讀

    PyTorch教程2.5之自動(dòng)微分

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程2.5之自動(dòng)微分.pdf》資料免費(fèi)下載
    發(fā)表于 06-05 11:38 ?0次下載
    <b class='flag-5'>PyTorch</b>教程2.5之<b class='flag-5'>自動(dòng)</b>微分

    PyTorch教程13.3自動(dòng)并行

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程13.3自動(dòng)并行.pdf》資料免費(fèi)下載
    發(fā)表于 06-05 14:47 ?0次下載
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>13.3</b>之<b class='flag-5'>自動(dòng)</b><b class='flag-5'>并行</b>

    基于PyTorch的模型并行分布式訓(xùn)練Megatron解析

    NVIDIA Megatron 是一個(gè)基于 PyTorch 的分布式訓(xùn)練框架,用來訓(xùn)練超大Transformer語(yǔ)言模型,其通過綜合應(yīng)用了數(shù)據(jù)并行,Tensor并行和Pipeline并行
    的頭像 發(fā)表于 10-23 11:01 ?2788次閱讀
    基于<b class='flag-5'>PyTorch</b>的模型<b class='flag-5'>并行</b>分布式訓(xùn)練Megatron解析

    pytorch怎么在pycharm中運(yùn)行

    第一部分:PyTorch和PyCharm的安裝 1.1 安裝PyTorch PyTorch是一個(gè)開源的機(jī)器學(xué)習(xí)庫(kù),用于構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)。要在PyCharm中使用PyTorch,首先需
    的頭像 發(fā)表于 08-01 16:22 ?1242次閱讀