本文章来源于对李沐动手深度学习
代码以及原理的理解,并且由于李沐老师的代码能力很强,以及视频中讲解代码的部分较少,所以这里将代码进行尽量逐行详细解释
并且由于pytorch的语法有些小伙伴可能并不熟悉,所以我们会采用逐行解释+小实验的方式来给大家解释代码
可能听说过深度学习的小伙伴们都知道,在如今的年代,深度学习早就是几乎人人都可以使用的玩意,不再是以前只有世界顶级的高端实验室才有机会使用的有钱人的游戏。这几乎全部得益于我们GPU的问世
查看自己的CUDA版本
windows系统
我们可以了解到,看李沐老师的课有很多人使用的并不是云服务器,而是自己的本地开发环境,所以我们专门分出windows版本的使用教程
第一步:打开cmd
我们可以先按住win+R
键,然后输入cmd,接着就会出现下面这样的一个黑框:
输入指令查询
我们在黑框中输入nvidia-smi
。这个指令需要注意的地方是一定不要自己自作主张去添加空格
接着我们就可以看到如下的环境,这里我们的Driver Version
为528.92,CUDA
的版本为12.0
Jupyter Notebook查询
用这个查询就比较简单,我们只需要在代码界面输入
!nvidia-smi
同样需要注意的是不要自己加一些空格
导入模块以及查看CPU和GPU
import torch
from torch import nn
torch.device('cpu'),torch.cuda.device('cuda')
如果这里出现了报错或者其他的警告,我们可以先暂时不管,文章下面会继续解决
查看GPU个数以及修复BUG
torch.cuda.device_count()
这段代码输入后,大部分人会得到两种答案:一种是确实返回了自己CUDA的个数,还有一种就是自己原本有GPU的电脑,但是这里返回的是0
如果小伙伴们是第一种情况的话,那么问题不算特别大,我们可以继续下面的操作,这里我们会针对第二种情况提出解决办法:
device_count()为0解决办法
在这种情况下,大概率是pytorch的安装出现了问题,我们可以重新安装一次pytorch
pytorch下载地址:pytorch的下载地址,这个界面可能需要较长的时间打开,如果显示连接失败的话可以多试几次或者进行科学上网
进入到官网后,我们可以找到类似于下面的一个界面
我们一般选择Stable
的Pytorch Build
然后根据你自己的系统选择Your OS
在安装包的选择上我们选择pip
和conda
都可以,但是我个人建议选择pip,因为pip可以使用一些其他的源,例如清华源等等
我们这里需要讲解的是我们的Compute Platform
的选择,这里我们一定要选择CUDA版本的,那么我们应该如何选择呢?
还是回到上面我们查看CUDA版本的那个地方
我们可以看到我这里的CUDA的版本是12.0,我们只可以选择Pytorch对应CUDA版本小于等于自己本地版本的
所以这里我们只能选择CUDA11.8版本
接着复制下面的Command,然后到自己的环境下进行pip安装即可
安装完成之后,在自己的环境下输入下面代码:
torch.cuda.is_available()
如果返回的是True,说明安装成功,cuda可以使用
寻找电脑的GPU
def try_gpu(i=0):
# 如果存在GPU就返回gpu(i),否则返回cpu
if torch.cuda.device_count() >= i+1:
return torch.device(f'cuda:{i}')
return torch.device('cpu')
def try_all_gpus():
# 返回所有的GPU,如果不存在GPU就返回CPU
devices = [
torch.device(f'cuda:{i}') for i in range(torch.cuda.device_count())
]
return devices if devices else [torch.device('cpu')]
try_gpu(),try_gpu(10),try_all_gpus()
这一段代码,李沐老师的主要目的是为了看看自己计算机或者云服务器中是否存在GPU环境,如果存在GPU环境的话就返回GPU,如果不存在的话就返回CPU
我这边的运行结果为
>>>(device(type='cuda', index=0),
device(type='cpu'),
[device(type='cuda', index=0)])
可能让初学者有疑惑的是,为什么我这里try_gpu(10)
返回的是一个CPU,那是因为我本地电脑只有一块3050的GPU,try_gpu(10)的意思是寻找第10块GPU,而我电脑并没有10块GPU,所以就默认返回CPU
数据转存到GPU
x = torch.tensor([1,2,3])
x.device
>>> device(type='cpu')
这一段代码我们可以看出,我们一般普通创建的变量都会优先创建在CPU的内存上,那么如果我们需要将它们创建在我们的GPU上,我们应该怎么做呢
X = torch.ones(2,3,device=try_gpu())
X
>>> tensor([[1., 1., 1.],
[1., 1., 1.]], device='cuda:0')
我们修改device参数,成功的将X存放在了GPU上面
神经网络与GPU
这一块将是我们后面的重点,因为后面我们讲解卷积神经网络的时候,需要进行大量的GPU的并行运算
net = nn.Sequential(nn.Linear(3,1))
net = net.to(device=try_gpu())
net(X)
>>>tensor([[0.7873],
[0.7873]], device='cuda:0', grad_fn=<AddmmBackward0>)
net[0].weight.data.device
>>>device(type='cuda', index=0)