神经网络学习笔记(2) – GPU与深度学习
GPU使用原理简介
现在,GPU已不只是用于视频和图像的渲染了。它使用了高度并行化计算架构,使得深度学习的某些计算能得到数十倍的提升。目前的深度学习框架,如PyTorch,都支持在GPU上的计算。
CUDA全称是Compute Unified Device Architecture。这是由当今比较流行的GPU厂商Nvidia(英伟达)提出的并行计算平台和指令集。
因此,一方面要运行在支持CUDA的GPU上,才能使GPU起作用;另一方面编写的代码要使用CUDA兼容的API(如PyTorch,代码需要显式地“指定”要把哪部分计算置于CUDA上,并使用CUDA特有的Tensor变量)。
在底层,GPU的计算默认是异步执行的。首先操作指令被加入到某设备的处理队列,然后在稍后执行。而Pytorch和GPU之间的同步是自动完成的。有时为了调试方便,若要强制进行同步计算,可设置环境变量CUDA_LAUNCH_BLOCKING=1。
由于在每个GPU设备上都只能线性执行,为了提高并行度,CUDA有一个stream的概念。不同的stream依照操作数据的步骤不同可以做成流水线式的并行操作。
安装运行环境
首先在主机上应配备了GPU的硬件。然后分别安装GPU驱动程序,CUDA ToolKit,cuDNN(用于深度神经网络的专用库),以及CUDA版的Pytorch。
使用Pytorch进行GPU计算初探
import torch
#如果True,说明一切就绪
torch.cuda.is_available()
#初始化。如果通过C API与PyTorch进行交互,你可能需要显式调用这个方法。
torch.cuda.init()
#返回当前选择的设备的索引
torch.cuda.current_device()
#返回可使用GPU的数量
torch.cuda.device_count()
#返回当前的CUDA设备
cuda = torch.device('cuda')
#返回第n个CUDA设备
cuda0 = torch.device('cuda:0')
cuda1 = torch.device('cuda:1')
#创建一个CPU上的Tensor
x = torch.tensor([10., 20.])
#创建一个GPU上的Tensor
x_default = torch.tensor([10., 20.], device=cuda)
#创建一个指定GPU上的Tensor
x0 = torch.tensor([10., 20.], device=cuda0)
x1 = torch.tensor([10., 20.], device=cuda1)
#把先前创建的CPU Tensor复制到GPU上
y = x.cuda()
#可采用如下的with语句来构造GPU上下文
with torch.cuda.device(1):
print('Inside with context: ', torch.cuda.current_device())
a = torch.tensor([10., 20.])
a0 = torch.tensor([10., 20.], device=cuda0)
a1 = torch.tensor([10., 20.], device=cuda)
#跨设备的赋值
b1 = a0.to(device=cuda1)
#数值运算。(变量必须在同一个设备上!)
sum_ax = a1 + x1
#对Tensor使用torch.Tensor.new_*系列函数的操作,可生成在同一个设备上的Tensor
preserve_context0 = x0.new_full([2, 2], fill_value=1.1)