为什么深度学习和神经网络要使用 GPU?

为什么深度学习和神经网络要使用 GPU?

本篇文章的目标是帮助初学者了解 CUDA 是什么,以及它如何与 PyTorch 配合使用,更重要的是,我们为何在神经网络编程中使用 GPU。

图形处理单元 (GPU)

要了解 CUDA,我们需要对图形处理单元 (GPU) 有一定的了解。GPU 是一种擅长处理 专门化 计算的处理器。

这与中央处理单元 (CPU) 形成对比,CPU 是一种擅长处理 通用 计算的处理器。CPU 是为我们的电子设备上大多数典型计算提供动力的处理器。

GPU 可以比 CPU 快得多,但并非总是如此。GPU 相对于 CPU 的速度取决于正在执行的计算类型。最适合 GPU 的计算类型是能够 并行 进行的计算。

并行计算

并行计算是一种将特定计算分解为可以同时进行的独立较小计算的计算类型。然后将得到的计算结果重新组合或同步,以形成原始较大计算的结果。

img

一个较大任务可以分解为的任务数量取决于特定硬件上包含的内核数量。内核是实际在给定处理器内进行计算的单元,CPU 通常有四、八或十六个内核,而 GPU 可能有数千个内核。

还有其他一些技术规格也很重要,但本描述旨在传达一般概念。

有了这些基础知识,我们可以得出结论,使用 GPU 进行并行计算,并且最适合使用 GPU 解决的任务是能够并行完成的任务。如果计算可以并行完成,我们就可以通过并行编程方法和 GPU 加速我们的计算。

神经网络是令人尴尬的并行

现在让我们关注神经网络,看看为何深度学习如此大量地使用 GPU。我们刚刚了解到 GPU 适合进行并行计算,而这一事实正是深度学习使用它们的原因。神经网络是 令人尴尬的并行

在并行计算中,一个 令人尴尬的并行 任务是指几乎不需要将整体任务分解为一组可以并行计算的较小任务。

令人尴尬的并行任务是那些很容易看出一组较小任务彼此独立的任务。

img

神经网络之所以令人尴尬的并行,原因就在于此。我们使用神经网络进行的许多计算可以很容易地分解为较小的计算,使得一组较小的计算彼此不依赖。一个这样的例子是卷积。

卷积示例

让我们来看一个示例,卷积操作:

img

这个动画展示了没有数字的卷积过程。我们在底部有一个蓝色的输入通道。一个在底部阴影的卷积滤波器在输入通道上滑动,以及一个绿色的输出通道:

  • 蓝色(底部) - 输入通道
  • 阴影(在蓝色上方) - 3 x 3​ 卷积滤波器
  • 绿色(顶部) - 输出通道

对于蓝色输入通道上的每个位置,3 x 3​ 滤波器都会进行一次计算,将蓝色输入通道的阴影部分映射到绿色输出通道的相应阴影部分。

在动画中,这些计算是依次一个接一个地进行的。然而,每次计算都与其他计算独立,这意味着没有计算依赖于其他任何计算的结果。

因此,所有这些独立的计算都可以在 GPU 上并行进行,并产生整体的输出通道。

这使我们能够看到,通过使用并行编程方法和 GPU,可以加速卷积操作。

Nvidia 硬件 (GPU) 和软件 (CUDA)

这就是 CUDA 发挥作用的地方。Nvidia 是一家设计 GPU 的技术公司,他们创建了 CUDA 作为一个软件平台,与他们的 GPU 硬件配合使用,使开发人员更容易构建利用 Nvidia GPU 并行处理能力加速计算的软件。

img

Nvidia GPU 是实现并行计算的硬件,而 CUDA 是为开发人员提供 API 的软件层。

因此,你可能已经猜到,要使用 CUDA,需要一个 Nvidia GPU,CUDA 可以从 Nvidia 的网站免费下载和安装。

开发人员通过下载 CUDA 工具包来使用 CUDA。工具包中包含专门的库,如 cuDNN,CUDA 深度神经网络库。

img

PyTorch 内置 CUDA

使用 PyTorch 或任何其他神经网络 API 的一个好处是并行性已经内置在 API 中。这意味着作为神经网络程序员,我们可以更多地专注于构建神经网络,而不是性能问题。

对于 PyTorch 来说,CUDA 从一开始就内置其中。不需要额外下载。我们只需要有一个支持的 Nvidia GPU,就可以使用 PyTorch 利用 CUDA。我们不需要直接了解如何使用 CUDA API。

当然,如果我们想在 PyTorch 核心开发团队工作或编写 PyTorch 扩展,那么直接了解如何使用 CUDA 可能会很有用。

毕竟,PyTorch 是用所有这些编写的:

  • Python
  • C++
  • CUDA

在 PyTorch 中使用 CUDA

