深度学习中会涉及大量的、重复的矩阵运算、图形运算,而CPU对这种简单的加减法加速不够显著,可以使用GPU进行加速运算
CUDA是英伟达旗下的专门为深度学习加速运算的显卡,其对于简单的浮点运算、矩形运算相较于CPU加速了数倍不止
本文介绍CUDA编程,以及如何在PyTorch中配置CUDA环境,以实现深度学习模型的高效开发
1. CUDA 简介
CUDA(Compute Unified Device Architecture,统一计算设备架构)是由Nvidia开发的编程模型和并行计算平台。
在模式识别任务中,使用cuda进行GPU加速可以显著提升计算能力,通过并行化任务更快的执行简单矩阵操作
PyTorch提供了torch.cuda库来设置和运行CUDA操作
需要注意的是,cuda操作的数据被称为张量,其实就是数组,维度从一维到几十维度、上百维度不止,只是叫法不同而已。利用PyTorch的CUDA功能,可以创建张量并将其分配至GPU。完成分配后,所有计算操作都将在GPU上进行,确保结果也存储于该设备。
查看本地设备是否支持CUDA,最简单的方法就是在桌面上鼠标右键,出现下图的标志就是支持cuda加速
关于cuda 的安装不多赘述,其实不是很复杂,只是刚开始的时候经常配置失败,就觉得很困难了。其实在深度学习中,为了保证环境不被污染,新建虚拟环境是很正常的事情,也很简单,可以参考:Pytorch 配置 GPU 环境_pytorch gpu-CSDN博客
更多深度学习环境配置参考本专栏:深度学习环境配置篇_听风吹等浪起的博客-CSDN博客
2. 在pytorch中运行CUDA操作
安装成功后,输入下面命令,检查CUDA是否安装成功
import torch
print("Pytorch CUDA版本是:", torch.version.cuda)
成功的话会显示版本
然后检查是否支持GPU加速
import torch
print("系统是否支持CUDA:", torch.cuda.is_available())
返回True,环境就没问题了
当然,PyTorch CUDA还提供了以下功能
import torch
cuda_id = torch.cuda.current_device()
print("CUDA设备ID: ", torch.cuda.current_device())
print("当前CUDA设备名称: ", torch.cuda.get_device_name(cuda_id))
返回如下:
还可以通过指定ID来更改默认的CUDA设备:
import torch torch.cuda.set_device(1)
3. CUDA 中的张量操作
我们上面介绍过,cuda中的数据类型是张量,也就是多维数组。而常见的读取图像啊、文本的,都是列表或者数组的形式,想要进行gpu加速,就需要类型转换,这里只做简单介绍,详细的教程之前也写过:Tensor 和 Numpy 相关操作_tensor只能在gpu上处理吗-CSDN博客
常用的cuda在pytorch中的命令:
tensor.device
:返回张量所在的设备名称,默认是“CPU”tensor.to(device_name)
:用于将张量迁移到指定的设备。设置device_name为"CPU",张量就会在CPU上;设置为"cuda",张量则会在GPU上执行tensor.cpu()
: 将张量从当前设备传输到CPU
下述代码实现的功能,是张量在cpu和gpu上的运算,值得一提的是,张量可以在CPU和GPU上运行
import torch
x = torch.randint(1, 1000, (100, 100)) # 创建张量
print("设备名称: ", x.device) # 最初的在cpu上
res_cpu = x ** 2 # cpu运算
x = x.to(torch.device('cuda')) # 转移到cuda
print("传输后的设备名称: ", x.device)
res_gpu = x ** 2 # gpu运算
x.cpu()
返回如下:
4. 在机器学习中使用CUDA运算
当然在机器学习的具体训练中,不需要每次都要使用torch.device来转移数据,pytorch为我们提供了简单的方法
事实上,本身cuda加速的是前向传播、反向传播运算,只需要记住两种数据的运算需要在同一设备上即可,就是说cpu上的矩阵不能加上gpu上的矩阵
这样实际训练中就很简单,只需要把网络仍在cuda上。
因为数据需要和网络进行矩阵运算,所以数据也需要放在cuda上。
对于监督学习,真实的标签需要进行损失计算,那么标签也需要放在cuda上即可
CUDA提供了一种便捷的方法,可以将机器学习模型部署到不同的计算设备上:
使用 model.to(device_name)
指定它运行在CPU或支持CUDA的GPU上
其中,"CPU"
代表在CPU上运行,而"cuda"
则代表在GPU上运行。
下述代码就是将实例化的resnet网络仍在cuda上的demo代码
import torch
import torchvision.models as models
device = 'cuda' if torch.cuda.is_available() else 'cpu'
# 实例化预训练模型
model = models.resnet18(pretrained=True)
# 将模型传输到支持CUDA的GPU
model = model.to(device)
模型成功迁移到支持CUDA的GPU之后,将数据和标签也放在cuda上即可加速模型的学习过程