让我们看一个使用 GPU 能力分析 ML 应用程序的示例。假设我们面临训练LSTM 神经网络以生成连贯文本的任务。为此目的编写了一个基于 Keras 的Python 脚本。请注意,Python 代码本身并不显式使用 GPU。但是,“输出”到 GPU 可以发生在 Keras 库的函数内,无需用户直接参与。因此,请随意启动 NVIDIA Profiler,将 Python 脚本本身指定为应用程序,分析器将获取其中的 GPU 代码。但是,您应该将分析的持续时间限制为较短的间隔,例如 30 秒。由于神经网络训练算法是均匀且周期性的,我们可以认为这个间隔表征了整个应用程序的行为,同时简化了分析器收集数据的工作。
为了有效地加载 GPU,必须满足两个条件:
GPU不应该闲置:有必要让某些核心始终处于加载状态;
内核程序必须使用尽可能多的计算单元,例如,乘以繁琐的矩阵。
下图显示了分析我们的 ML 脚本的过程:
从左到右是执行时间,中间的黄色小“砖块”是运行计算的CPU线程中的API调用,底部的绿色部分是GPU负载。正如您可能猜到的那样,100% GPU 使用率不会显示在小方块中,而是显示在一个连续的块中。但实际上这是不可能实现的,最好的希望就是“砖块”之间几乎没有间隙。因此,在该示例中不满足条件(1)。
相关应用程序使用单精度浮动通用矩阵乘法 (SGEMM) 内核
属性窗口(右)表明内核正在“16 个块,每块 128 个线程”配置中运行。这在入门级 GPU 上会产生良好的结果,但高端 VOLTA GPU 可以使用多达一千个这样的单元!这意味着内核使用的可用资源不到 1/10。
现在您知道如何编写低效的 GPU 应用程序(当然最好不要这样做)。您的客户可能会争辩说,使用 NVIDIA RTX 显卡,代码的运行速度仍然快了 10%。这个论点听起来就像“普里奥拉在穿越沼泽的比赛中比法拉利快一点”。换句话说,如果应用程序没有展现 GPU 的优势,那么性能几乎可以是任何,并且绝对而言 – 在所有变体中都很弱。为了在强大的 GPU 上获得显着加速,您需要解决真正的高负载任务。
左侧是分步说明,可帮助您分析和优化您的应用程序。右侧显示详细的结果和分析信息图表。
无引导分析包含可用进程的列表,每个进程都可以手动运行并查看结果:
—反汇编器
源代码反汇编视图用于显示汇编程序级别的分析结果。源代码记录了单个命令执行的强度和效率。根据严重程度(低、中或高),相应的标记被涂成不同的颜色。这些信息是基本优化技术的基础:开发人员根据一般背景(热点)识别最关键(“重”)的命令并处理它们 – 更改程序逻辑、降低准确性等。
然而,购买手机号码列表的道 传真列表 德影响是深远的。企业必须确保遵守《通用数据保护条例》(GDPR)和《电话消费者保护法》(TCPA)等法规。这些框架旨在保护消费者隐私,并要求个人在将其联系信息用于营销目的之前提供知情同意。
-查看GPU信息
GPU 详细信息视图显示一个表格,其中包含有关分析应用程序中每个内存副本 ( memcpy ) 和内核启动 ( kernel ) 的信息。对于内核,各列显示相应的指标和事件。
IT 领域争论的主要话题之一是对特定制造商的设备或软件的偏好。您肯定遇到过“文本编辑器 Vim 与 Emacs”、“Intel 处理器与 AMD”、“NVIDIA 显卡与 Radeon”等争论。 GPU最初是为了渲染计算机图形而创建的,因此经常玩计算机游戏的人当然可以表达对这个或那个显卡制造商的看法。我们将主要关注 NVIDIA GPU,因为它们在机器学习领域更为普及。
CPU 和 GPU 有什么区别
两者都是执行程序和任意指令的计算单元。但是,尽管如此,它们之间还是有很大不同。
CPU 由少量核心组成,目前通常不超过 10 个。超线程技术允许每个核心以多个线程工作。简单来说,一个10核20线程的CPU可以同时执行20个任务。这不算多,但事实上,CPU线程非常强大,它们的一条指令可以开启很多进程。
有了 GPU,情况就不同了。它们包含数千个处理核心,但每个核心的运行时钟速度都比 CPU 低得多(时钟速度衡量处理器每秒执行的操作数)。与 CPU 不同,GPU 核心无法彼此独立运行。他们并行执行任务并同时执行。因此,根据核心数量来比较 GPU 和 CPU 的性能是没有意义的——它们的用途完全不同。
新一代 GPU 大约每年半就会问世
这就是为什么经验丰富的研究人员正在积极迁移到云端并不断访问最新的图形加速器。提供商负责 手机号码列表 更新、管理和支持它们,客户可以节省大量费用。例如,在 REG.RU 使用配备当今顶级GPU NVIDIA Tesla V100 的服务器将比在商店购买类似的显卡便宜,特别是如果您在有限的时间内需要它。
CPU 和 GPU 之间的另一个显着区别是内存使用。 CPU主要消耗系统的随机存取存储器(RAM或RAM),其大小达到几十GB。 GPU 有自己的内置视频内存 (VRAM)。在图形核心中,对内存的写入和读取是顺序进行的——例如,在处理像素时,它们会被依次读取,而在CPU中,内存访问是以一种更复杂的方式组织的。
GPU 擅长可分解为许多并发任务的计算
例如图像处理或矩阵乘法。 CPU用于各种强大的处理,但在并行化方面远远不如GPU。
我们记得,在卷积架构中,矩阵乘法不断发生,因此 GPU 是训练神经网络不可或缺的工具。
为了直接在 GPU 上运行代码
NVIDIA 开发了 CUDA 加速 如何建立电话营销联系人列表 器。编写 CUDA 代码是一个相当复杂的过程,需要深入研究图形加速器的架构。因此,为了方便起见,您可以使用更高级别的库:cuBLAS、cuFFT、cuDNN 等。还有一个针对任何 GPU(甚至来自 AMD)进行优化的 openCL 框架。但它往往显示较慢的结果。
对于深度学习任务,现成的库通常就足够了,因为编写它们的开发人员试图尽可能地优化和简化大多数必要的操作。