iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >PyTorch中的CUDA的操作方法
  • 181
分享到

PyTorch中的CUDA的操作方法

2024-04-02 19:04:59 181人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言一.常见CPU和GPU操作命令二.CPU和GPU设备上的Tensor1.Tensor从CPU拷贝到GPU上2.直接在GPU上创建Tensor3.CUDA Streams三.固

前言

CUDA(Compute Unified Device Architecture)是NVIDIA推出的异构计算平台,PyTorch中有专门的模块torch.cuda来设置和运行CUDA相关操作。本地安装环境为windows10,python3.7.8和CUDA 11.6,安装PyTorch最新稳定版本1.12.1如下:

pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116

一.常见CPU和GPU操作命令

1.查看PyTorch版本

print(torch.__version__)
1.12.1+cu116

2.查看GPU设备是否可用

print(torch.cuda.is_available())
True

3.PyTorch默认使用设备是CPU

print("default device: {}".fORMat(torch.Tensor([4,5,6]).device))
default device: cpu

4.查看所有可用的cpu设备的数量

print("available cpu devices: {}".format(torch.cuda.os.cpu_count()))
available cpu devices: 20

这里CPU设备数量指的是逻辑处理器的数量。

5.查看所有可用的gpu设备的数量

print("available gpu devices: {}".format(torch.cuda.device_count()))
available gpu devices: 1

6.获取gpu设备的名称

print("gpu device name: {}".format(torch.cuda.get_device_name(torch.device("cuda:0"))))
gpu device name: NVIDIA GeForce GTX 1080 Ti

7.通过device="cpu:0"指定cpu:0设备

device = torch.Tensor([1,2,3], device="cpu:0").device
print("device type: {}".format(device))
device type: cpu

8.通过torch.device指定cpu:0设备

cpu1 = torch.device("cpu:0")
print("cpu device: {}:{}".format(cpu1.type, cpu1.index))
cpu device: cpu:0

9.使用索引的方式,默认使用CUDA设备

gpu = torch.device(0)
print("gpu device: {}:{}".format(gpu.type, gpu.index))
gpu device: cuda:0

