一、CPU 与 GPU
二、如何使用pytorch在CPU与GPU之间进行数据迁移
三、CUDA包中常用的方法
四、多GPU并行运算的机制
五、GPU模型加载过程中的常见问题
这节课来学习pytorch如何使用GPU。
一、CPU 与 GPU
CPU:中央处理器,主要包括控制器和运算器。
GPU:图像处理器。为什么成为图像处理器呢?因为在早起计算机中,处理统一的,五依赖的大规模数据运算,主要在图形、图像这个任务中,所以这个处理器就称为图形处理器。
示意图是两个处理器的差异。黄色为控制单元,绿色为计算单元,橙色为存储单元。我们可以看到,在GPU中,绿色面积占到绝大部分,而在CPU中,计算单元是比较少的。
二、如何使用pytorch在CPU与GPU之间进行数据迁移
处理器要进行数据运算,运算的两个数据必须要在同一个处理器上,要么都在GPU上,要么都在CPU上。(这个问题不知道对不对,视频中这么讲的,但是我实验发现也能运行。见【例4】)
在pytorch中,如何在CPU与GPU之间来回切换呢?
其实pytorch提供了一个非常简便的方法:to()。
从CPU放到GPU: data.to("cuda")
从GPU放到CPU: data.to("cpu")
data通常会有两种数据类型:1. Tensor张量 2. Module模型
to()函数除了可以转移设备,还可以转换数据类型。下面来学习这两种数据类型的to()函数。
1. tensor转换数据类型
x = torch.ones((3,3))
x = x.to(torch.float64) #把x的数据类型从float32位转换成float64位。
2. tensor转换设备
x = torch.ones((3,3))
x = x.to("cuda") #把X迁移到GPU上
注意:x2 = x.cuda() 这个方法也是将张量迁移到GPU中,但是这个方法是pytorch0.4.0之前的一个方法,现在已经弃用。
3. Module改变数据类型
linear = nn.Linear(2,2)
linear.to(torch.double) #linear中的所有数据类型都变成float64
4. Module改变设备
linear = nn.Linear(2,2)
gup1 = torch.device("cuda")
linear.to(gpu1) #迁移到GPU上
张量的to()函数与Module的to()有什么区别?
张量的to()函数不会执行inplace操作,因此需要用“=”进行赋值。【例1】。而Module的to()函数会执行inplace操作。【例2】
例1:
结果:
可以看到内存地址是不同的。说明张量的to()函数不会执行inplace操作。
例2:
结果:
例3:在GPU上运算得到的结果,还是在GPU上。
结果:
例4:如果模型在GPU上,数据在CPU上