用深度学习基准计算GPU内存带宽方法

1,495 阅读14分钟

Computing GPU memory bandwidth with Deep Learning Benchmarks

在这篇文章中,我们将首先介绍一下GPU和GPU内存带宽的含义。然后我们将讨论GPU内存带宽是如何在引擎盖下确定的。我们还将讨论GPU计算的原理,各代GPU的变化,以及当前高端深度学习GPU基准的概述。

这篇博文涵盖了GPU的一般功能和能力。如果你想了解Paperspace GPU用于深度学习的基准测试,请参考我们最新一轮的基准测试

简介

这里的想法是探索GPU的历史,它们是如何和由谁开发的,GPU内存带宽是如何确定的,相关的商业模式,以及GPU在各代中的实质性变化。这将为我们提供足够的信息,以深入研究深度学习的基准,特别是专注于一个GPU模型和微架构。

在开发GPU加速的应用程序时,有多种技术和编程语言可以入门,但在本文中我们将使用CUDA(一个框架)和Python作为例子。

注意:这篇文章要求你有Linux操作系统和Python编程语言的基本知识,因为我们将使用它,因为它在研究、工程、数据分析和深度学习等领域非常普遍,每一个领域都非常依赖并行计算。


什么是GPU?

缩写GPU代表图形处理单元,它是一种为加快图形性能而创建的定制处理器。你可以把GPU看作是开发人员用来解决计算世界中一些最困难任务的设备。GPU可以实时处理大量数据,使其适合深度学习、视频制作和视频游戏开发。

今天,GPU在制作现代视频和视频游戏观众所期待的流畅图像方面的应用可以说是最被认可的。

虽然GPU和视频卡(或图形卡)这两个短语有时使用相同,但两者之间有一个小小的区别。显卡和GPU不共享内存,因此向显卡写入数据和读回输出是两个独立的操作,可能会导致系统的 "瓶颈"。显卡只是GPU和计算机系统之间的主要环节。

大多数计算机系统不是依靠集成在主板上的GPU,而是利用带有GPU的专用显卡来提高性能。

GPU的一点历史

GPU是由Nvidia在1999年首次引入市场的。Nvidia的第一个GPU被称为Geforce 256,它被设计为每秒至少容纳1000万个多边形。在1999年GeForce 256发布之前,"GPU "这个缩写并不存在。这使得Nvidia能够创造并声称拥有 "世界上首次出现的GPU"。在GeForce 256之前,有不同的、其他的加速器,如图形乘法器。

Computing GPU memory bandwidth with Deep Learning Benchmarks

图1:GeForce 256,图片来源:Konstantine Lanzet,维基百科

与较新的GPU相比,GeForce 256已经过时了,而且功率也低得无可救药,但它仍然是3D图形演变过程中的一个重要卡。它是在220纳米技术上设计的,配备了处理50千兆浮点运算的设备。

GPU内存带宽

GPU内存带宽是指总线在任何给定时间内可以处理的潜在最大数据量,并在决定GPU检索和使用其帧缓冲器的速度方面发挥着作用。内存带宽是每个新GPU最广泛宣传的指标之一,许多型号的GPU能够每秒传输数百GB的数据。

GPU内存带宽重要吗?

你的内存带宽越高,越好。这是一个硬性规定。例如,拥有更多内存带宽的显卡可以更快、更准确地绘制图形。

带宽计数器可以用来判断一个程序是否访问了足够的内存。当你希望尽可能快地复制数据时,你可能希望可访问的系统内存的范围大。同样,如果你的程序执行的算术运算与所请求的系统内存量相比很少,你可能希望使用大量的带宽。

GPU内存带宽的计算

要确定GPU内存带宽,首先必须了解某些基本概念(它们将在后面的计算中全部应用)。

  1. Bits和Bite是两种不同的东西。
  2. 我们有不同的内存数据率

比特和字节的区别 - 内存的数据速率

比特与字节
比特和字节之间的主要对比是,比特是计算机内存的最基本类型,只能存储两个不同的值,但一个字节由八个比特组成,可以存储多达256个不同的值。

比特在计算中用小写的 "b "表示,即Gbps。

字节通过大写的 "B "表示,即GB/s。

内存的数据率

数据率是指一个模块在一定时间内可以发送的比特数。我们有三种随机存取存储器的数据率。

  • 单数据率(SDR)
  • 双倍数据率(DDR)
  • 四倍数据速率(QDR)

最常见的类型是DDR,例如,DDR4 RAM。DDR每个时钟周期发送两个信号。每个时钟周期都有一个上升和下降。

因此,QDR每个时钟周期发送四个信号。

达到的持续内存带宽可以被计算为传输的字节数与内核执行时间的比率。
一个典型的当代GPU可能提供的STREAM结果等于或超过其峰值内存带宽的80%。

GPU- STREAM作为一种工具,可以告知应用开发者关于内存带宽受限的内核的性能。GPU-STREAM是开源的,可以在GitHub的这个仓库中找到。