10.通过torch.device("cuda:0)指定cuda:0设备

gpu = torch.device("cuda:0")
print("gpu device: {}:{}".format(gpu.type, gpu.index))
gpu device: cuda:0

二.CPU和GPU设备上的Tensor

默认情况下创建Tensor是在CPU设备上的,但是可以通过copy_、to、cuda等方法将CPU设备中的Tensor转移到GPU设备上。当然也是可以直接在GPU设备上创建Tensor的。torch.tensor和torch.Tensor的区别是,torch.tensor可以通过device指定gpu设备,而torch.Tensor只能在cpu上创建,否则报错。

1.Tensor从CPU拷贝到GPU上

# 默认创建的tensor是在cpu上创建的
cpu_tensor = torch.Tensor([[1,4,7],[3,6,9],[2,5,8]])
print(cpu_tensor.device)

# 通过to方法将cpu_tensor拷贝到gpu上
gpu_tensor1 = cpu_tensor.to(torch.device("cuda:0"))
print(gpu_tensor1.device)

# 通过cuda方法将cpu_tensor拷贝到gpu上
gpu_tensor2 = cpu_tensor.cuda(torch.device("cuda:0"))
print(gpu_tensor2.device)

# 将gpu_tensor2拷贝到cpu上
gpu_tensor3 = cpu_tensor.copy_(gpu_tensor2)
print(gpu_tensor3.device)
print(gpu_tensor3)

输出结果如下:

cpu
cuda:0
cuda:0
cpu
tensor([[1., 4., 7.],
        [3., 6., 9.],
        [2., 5., 8.]])

主要说明下这个copy_()方法,实现如下:

def copy_(self, src, non_blocking=False):
    ......
    return _te.Tensor(*(), **{})

就是从src中拷贝元素到self的tensor中,然后返回self。以gpu_tensor3 = cpu_tensor.copy_(gpu_tensor2)为例,就是把gpu中的gpu_tensor2拷贝到cpu中的cpu_tensor中。

2.直接在GPU上创建Tensor

gpu_tensor1 = torch.tensor([[2,5,8],[1,4,7],[3,6,9]], device=torch.device("cuda:0"))
print(gpu_tensor1.device)

# 在gpu设备上创建随机数tensor
print(torch.rand((3,4), device=torch.device("cuda:0")))

# 在gpu设备上创建0值tensor
print(torch.zeros((2,5), device=torch.device("cuda:0")))

输出结果,如下:

cuda:0
tensor([[0.7061, 0.2161, 0.8219, 0.3354],
        [0.1697, 0.1730, 0.1400, 0.2825],
        [0.1771, 0.0473, 0.8411, 0.2318]], device='cuda:0')
tensor([[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]], device='cuda:0')

3.CUDA Streams

Steam是CUDA命令线性执行的抽象形式,分配给设备的CUDA命令按照入队序列的顺序执行。每个设备都有一个默认的Steam,也可以通过torch.cuda.Stream()创建新的Stream。如果不同Stream中的命令交互执行,那么就不能保证命令绝对按顺序执行。下面的这个例子不同的Stream就可能会产生错误。

cuda = torch.device("cuda")
# 创建默认的stream,A就是使用的默认stream
s = torch.cuda.Stream()
A = torch.randn((1,10), device=cuda)
for i in range(100):
    # 在新的stream上对默认的stream上创建的tensor进行求和
    with torch.cuda.stream(s):
        # 存在的问题是:torch.sum()可能会在torch.randn()之前执行
        B = torch.sum(A)
        print(B)

这个例子存在的问题是torch.sum()可能会在torch.randn()之前就执行。为了保证Stream中的命令绝对按顺序执行,接下来使用Synchronize同步方法解决上面例子的问题:

cuda = torch.device("cuda")
s = torch.cuda.Stream()
A = torch.randn((1,10), device=cuda)
default_stream = torch.cuda.current_stream()
print("Default Stream: {}".format(default_stream))
# 等待创建A的stream执行完毕
torch.cuda.Stream.synchronize(default_stream)
for i in range(100):
    # 在新的stream上对默认的stream上创建的tensor进行求和
    with torch.cuda.stream(s):
        print("current stream: {}".format(torch.cuda.current_stream()))
        B = torch.sum(A)
        print(B)

解决问题的思路就是通过torch.cuda.Stream.synchronize(default_stream)等待创建A的stream执行完毕,然后再执行新的Stream中的指令。
除此之外,使用memory_cached方法获取缓存内存的大小,使用max_memory_cached方法获取最大缓存内存的大小,使用max_memory_allocated方法获取最大分配内存的大小。可以使用empty_cache方法释放无用的缓存内存。

三.固定缓冲区

缓存就是当计算机内存不足的时候,就会把内存中的数据存储到硬盘上。固定缓冲区就是说常驻内存,不能把这部分数据缓存到硬盘上。可以直接使用pin_memory方法或在Tensor上直接调用pin_memory方法将Tensor复制到固定缓冲区。为什么要做固定缓冲区呢?目的只有一个,就是把CPU上的固定缓冲区拷贝到GPU上时速度快。Tensor上的is_pinned方法可以查看该Tensor是否加载到固定缓冲区中。

from torch.utils.data._utils.pin_memory import pin_memory
x = torch.Tensor([[1,2,4], [5, 7, 9], [3, 7, 10]])
# 通过pin_memory()方法将x复制到固定缓冲区
y = pin_memory(x)
# 在tensor上直接调用pin_memory()方法将tensor复制到固定缓冲区
z = x.pin_memory()
# id()方法返回tensor的内存地址,pin_memory()返回tensor对象的拷贝,因此内存地址是不同的
print("id: {}".format(id(x)))
print("id: {}".format(id(y)))
print("id: {}".format(id(z)))
# 当tensor放入固定缓冲区后,就可以异步将数据复制到gpu设备上了
a = z.cuda(non_blocking=True)
print(a)
print("is_pinned: {}/{}".format(x.is_pinned(), z.is_pinned()))

输出结果如下所示:

id: 1605289350472
id: 1605969660408
id: 1605969660248
tensor([[ 1.,  2.,  4.],
        [ 5.,  7.,  9.],
        [ 3.,  7., 10.]], device='cuda:0')
is_pinned: False/True

说明:通过id()查看对象的内存地址。

四.自动设备感知

1.适配CPU和GPU设备

自动设备感知本质上就是有GPU时就使用GPU,没有GPU时就使用CPU,即一套代码适配CPU和GPU设备。GPU是否存在是通过torch.cuda.is_available()判断的。

常见的写法如下:

device = torch.device("cpu")
if torch.cuda.is_available():
    device = torch.device("cuda")
a = torch.tensor([1,2,3], device=device)
print(a)

输出结果如下所示

tensor([1, 2, 3], device='cuda:0')

2.模型迁移到GPU设备

在Module对象上调用to()方法可以把模型也迁移到GPU设备上,如下所示:

class LinearRegression(torch.nn.Module):
    def __init__(self):
        super(LinearRegression, self).__init__()
        self.linear = torch.nn.Linear(1, 1)
    def forward(self, x):
        return self.linear(x)
regression = LinearRegression().to(device=device)
for param in regression.parameters():
    print(param)

从上述输出参数中可以看到param都是device='cuda:0’上的tensor,所以可以说模型通过to()迁移到GPU设备上了。

到此这篇关于PyTorch中的CUDA的操作方法的文章就介绍到这了,更多相关PyTorch CUDA操作内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: PyTorch中的CUDA的操作方法

本文链接: https://www.lsjlt.com/news/120212.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PyTorch中的CUDA的操作方法
    目录前言一.常见CPU和GPU操作命令二.CPU和GPU设备上的Tensor1.Tensor从CPU拷贝到GPU上2.直接在GPU上创建Tensor3.CUDA Streams三.固...
    99+
    2024-04-02
  • pytorch cuda安装报错的解决方法
    目录一、按照cuda版本在官网找命令二、换源三、Bug描述四、解决方法五、查看是否使用GPU总结2022.12.8在win+cuda11.8下安装最新Pytorch GPU版时遇到包...
    99+
    2023-01-07
    pytorch cuda安装 Pytorch cuda pytorch调用cuda
  • pytorch实现模型剪枝的操作方法
    目录一,剪枝分类1.1,非结构化剪枝1.2,结构化剪枝1.3,本地与全局修剪二,PyTorch 的剪枝2.1,pytorch 剪枝工作原理2.2,局部剪枝2.2.1,局部非结构化剪枝...
    99+
    2023-02-24
    pytorch模型剪枝 pytorch剪枝
  • 显卡驱动CUDA 和 pytorch CUDA 之间的区别
    目录写在前面如何查看CUDA 版本为何三个指令 三种结果?nvidia-sminvcc 和 torch.version.cudaRuntime CUDA写在前面 我的 CUDA 版本...
    99+
    2023-03-19
    显卡驱动CUDA  pytorch CUDA 
  • pytorch中.to(device) 和.cuda()的区别说明
    原理 .to(device) 可以指定CPU 或者GPU device = torch.device("cuda:0" if torch.cuda.is_available() ...
    99+
    2024-04-02
  • pytorch中.to(device) 和.cuda()的区别有哪些
    这篇文章主要介绍了pytorch中.to(device) 和.cuda()的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。原理.to(device) 可以指定CPU...
    99+
    2023-06-15
  • pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
    F.avg_pool1d()数据是三维输入 input维度: (batch_size,channels,width)channel可以看成高度 kenerl维度:(一维:表示widt...
    99+
    2024-04-02
  • 显卡驱动CUDA和pytorch CUDA 之间的区别是什么
    今天小编给大家分享一下显卡驱动CUDA和pytorch CUDA 之间的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下...
    99+
    2023-07-05
  • 将pytorch的网络等转移到cuda
    神经网络一般用GPU来跑,我们的神经网络框架一般也都安装的GPU版本,本文就简单记录一下GPU使用的编写。 GPU的设置不在model,而是在Train的初始化上。 第一步是查看是否...
    99+
    2024-04-02
  • pytorch Dropout过拟合的操作
    如下所示: import torch from torch.autograd import Variable import matplotlib.pyplot as plt t...
    99+
    2024-04-02
  • Linux中的常见操作方法
    这篇文章将为大家详细讲解有关Linux中的常见操作方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. Linux的用户管理Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必...
    99+
    2023-06-20
  • log4j的操作方法
    本篇内容主要讲解“log4j的操作方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“log4j的操作方法”吧!1 log4j的配置文件2 log4j的调用[@more@]1 log4j.prop...
    99+
    2023-06-03
  • Git操作的方法
    这篇文章主要介绍“Git操作的方法”,在日常操作中,相信很多人在Git操作的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Git操作的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!一、版本控制器方...
    99+
    2023-06-29
  • CUDA,cudatookit,cudnn和pytorch的关系是什么
    本篇内容主要讲解“CUDA,cudatookit,cudnn和pytorch的关系是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CUDA,cudatookit,cudnn和pytorch的...
    99+
    2023-07-05
  • Pytorch中Tensor基本操作的示例分析
    这篇文章将为大家详细讲解有关Pytorch中Tensor基本操作的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、tensor的创建1.使用tensor小写字母的tensor接收具体的数据,可以...
    99+
    2023-06-25
  • 问题7:虚拟机+ubuntu+安装cuda(傻瓜式操作)+cuda path配置+查看cuda的版本
    目录 1.cuda的安装 2.cuda path的配置 3.检查cuda的版本号(为安装pytorch做准备) ... 建议看看下面的几条ps,可以避免踩坑! ps:本文所用ubuntu系统版本为v-22.04(如果...
    99+
    2023-09-01
    计算机视觉 python pycharm 深度学习 ubuntu Powered by 金山文档
  • pytorch实现textCNN的具体操作
    1. 原理 2014年的一篇文章,开创cnn用到文本分类的先河。 Convolutional Neural Networks for Sentence Classification ...
    99+
    2024-04-02
  • react中的DOM操作的实现方法
    本篇内容介绍了“react中的DOM操作的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前面的话使用场景ref【HTML元素】【...
    99+
    2023-06-20
  • JavaScript中indexOf和lastIndexOf操作的方法
    今天小编给大家分享一下JavaScript中indexOf和lastIndexOf操作的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读...
    99+
    2024-04-02
  • Python中Selenium对Cookie的操作方法
    1、Cookie介绍 HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话。也就是说即使第...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作