在 PyTorch 中利用 CUDA 非常容易。如果我们希望某个特定的计算在 GPU 上执行,我们可以通过在数据结构 (张量) 上调用 cuda()​ 来指示 PyTorch 这样做。

假设我们有以下代码:

> t = torch.tensor([1,2,3])
> t
tensor([1, 2, 3])

以这种方式创建的张量对象默认在 CPU 上。因此,使用这个张量对象进行的任何操作都将在 CPU 上执行。

现在,要将张量移动到 GPU 上,我们只需编写:

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

这种能力使 PyTorch 非常灵活,因为计算可以选择性地在 CPU 或 GPU 上执行。

GPU 可能比 CPU 慢

我们说我们可以选择性地在 GPU 或 CPU 上运行我们的计算,但为何不将 每个 计算都运行在 GPU 上呢?

GPU 不是比 CPU 快吗?

答案是 GPU 只对特定 (专门化) 任务更快。我们可能会遇到的一个问题是瓶颈,这会降低我们的性能。例如,将数据从 CPU 移动到 GPU 是代价高昂的,所以在这种情况下,如果计算任务很简单,整体性能可能会更慢。

将相对较小的计算任务移动到 GPU 上不会让我们加速很多,实际上可能会让我们变慢。记住,GPU 适合将任务分解为许多较小任务,如果计算任务已经很小,我们将不会通过将任务移动到 GPU 上获得太多好处。

因此,通常在刚开始时只使用 CPU 是可以接受的,随着我们解决更大更复杂的问题,开始更频繁地使用 GPU。

GPGPU 计算

起初,使用 GPU 加速的主要任务是计算机图形,因此得名图形处理单元,但在近年来,出现了许多其他种类的并行任务。我们已经看到的一个这样的任务是深度学习。

深度学习以及许多其他使用并行编程技术的科学计算任务,正在导致一种新的编程模型的出现,称为 GPGPU 或通用 GPU 计算。

GPGPU 计算现在更常见地仅称为 GPU 计算或加速计算,因为现在在 GPU 上执行各种任务变得越来越普遍。

Nvidia 在这个领域一直是先驱。Nvidia 的 CEO 黄仁勋很早就设想了 GPU 计算,这就是 CUDA 在大约十年前被创建的原因。

尽管 CUDA 已经存在很长时间了,但它现在才真正开始腾飞,Nvidia 直到目前为止在 CUDA 上的工作是 Nvidia 在深度学习 GPU 计算方面处于领先地位的原因。

当我们听到黄仁勋谈论 GPU 计算栈时,他指的是 GPU 作为底部的硬件,CUDA 作为 GPU 顶部的软件架构,最后是像 cuDNN 这样的库位于 CUDA 顶部。

这个 GPU 计算栈支持在芯片上进行通用计算能力,而芯片本身是非常专门化的。我们经常在计算机科学中看到像这样的栈,因为技术是分层构建的,就像神经网络一样。

位于 CUDA 和 cuDNN 顶部的是 PyTorch,这是我们将会工作的框架,最终支持顶部的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理-Ch7-快速小波变换和小波包

个人博客!无广告观看,因为这节内容太多了,有点放不下,分了三节 文章目录 快速小波变换(The Fast Wavelet Transform)与两频段子带编译码系统的关系例:计算一维小波变换 一维快速小波反变换例:计算一维小波…

[项目][boost搜索引擎#4] cpp-httplib使用 log.hpp 前端 测试及总结

目录 编写http_server模块 1. 引入cpp-httplib到项目中 2. cpp-httplib的使用介绍 3. 正式编写http_server 九、添加日志到项目中 十、编写前端模块 十一. 详解传 gitee 十二、项目总结 项目的扩展 写在前面 [项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 |…

xxl-job 简单的入门到实战

本文是参考官方文档自己实践一次,纯享版,大致也是作者边写博客边去跟着官方文档实现 一、前期准备 1、官网地址 GitHub地址: GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB&…

【教程】通过Docker运行AnythingLLM

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 官方教程:Local Docker Installation ~ AnythingLLM 1、先创建一个目录用于保存anythingllm的持久化文件: sudo mkdir /app su…

若依(RuoYi-Vue)+Flowable工作流前后端整合教程

此教程适合若依前后端分离项目,其他项目可以在扩展列表中进行查找。 近期公司里需要对很久以前的RuoYi-Vue前后端分离项目扩展出flowable的功能,当然这个重任也是落在了我的身上(不然也不会有这篇文章),然后我在官网看…

ubuntu 网络管理--NetworkManager

ubuntu 网络管理--NetworkManager 1 介绍2 NetworkManager 命令2 nmcli 命令显示可用的wifi AP连接wifi检查网络连接 ?? 如何删除删除网络连接查看设备状态添加一个新的以太网连接设置静态 IP 地址启用并测试连接添加新的wifi连接 3 其他命令参考 1 介绍 NetworkManager 是标…

水库大坝三维模型的开发和使用3Dmax篇

成果图 开发过程 工具插件three.js先加载模型做水体衔接水位测量标尺水位标记断面标记大坝监测点打点 上代码&#xff0c;技术交流V: bloxed <template><div class"box w100 h100"><el-row :gutter"20" v-loading"loading"e…

计算机毕设-基于springboot的校园招聘网站的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

重生之我在异世界学编程之C语言:深入动态内存管理收尾 + 柔性数组篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文常见的动态内存管理错误&#xf…

无人直播源码

DY无人直播系统架构设计介绍 在DY等短视频平台的直播中&#xff0c;无人直播系统能够提供自动化、智能化的互动体验&#xff0c;既减轻了主播的工作量&#xff0c;又提升了观众的参与感。以下是一个典型的无人直播系统架构设计&#xff0c;包含全局配置、点对点互动、产品话术、…

被裁20240927 --- 嵌入式硬件开发 前篇

前篇主要介绍一些相关的概念&#xff0c;用于常识扫盲&#xff0c;后篇开始上干货&#xff01; 他捧着一只碗吃过百家的饭 1. 处理器芯片1.1 处理器芯片制造商一、 英特尔&#xff08;Intel&#xff09;二、 三星&#xff08;SAMSUNG&#xff09;三、 高通&#xff08;Qualcomm…

【Linux】进程间通信 -> 匿名管道命名管道

进程间通信的目的 数据传输&#xff1a;一个进程许需要将它的数据发送给另外一个进程。资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它们发生了某种事件&#xff08;如进程终止时要通知父进程…

Pytorch注意力机制应用到具体网络方法(闭眼都会版)

文章目录 以YoloV4-tiny为例要加入的注意力机制代码模型中插入注意力机制 以YoloV4-tiny为例 解释一下各个部分&#xff1a; 最左边这部分为主干提取网络&#xff0c;功能为特征提取中间这边部分为FPN&#xff0c;功能是加强特征提取最后一部分为yolo head&#xff0c;功能为获…

修改el-select下拉框高度;更新:支持动态修改

文章目录 效果动态修改&#xff1a;效果代码固定高度版本动态修改高度版本&#xff08;2024-12-25 更新&#xff1a; 支持动态修改下拉框高度&#xff09; 效果 动态修改&#xff1a;效果 代码 固定高度版本 注意点&#xff1a; popper-class 尽量独一无二&#xff0c;防止影…

如何完全剔除对Eureka的依赖,报错Cannot execute request on any known server

【现象】 程序运行报错如下&#xff1a; com.netflix.discovery.shared.transport.TransportException报错Cannot execute request on any known server 【解决方案】 &#xff08;1&#xff09;在Maven工程中的pom去掉Eureka相关的引用&#xff08;注释以下部分&#xff0…

vscode写python,遇到问题:ModuleNotFoundError: No module named ‘pillow‘(已解决 避坑)

1 问题&#xff1a; ModuleNotFoundError: No module named pillow 2 原因&#xff1a; 原因1&#xff1a;安装Pillow的pip命令所处的python版本与vscode调用的python解释器版本不同。 如&#xff1a; 原因2&#xff1a;虽然用的是pillow&#xff0c;但是写代码的时候只能用…

Ashy的考研游记

文章目录 摘要12.1112.2012.21 DAY1&#xff08;政治/英语&#xff09;政治英语 12.22 DAY2&#xff08;数学/专业课&#xff09;数学专业课 结束估分 摘要 在24年的12月里&#xff0c;Ashy完成了他的考研冲刺&#xff0c;顺利的结束了他本年度的考研之旅。 在十二月里&#…

AIGC实践|AI/AR助力文旅沉浸式互动体验探索

前言&#xff1a; 本篇文章的创作灵感来源于近期热门话题——让文物“动起来”&#xff0c;各大博物馆成为新进潮流打卡地。结合之前创作的AI文旅宣传片良好的流量和反馈&#xff0c;外加最近比较感兴趣的AR互动探索&#xff0c;想尝试看看自己能不能把这些零碎的内容整合起来…

Kubernetes(k8s)离线部署DolphinScheduler3.2.2

1.环境准备 1.1 集群规划 本次安装环境为&#xff1a;3台k8s现有的postgreSql数据库zookeeper服务 1.2 下载及介绍 DolphinScheduler-3.2.2官网&#xff1a;https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2 官网安装文档&#xff1a;https://dolphinscheduler.apach…

C++的侵入式链表

非侵入式链表 非侵入式链表是一种链表数据结构&#xff0c;其中每个元素&#xff08;节点&#xff09;并不需要自己包含指向前后节点的指针。链表的结构和节点的存储是分开的&#xff0c;链表容器会单独管理这些指针。 常见的非侵入式链表节点可以由以下所示&#xff0c;即&a…