目录
任务
任务简介
学习使用GPU进行加速运算;学习常见报错信息,方便调试代码。
详细说明
学习如何使用GPU进行加速模型运算,介绍Tensor和Module的to函数使用以及它们之间的差异,同时学习多GPU运算的分发并行机制。
知识点
CPU与GPU
CPU(Central Processing Unit,中央处理器):主要包括控制器
和运算器
GPU(Graphics Processing Unit,图形处理器):处理统一的,无依赖的大规模数据运算
二者的结构图如下,可以看到绿色部分(计算单元)GPU明显要比CPU要多。
GPU的ALU(算术运算单元)比CPU多,而CPU中的缓存区多,用于加速程序的运行,两者适用于不同的任务,计算密集型的程序和易于并行的程序通常在GPU上完成。
数据迁移至GPU
.to()函数
:转换数据类型
或设备
x=torch.ones((3,3))#定义一个张量
x=x.to(torch.float64)#把默认的float32转换为float64
x=torch.ones(3,3)#定义一个张量
x=x.to("cuda")#迁移到GPU
linear=nn.Linear(2,2)#定义一个module
linear.to(torch.double)#把module中所有的参数从默认的float32转换为float64(double就是float64)
gpu1=torch.device("cuda")#定义设备
linear.to(gpu1)#迁移到gpu
可以看到上面两个例子中,
tensor是需要用等号进行赋值
的,而module是直接执行to函数
即可。
Pytorch
中提供了.to()
方法,用于数据在CPU和GPU之间的来回切换,这里的数据通常之两类:Tensor和Module
- tensor.to(*args, **kwargs)
- module.to(*args, **kwargs)
区别:张量不执行inplace
,模型执行inplace
# -*- coding: utf-8 -*-
"""
# @brief : 数据迁移至cuda的方法
"""
import torch
import torch.nn as nn
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# ========================== tensor to cuda
# flag = 0
flag = 1
if flag:
x_cpu = torch.ones((3, 3))
# 打印is_cuda属性, id(x_cpu)内存地址
print("x_cpu:\ndevice: {} is_cuda: {} id: {}".format(x_cpu.device, x_cpu.is_cuda, id(x_cpu)))
# 转移到GPU,然后再打印相应信息,device要看第10处,先进行判断
x_gpu = x_cpu.to(device)
print("x_gpu:\ndevice: {} is_cuda: {} id: {}".format(x_gpu.device, x_gpu.is_cuda, id(x_gpu)))
# 弃用
# x_gpu = x_cpu.cuda()
# ========================== module to cuda
# flag = 0
flag = 1
if flag:
net = nn.Sequential(nn.Linear(3, 3))
print("\nid:{} is_cuda: {}".format(id(net), next(net.parameters()).is_cuda))
net.to(device)
print("\nid:{} is_cuda: {}".format(id(net), next(net.parameters()).is_cuda))
# ========================== forward in cuda
# flag = 0
flag