【小白學(xué)習(xí)PyTorch教程】二、動態(tài)計(jì)算圖和GPU支持操作
「@Author:Runsen」
動態(tài)計(jì)算圖
在深度學(xué)習(xí)中使用 PyTorch 的主要原因之一,是我們可以自動獲得定義的函數(shù)的梯度/導(dǎo)數(shù)。
當(dāng)我們操作我們的輸入時,會自動創(chuàng)建一個計(jì)算圖。該圖顯示了如何從輸入到輸出的動態(tài)計(jì)算過程。
為了熟悉計(jì)算圖的概念,下面將為以下函數(shù)創(chuàng)建一個:

這里的 是我們的參數(shù),我們想要優(yōu)化(最大化或最小化)輸出 . 為此,我們想要獲得梯度.
在下面的代碼中,我將使用[1,2,3]作輸入。
# 只有浮動張量有梯度
x = torch.arange(1,4, dtype=torch.float32, requires_grad=True)
print("X", x)
# X tensor([1., 2., 3.], requires_grad=True)
現(xiàn)在讓我來一步一步地構(gòu)建計(jì)算圖,了解每個操作是到底是如何添加到計(jì)算圖中的。
a = x + 2
b = a ** 2
c = b + 3
y = c.mean()
print("Y", y)
# Y tensor(19.6667, grad_fn=<MeanBackward0>)
使用上面的語句,我們創(chuàng)建了一個類似于下圖的計(jì)算圖(通過tensorboard )查看:
我們計(jì)算 a 基于輸入x 和常數(shù)2, b是 a平方等等操作。計(jì)算圖通常以相反的方向可視化(箭頭從結(jié)果指向輸入)。
我們可以通過backward()在最后一個輸出上調(diào)用函數(shù)來對計(jì)算圖執(zhí)行反向傳播,這樣可以,計(jì)算了每個具有屬性的張量的梯度requires_grad=True:
y.backward()
最后打印x.grad就可以查看對應(yīng)梯度。

GPU支持操作
在Pytorch中GPU 可以并行執(zhí)行數(shù)以千計(jì)的小運(yùn)算,因此非常適合在神經(jīng)網(wǎng)絡(luò)中執(zhí)行大型矩陣運(yùn)算。
「CPU 與 GPU的區(qū)別」
| CPU | GPU |
|---|---|
| 中央處理器 | 圖形處理單元 |
| 幾個核心 | 多核 |
| 低延遲 | 高吞吐量 |
| 適合串行處理 | 適合并行處理 |
| 可以一次做一些操作 | 可以同時進(jìn)行數(shù)千次操作 |
PyTorch 使用GPU,需要搭建NVIDIA 的CUDA和cuDNN。
下面代碼,檢查是否有可用的 GPU:
gpu_avail = torch.cuda.is_available()
print("Is the GPU available? %s" % str(gpu_avail))
現(xiàn)在創(chuàng)建一個張量并將其推送到GPU設(shè)備:
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
print("Device", device)
x = x.to(device)
print("X", x)
# Device cuda
# X tensor([1., 1., 1.], device='cuda:0')
cuda 旁邊的零表示這是計(jì)算機(jī)上的第0個 GPU 設(shè)備。因此,PyTorch 還支持多 GPU 系統(tǒng),
下面將CPU 上的大型矩陣乘法的運(yùn)行時間與 GPU 上的運(yùn)算進(jìn)行比較:

根據(jù)系統(tǒng)中的配置而定,GPU加速提高模型的訓(xùn)練速度。
往期精彩回顧 本站qq群851320808,加入微信群請掃碼:
