亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

電子發(fā)燒友App

硬聲App

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

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

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>PyTorch教程13.3之自動并行

PyTorch教程13.3之自動并行

2023-06-05 | pdf | 0.44 MB | 次下載 | 免費(fèi)

資料介紹

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

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

請注意,我們至少需要兩個 GPU 才能運(yùn)行本節(jié)中的實驗。

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 上的并行計算

讓我們首先定義一個要測試的參考工作負(fù)載:run 下面的函數(shù)使用分配到兩個變量中的數(shù)據(jù)在我們選擇的設(shè)備上執(zhí)行 10 次矩陣-矩陣乘法:x_gpu1x_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ù)。為了確保緩存不會在結(jié)果中發(fā)揮作用,我們通過在測量之前對其中任何一個執(zhí)行單次傳遞來預(yù)熱設(shè)備。torch.cuda.synchronize() 等待 CUDA 設(shè)備上所有流中的所有內(nèi)核完成。它接受一個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兩個任務(wù)之間的語句,系統(tǒng)就可以自由地自動在兩個設(shè)備上并行計算。

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í)行時間小于其各部分的總和,因為深度學(xué)習(xí)框架會自動安排兩個 GPU 設(shè)備上的計算,而不需要代表用戶編寫復(fù)雜的代碼。

13.3.2。并行計算與通信

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

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

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

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

https://file.elecfans.com/web2/M00/A9/CC/poYBAGR9OqiAEhMjADhnzKcOtWI169.svg

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

13.3.3。概括

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

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

  • 后端可以通過自動并行計算和通信來提高性能。

13.3.4。練習(xí)

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

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

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

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

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


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1PFC電路與BOOST電路設(shè)計實例分享
  2. 1.83 MB   |  12次下載  |  4 積分
  3. 2世平基于靈動微 SPIN560C 的低壓無刷電機(jī)應(yīng)用方案
  4. 10.93 MB  |  11次下載  |  免費(fèi)
  5. 3電源測試報告-基于 國民技術(shù) N32L406 和杰華特 JW3376+3330 的 BMS 方案
  6. 6.47 MB  |  11次下載  |  免費(fèi)
  7. 4PWM控制器的控制方法
  8. 0.39 MB   |  3次下載  |  4 積分
  9. 5電流檢測芯片F(xiàn)P135應(yīng)用說明
  10. 1.24 MB   |  3次下載  |  免費(fèi)
  11. 6全面解讀被動式與主動式PFC電路
  12. 1.27 MB   |  1次下載  |  4 積分
  13. 7HC88L051F4低功耗芯片規(guī)格書
  14. 4.76 MB  |  1次下載  |  免費(fèi)
  15. 8CIU32D655x5數(shù)據(jù)手冊
  16. 2.14 MB   |  1次下載  |  免費(fèi)

本月

  1. 1常用電子元器件使用手冊
  2. 2.40 MB   |  52次下載  |  免費(fèi)
  3. 2高功率密度碳化硅MOSFET軟開關(guān)三相逆變器損耗分析
  4. 2.27 MB   |  33次下載  |  10 積分
  5. 3PFC電路與BOOST電路設(shè)計實例分享
  6. 1.83 MB   |  12次下載  |  4 積分
  7. 4世平基于靈動微 SPIN560C 的低壓無刷電機(jī)應(yīng)用方案
  8. 10.93 MB  |  11次下載  |  免費(fèi)
  9. 5電源測試報告-基于 國民技術(shù) N32L406 和杰華特 JW3376+3330 的 BMS 方案
  10. 6.47 MB  |  11次下載  |  免費(fèi)
  11. 6USB拓展塢PCB圖資料
  12. 0.57 MB   |  11次下載  |  免費(fèi)
  13. 7MS1826 HDMI 多功能視頻處理器數(shù)據(jù)手冊
  14. 4.51 MB   |  9次下載  |  免費(fèi)
  15. 8HAL9303線性霍爾效應(yīng)傳感器技術(shù)手冊
  16. 0.70 MB   |  9次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935134次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費(fèi)下載
  8. 340992  |  191424次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
  10. 158M  |  183352次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81600次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費(fèi)下載
  14. 0.02 MB  |  73818次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65991次下載  |  10 積分