例子:让我们计算一下GDDR5 Nvidia GeForce, GTX 1660 - 2019的GPU内存带宽。(内存时钟=2001MHz,有效内存时钟=8Gbps,内存总线宽度=192位)

解决方案

步骤1

计算有效内存时钟
有效的内存时钟是由,内存时钟*2(上升和下降)*(数据速率类型)给出的。

数学表达式:
有效内存时钟=内存时钟2(上升和下降)(数据速率类型)。

因此:
2001MHz * 2(上升和下降) * 2(DDR) = 8004比特
8004比特 = 8Gbps

第二步

计算内存带宽
内存带宽=有效内存布*内存总线宽度/8

内存带宽:
8004比特*192/8=192 096字节=192 GB/s
**
最终输出

GPU的内存带宽为192GB/s

关注各代GPU的内存带宽?

了解何时以及如何使用每一种类型的内存对最大化你的应用程序的速度有很大的影响。一般来说,利用共享内存是比较好的,因为使用共享内存的同一框架内的线程可以进行交互。如果再加上其最大的性能,共享内存在正确使用的情况下是一个非常好的 "全能 "选择。然而,在某些情况下,采用其他类型的可访问内存可能会更好。

根据内存带宽,有四种主要形式的GPU,即

  • 专门的图形卡
  • 集成图形处理单元
  • 混合图形处理
  • 流处理和通用型GPU

在低端台式机和笔记本电脑领域,最新一类的GPU(混合图形处理)与集成图形进行竞争。ATI的HyperMemory和Nvidia的TurboCache是最常见的改编。混合图形卡的价格比集成图形卡略高,但远远低于独立图形卡。两者都与主机交换内存,并具有适度的专门内存缓存,以补偿计算机RAM的过度响应。

大多数GPU是根据内存带宽和其他大规模计算为某种目的而建造的。

  1. 深度学习和人工智能。Nvidia Tesla/Data Center,AMD Radeon Instinct
  2. 视频制作和游戏。GeForce GTX RTX,Nvidia Titan,Radeon VII,Radeon和Navi系列
  3. 小规模的工作站。Nvidia Quadro,Nvidia RTX,AMD FirePro,AMD Radeon Pro
  4. 云工作站。Nvidia Tesla/Data Center,AMD Firestream
  5. 机器人。Nvidia Drive PX

好了,一旦你对GPU应用中可访问的各种类型的内存有了一点了解,你就准备学习如何以及何时有效地使用它们。

GPU编程的语言解决方案--CUDA for Python

GPU编程是一种使用GPU加速器执行极其平行的通用计算的技术。虽然GPU最初是为3D建模而生,但现在它们被广泛用于广泛的计算。

除了图形渲染外,GPU驱动的并行计算正被用于深度学习和其他并行化密集型任务。

在开发GPU加速的应用程序时,有多种技术和编程语言可以开始使用,但在本文中,我们将使用CUDA和Python作为例子。

让我们来看看如何在Python中使用CUDA,首先在你的机器上安装CUDA。

CUDA的安装

要想开始,你要确保你的机器有以下条件。

  • 具有CUDA功能的GPU
  • 支持的Linux版本 - Ubuntu 20.04
  • 在你的系统上安装了GCC
  • 安装了正确的内核牧民和开发包

然后再 安装CUDA。按照下面的说明,在本地安装程序上安装CUDA。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb  
sudo dpkg -i cuda-repo-ubuntu2004-11-4-local_11.2-470.57.02-1_amd64.deb  
sudo apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub 
sudo apt-get update  
sudo apt-get -y install cuda

你可以通过抛弃你的本地机而使用更强大的云计算机器,如梯度笔记本核心机来消除这个麻烦。除非另有规定,每台Paperspace机器都预装了CUDA和CuPy,以方便用户的任何深度学习需求。

安装CuPy库

其次,由于NumPy是Python数据科学环境的基础库,我们将在这个环节利用它。

利用NumPy的最简单方法是使用CuPy,它是一个可以在GPU上复制NumPy功能的替代库。

Pip可以用来安装CuPy源代码包的稳定发布版本。

pip install cupy

确认CuPy已正确安装

这一步对于确认CuPy可以将你的系统提升到什么水平是非常必要的。为此,我们将通过在一个.py文件中编写一个简单的Python脚本来完成这一工作。

注意:这一步需要你了解Python程序的基本文件结构

下面的脚本将导入NumPy和CuPy库,以及时间库,这些库将用于对处理单元进行基准测试。

import numpy as np
import cupy as cp
from time import time

基准测试

现在让我们定义一个将被用来比较GPU和CPU的函数。

def benchmark_speed(arr, func, argument):
	start_time = time()
    func(arr, argument) #your argument will be broadcasted into a matrix
    finish_time = finish_time - start_time
    return elapsed_time

然后,你必须创建两个矩阵:一个用于CPU,一个用于GPU 对于我们的矩阵,我们将选择一个9999乘9999的形式。

# store a matrix into global memory
array_cpu = np.random.randint(0, 255, size=(9999, 9999))

