# 8.3 自動并行計算
上一節提到,默認情況下,GPU 操作是異步的。當調用一個使用 GPU 的函數時,這些操作會在特定的設備上排隊,但不一定會在稍后執行。這允許我們并行更多的計算,包括 CPU 或其他 GPU 上的操作。
下面看一個簡單的例子。
首先導入本節中實驗所需的包或模塊。注意,需要至少2塊GPU才能運行本節實驗。
``` python
import torch
import time
assert torch.cuda.device_count() >= 2
```
我們先實現一個簡單的計時類。
``` python
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次矩陣乘法。
``` python
def run(x):
for _ in range(20000):
y = torch.mm(x, x)
```
接下來,分別在兩塊GPU上創建`Tensor`。
``` python
x_gpu1 = torch.rand(size=(100, 100), device='cuda:0')
x_gpu2 = torch.rand(size=(100, 100), device='cuda:1')
```
然后,分別使用它們運行`run`函數并打印運行所需時間。
``` python
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.2989 sec
Then run on GPU2. time: 0.3518 sec
```
嘗試系統能自動并行這兩個任務:
``` python
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.5076 sec
```
可以看到,當兩個計算任務一起執行時,執行總時間小于它們分開執行的總和。這表明,PyTorch能有效地實現在不同設備上自動并行計算。
-----------
> 注:本節與原書有很多不同,[原書傳送門](https://zh.d2l.ai/chapter_computational-performance/auto-parallelism.html)
- Home
- Introduce
- 1.深度學習簡介
- 深度學習簡介
- 2.預備知識
- 2.1環境配置
- 2.2數據操作
- 2.3自動求梯度
- 3.深度學習基礎
- 3.1 線性回歸
- 3.2 線性回歸的從零開始實現
- 3.3 線性回歸的簡潔實現
- 3.4 softmax回歸
- 3.5 圖像分類數據集(Fashion-MINST)
- 3.6 softmax回歸的從零開始實現
- 3.7 softmax回歸的簡潔實現
- 3.8 多層感知機
- 3.9 多層感知機的從零開始實現
- 3.10 多層感知機的簡潔實現
- 3.11 模型選擇、反向傳播和計算圖
- 3.12 權重衰減
- 3.13 丟棄法
- 3.14 正向傳播、反向傳播和計算圖
- 3.15 數值穩定性和模型初始化
- 3.16 實戰kaggle比賽:房價預測
- 4 深度學習計算
- 4.1 模型構造
- 4.2 模型參數的訪問、初始化和共享
- 4.3 模型參數的延后初始化
- 4.4 自定義層
- 4.5 讀取和存儲
- 4.6 GPU計算
- 5 卷積神經網絡
- 5.1 二維卷積層
- 5.2 填充和步幅
- 5.3 多輸入通道和多輸出通道
- 5.4 池化層
- 5.5 卷積神經網絡(LeNet)
- 5.6 深度卷積神經網絡(AlexNet)
- 5.7 使用重復元素的網絡(VGG)
- 5.8 網絡中的網絡(NiN)
- 5.9 含并行連結的網絡(GoogLeNet)
- 5.10 批量歸一化
- 5.11 殘差網絡(ResNet)
- 5.12 稠密連接網絡(DenseNet)
- 6 循環神經網絡
- 6.1 語言模型
- 6.2 循環神經網絡
- 6.3 語言模型數據集(周杰倫專輯歌詞)
- 6.4 循環神經網絡的從零開始實現
- 6.5 循環神經網絡的簡單實現
- 6.6 通過時間反向傳播
- 6.7 門控循環單元(GRU)
- 6.8 長短期記憶(LSTM)
- 6.9 深度循環神經網絡
- 6.10 雙向循環神經網絡
- 7 優化算法
- 7.1 優化與深度學習
- 7.2 梯度下降和隨機梯度下降
- 7.3 小批量隨機梯度下降
- 7.4 動量法
- 7.5 AdaGrad算法
- 7.6 RMSProp算法
- 7.7 AdaDelta
- 7.8 Adam算法
- 8 計算性能
- 8.1 命令式和符號式混合編程
- 8.2 異步計算
- 8.3 自動并行計算
- 8.4 多GPU計算
- 9 計算機視覺
- 9.1 圖像增廣
- 9.2 微調
- 9.3 目標檢測和邊界框
- 9.4 錨框
- 10 自然語言處理
- 10.1 詞嵌入(word2vec)
- 10.2 近似訓練
- 10.3 word2vec實現
- 10.4 子詞嵌入(fastText)
- 10.5 全局向量的詞嵌入(Glove)
- 10.6 求近義詞和類比詞
- 10.7 文本情感分類:使用循環神經網絡
- 10.8 文本情感分類:使用卷積網絡
- 10.9 編碼器--解碼器(seq2seq)
- 10.10 束搜索
- 10.11 注意力機制
- 10.12 機器翻譯