《动手学深度学习 Pytorch版》 5.6 GPU

2023-09-17 08:26:26

5.6.1 计算设备

import torch
from torch import nn

torch.device('cpu'), torch.device('cuda:0')  # cuda等价于cuda:0(只有一块显卡没法试别的块号)
(device(type='cpu'), device(type='cuda', index=0))
torch.cuda.device_count()  # 查询可用GPU数量
1
def try_gpu(i=0):  #@save
    """如果存在,则返回gpu(i),否则返回cpu()"""
    if torch.cuda.device_count() >= i + 1:
        return torch.device(f'cuda:{i}')
    return torch.device('cpu')

def try_all_gpus():  #@save
    """返回所有可用的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()  # 测试
(device(type='cuda', index=0),
 device(type='cpu'),
 [device(type='cuda', index=0)])

5.6.2 张量与GPU

x = torch.tensor([1, 2, 3])
x.device  # 默认情况下张量是存储在CPU上的
device(type='cpu')
  1. 存储在GPU上

    可以在创建张量时选择位置

X = torch.ones(2, 3, device=try_gpu())  # 只有一个GPU也就不试下面那个了
X
tensor([[1., 1., 1.],
        [1., 1., 1.]], device='cuda:0')
  1. 复制

    需要执行运算的数据需要在同一块GPU上,如果不在则可以复制过去。

# Z = X.cuda(1)  # 没显卡没法试
X.cuda(0) is X  # 如果已存在则不会复制
True
  1. 旁注

    谨慎复制,并行化的瓶颈在于数据传输而不是运算速度。

5.6.3 神经网络与GPU

net = nn.Sequential(nn.Linear(3, 1))
net = net.to(device=try_gpu())  # 模型也可以指定位置

net(X)
tensor([[0.3092],
        [0.3092]], device='cuda:0', grad_fn=<AddmmBackward0>)
net[0].weight.data.device #  所需要的数据和参数在同一设备时才可用该设备运算
device(type='cuda', index=0)

练习

(1)尝试一个计算量很大的任务,比如大矩阵的乘法,看看CPU和GPU的速度差异。再尝试一个计算量很小的任务呢?

import time

start_CPU=time.time()
for i in range(1000):
    A = torch.rand(1000, 1000)
    B = torch.rand(1000, 1000)
    C = torch.matmul(A, B)
end_CPU=time.time()

start_GPU=time.time()
for i in range(1000):
    A = torch.rand(1000, 1000, device=try_gpu())
    B = torch.rand(1000, 1000, device=try_gpu())
    C = torch.matmul(A, B)
end_GPU=time.time()

print(f'大计算量任务CPU运算时长: {round((end_CPU - start_CPU)*1000, 2)} ms')
print(f'大计算量任务GPU运算时长: {round((end_GPU - start_GPU)*1000, 2)} ms')

start_CPU=time.time()
A = torch.rand(5, 5)
B = torch.rand(5, 5)
C = torch.matmul(A, B)
end_CPU=time.time()

start_GPU=time.time()
A = torch.rand(5, 5, device=try_gpu())
B = torch.rand(5, 5, device=try_gpu())
C = torch.matmul(A, B)
end_GPU=time.time()

print(f'小计算量任务CPU运算时长: {round((end_CPU - start_CPU) * 1000, 2)} ms')
print(f'小计算量任务CPU运算时长: {round((end_GPU - start_GPU) * 1000, 2)} ms')

大计算量任务CPU运算时长: 23190.1 ms
大计算量任务GPU运算时长: 60.0 ms
小计算量任务CPU运算时长: 1.0 ms
小计算量任务GPU运算时长: 0.0 ms

(2)我们应该如何在GPU上读写模型参数?

使用 net.to() 函数迁移模型到 GPU 上即可。


(3)测量计算 1000 个 100*100 矩阵乘法所需的时间,并记录输出矩阵的弗罗贝尼乌斯范数,一次记录一个结果,而不是在GPU上保存日志并进传输最终结果。

A = torch.rand(100, 100, device=try_gpu())

start = time.time()
for i in range(1000):
    A = torch.mm(A, A)
    B = torch.norm(A)  # 逐个记录
end = time.time()
print(f'逐个记录耗费时间:{round((end - start) * 1000)} ms')

A = torch.rand(100, 100, device=try_gpu())
start = time.time()
for i in range(1000):
    A = torch.mm(A, A)
B = torch.norm(A)  # 最终记录
end = time.time()
print(f'最终记录耗费时间:{round((end - start) * 1000)} ms')
逐个记录耗费时间:48 ms
最终记录耗费时间:10 ms

(4)测量同时在两个 GPU 上执行两个矩阵乘法与在一个 GPU 上按顺序执行两个矩阵乘法所需的时间。

更多推荐

R300升级款无人车开发平台,助力开发者快速上手、高效验证算法

R300升级款是一款科研无人车开发平台,旨在为无人车开发者提供快速上手开发和高效验证算法的解决方案。该平台集成了多款无人车底盘,包括履带式、四轮差速、阿克曼、麦克纳姆轮底盘等,以满足不同形式和配置的需求,并搭载了RTK定位系统、双目相机、深度相机和激光雷达等多种传感器,以满足开发者的科研需求。此外,平台还提供了丰富的案

Linux shell编程学习笔记1:关于shell的前世今生

一、什么是Shell?Shell英文单词的原意是“外壳”,在计算机领域专指在操作系统(OperatingSystem)外层,提供用户界面(UserInterface)的程序,主要负责将用户的命令(Command)转化为操作系统可识别的指令(Instruction)。二、UnixshellUnix诞生于1969年,是最早

android px ps dp直接的转换

转换方式看这篇文章:https://blog.csdn.net/sinat_28324227/article/details/50780359下面是ppi一览2.8英寸分辨率为640×480(VGA)像素密度286PPI3.2英寸分辨率为480×320(HVGA)像素密度167PPI3.3英寸分辨率为854×480(W

Linux命令行教程:使用head和tail命令快速查看文件的开头和结尾

文章目录简介A.什么是`head`和`tail`命令B.`head`和`tail`命令的作用和用途`head`命令A.命令格式和语法B.常见选项和参数1.`-n`:指定显示的行数2.`-c`:指定显示的字节数3.`-v`:显示文件名C.示例和应用实例1.显示文件的前几行2.显示多个文件的前几行3.结合管道使用D.注意事

PROFIBUS主站转ETHERCAT协议网关

产品介绍JM-DPM-ECT是自主研发的一款PROFIBUS-DP主站功能的通讯网关。该产品主要功能是将各种PROFIBUS-DP从站接入到ETHERCAT网络中。本网关连接到PROFIBUS总线中作为主站使用,连接到ETHERCAT总线中作为从站使用。产品参数技术参数◆PROFIBUS-DP/V0协议符合GB/T20

《深入PostgreSQL的存储引擎:原理与性能》

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🐅🐾猫头虎建议程序员必备技术栈一览表📖:🛠️全栈技术FullStack:📚MERN/MEAN/MEVNStack|🌐Jamstack|🌍GraphQL|🔁RESTfulAPI|⚡WebSockets|🔄CI/CD|🌐Git&Versio

calibre和cpolar搭建一个私有的网络书库

Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说!文章目录Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说!1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网使用kindle访问内网私人书库6月底,亚马逊公司旗下Kindle中国电子书店停止运营

使用QLoRA对Llama 2进行微调的详细笔记

使用QLoRA对Llama2进行微调是我们常用的一个方法,但是在微调时会遇到各种各样的问题,所以在本文中,将尝试以详细注释的方式给出一些常见问题的答案。这些问题是特定于代码的,大多数注释都是针对所涉及的开源库以及所使用的方法和类的问题。导入库对于大模型,第一件事是又多了一些不熟悉的Python库。!pipinstall

docker network create命令

dockernetworkcreate命令用于创建一个新的网络连接。DRIVER接受内置网络驱动程序的桥接或覆盖。如果安装了第三方或自己的自定义网络驱动程序,则可以在此处指定DRIVER。如果不指定--driver选项,该命令将为您自动创建一个桥接网络。当安装DockerEngine时,会自动创建桥接网络。该网络对应于

Docker基础学习

Docker学习目标:掌握Docker基础知识,能够理解Docker镜像与容器的概念完成Docker安装与启动掌握Docker镜像与容器相关命令掌握TomcatNginx等软件的常用应用的安装掌握docker迁移与备份相关命令能够运用Dockerfile编写创建容器的脚本能够搭建与使用docker私有仓库​1Docke

Say0l的安全开发-代理扫描工具-Sayo-proxyscan【红队工具】

写在前面终于终于,安全开发也练习一年半了,有时间完善一下项目,写写中间踩过的坑。安全开发的系列全部都会上传至github,欢迎使用和star。工具链接地址https://github.com/SAY0l/Sayo-proxyscan工具简介SOCKS4/SOCKS4a/SOCKS5/HTTP/HTTPS快速代理扫描。后

热文推荐