# store the same matrix to GPU memory
array_gpu = cp.asarray(array_cpu)

最后,我们将使用一个基本的加法函数来测试CPU和GPU处理器的效率。

# benchmark matrix addition on CPU by using a NumPy addition function
cpu_time = benchmark_speed(array_cpu, np.add, 999)

# you need to run a pilot iteration on a GPU first to compile and cache the function kernel on a GPU
benchmark_speed(array_gpu, cp.add, 1)

# benchmark matrix addition on GPU by using CuPy addition function
gpu_time = benchmark_speed(array_gpu, cp.add, 999)

# Compare GPU and CPU speed
faster_speed = (gpu_time - cpu_time) / gpu_time * 100

让我们把我们的结果打印到控制台

print(f"CPU time: {cpu_time} seconds\nGPU time: {gpu_time} seconds.\nGPU was {faster_speed} percent faster")

我们已经证实,整数加法在GPU上要快得多。如果你在工作中处理大量的可以并行处理的数据,一般来说,值得多了解一下GPU编程。正如你所看到的,对大矩阵采用GPU计算可以显著提高性能。

如果你没有GPU,你可以在梯度笔记本中运行这段代码,亲自看看他们的GPU在这个基准任务中的表现。你可以在你已经拥有的梯度笔记本中的任何单元中运行这段代码,或者你可以用任何GPU作为机器类型旋转一个新的机器。

深度学习和GPU之间的联系

人工智能(AI)正在迅速变化,新的神经网络模型、方法论和应用案例经常出现。因为没有一种技术是所有机器学习和深度学习应用的最佳选择,在特定的使用场景中,GPU可以比其他不同的硬件平台提供独特的优势。

今天的许多深度学习解决方案都依赖于GPU与CPU的协作。由于GPU具有巨大的处理能力,它们可能在受益于GPU并行计算设计的工作负载中提供巨大的加速,如图像识别。人工智能和深度学习是GPU技术的两个最有趣的用途。

基准测试的GPU的总结

包括英伟达的最新产品,包括一代安培GPU。还评估了多GPU配置的功能,如四RTX 3090的安排。

本节涵盖了本地GPU的一些选择,由于其计算和内存性能以及与当前深度学习框架的连接性,这些GPU是目前最适合深度学习训练和开发的一些选择。

GPU名称描述
GTX 1080TI英伟达用于深度学习的传统GPU于2017年推出,面向计算任务,具有11GB DDR5内存和3584个CUDA核心。它已经停产了一段时间,只是作为一个参考点加入。
RTX 2080TIRTX 2080 TI在2018年第四季度推出。它有5342个CUDA核心,结构为544个英伟达图灵混合精度张量核心,具有107个张量TFLOPS的AI能力和11GB的超快速GDDR6内存。这款GPU于2020年9月停产,目前已不再供应。
泰坦RTXTitan RTX由最强大的TuringTM架构提供动力。Titan RTX拥有576个张量核心和24GB的超快GDDR6内存,提供130个张量TFLOPs的加速能力。
Quadro RTX 6000Quadro RTX 6000是著名的Titan RTX的服务器变体,具有增强的多GPU通风、扩展的虚拟化功能和ECC内存。它使用与Titan RTX相同的TuringTM内核,该内核有576个张量核心,提供130个张量TFLOPs的生产力,以及24GB的超快GDDR6 ECC内存。
Quadro RTX 8000Quadro RTX 8000是RTX 6000的大兄弟姐妹。具有相同的GPU处理单元,但GPU内存是原来的两倍(48GB GDDR6 ECC)。事实上,它是目前拥有最高可访问GPU内存的GPU,使其成为最密集的内存活动的理想选择。RTX 3080首批使用NVIDIA AmpereTM架构的GPU型号之一,具有改进的RT和Tensor Cores以及新的实时多处理器。RTX 3080拥有10GB的超高速GDDR6X内存和8704个CUDA核心。RTX 3080 TiRTX 3080的更大的兄弟,具有12GB的超快GDDR6X内存和10240个CUDA核心。
RTX 3090GeForce RTX 3090属于NVIDIA AmpereTM GPU一代的TITAN级别。它由10496个CUDA核心、328个第三代Tensor Cores以及创新的流媒体多处理器提供动力。它和Titan RTX一样,有24GB的GDDR6X内存。

然而,使用本地GPU有一些限制。首先,你被限制在你购买的能力范围内。对于大多数GPU拥有者来说,要想换成不同的GPU是不可能的,或者说费用太高。其次,这些主要是Nvidia的GeForce 30和工作站系列GPU。这些并不像特斯拉/数据中心GPU那样为处理大数据而设计。

总结一下

你的项目的最佳GPU将由你的人工智能操作的成熟度、你工作的规模以及你使用的具体算法和模型决定。在前面的章节中已经提供了许多因素,以帮助您选择最佳的GPU或一组GPU来满足您的目的。

Paperspace可以让你根据需要在不同的GPU之间切换,以完成任何和所有的深度学习任务,所以在购买昂贵的GPU之前,请尝试他们的服务。