深度学习-自动并行计算
生活随笔
收集整理的這篇文章主要介紹了
深度学习-自动并行计算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
自動并行計算
異步計算
默認情況下,PyTorch中的 GPU 操作是異步的。當調用一個使用 GPU 的函數時,這些操作會在特定的設備上排隊但不一定會在稍后立即執行。這就使我們可以并行更多的計算,包括 CPU 或其他 GPU 上的操作。
一般情況下,異步計算的效果對調用者是不可見的,因為
- 每個設備按照它們排隊的順序執行操作
- 在 CPU 和 GPU 之間或兩個 GPU 之間復制數據時,PyTorch會自動執行必要的同步操作。
因此,計算將按每個操作同步執行的方式進行。 可以通過設置環境變量CUDA_LAUNCH_BLOCKING = 1來強制進行同步計算。當 GPU 產生error時,這可能非常有用。(異步執行時,只有在實際執行操作之后才會報告此類錯誤,因此堆棧跟蹤不會顯示請求的位置。)
自動并行計算
默認情況下,GPU 操作是異步的。當調用一個使用 GPU 的函數時,這些操作會在特定的設備上排隊,但不一定會在稍后執行。這允許我們并行更多的計算,包括 CPU 或其他 GPU 上的操作。
下面看一個簡單的例子。
import torch import timeassert torch.cuda.device_count() >= 2#先實現一個簡單的計時類 class Benchmark(): # 本類已保存在d2lzh_pytorch包中方便以后使用def __init__(self, prefix=None):self.prefix = prefix + ' ' if prefix else ''def __enter__(self):self.start = time.time()def __exit__(self, *args):print('%stime: %.4f sec' % (self.prefix, time.time() - self.start))定義run函數,令它做20000次矩陣乘法
def run(x):for _ in range(20000):y = torch.mm(x, x)分別在兩塊GPU上創建Tensor
x_gpu1 = torch.rand(size=(100, 100), device='cuda:0') x_gpu2 = torch.rand(size=(100, 100), device='cuda:1')分別使用它們運行run函數并打印運行所需時間
with Benchmark('Run on GPU1.'):run(x_gpu1)torch.cuda.synchronize()with Benchmark('Then run on GPU2.'):run(x_gpu2)torch.cuda.synchronize() Run on GPU1. time: 0.3149 sec Then run on GPU2. time: 0.3816 sec嘗試系統能自動并行這兩個任務:
with Benchmark('Run on both GPU1 and GPU2 in parallel.'):run(x_gpu1)run(x_gpu2)torch.cuda.synchronize() Run on both GPU1 and GPU2 in parallel. time: 0.5288 sec當兩個計算任務一起執行時,執行總時間小于它們分開執行的總和。這表明,PyTorch能有效地實現在不同設備上自動并行計算。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的深度学习-自动并行计算的全部內容,希望文章能夠幫你解決所遇到的問題。