随着传统的顺序算法到日益流行的并行算法,GPU 将成为加速复杂计算不可或缺的工具。在 AI 和机器学习任务等具有海量数据集和复杂的神经网络的架构中,GPU 的并行处理能力具有很大的优势。本文将深入探讨学习。
原文链接:https://journal.hexmos.com/gpu-survival-toolkit/
作者 | Rijul Rajesh译者| 弯月
责编 | 夏萌
出品 | CSDN(ID:CSDNnews)
为什么仅有 CPU 的知识还不够
在如今的 AI 时代,大多数开发人员接受过 CPU 相关知识的培训。这些知识已成为教学内容的一部分,因此一般我们都会以面向 CPU 的方式思考和解决问题。
然而,CPU 的问题在于它们依赖于顺序架构。在当今世界,我们依赖于大量并行任务,而 CPU 并不适合这些情况。
开发人员面临的问题包括:
执行并行任务
传统的 CPU 是线性运行的,一次执行一条指令。有这种限制是因为 CPU 通常拥有若干针对单线程性能进行过优化的强大核心。
在面对多个任务时,CPU 会分配资源来依次处理每个任务,即顺序执行指令。在需要同时关注大量任务的情况下,这种方法会变得效率低下。
虽然我们可以通过多线程等技术来提高 CPU 的性能,但其基本设计理念优先考虑的是顺序执行。
高效运行 AI 模型
AI模型采用 Transformer 等先进架构,利用并行处理来提高性能。与顺序运行的旧式循环神经网络 (RNN)不同,GPT 等现代Transformer 可以同时处理多个单词,从而提高训练的效率和能力。因为当我们并行训练时,就可以得到更大的模型,而更大的模型会生成更好的输出。
并行性的概念超越了自然语言处理,扩展到了图像识别等其他领域。例如,图像识别架构 Ale.NET 可以同时处理图像的不同部分,展现出了并行处理的强大功能,从而实现了准确的模式识别。
然而,以单线程性能为重心设计的 CPU 很难充分发挥并行处理的潜力。它们无法有效地分配和执行复杂的 AI 模型所需的大量并行计算。
因此,GPU 的开发变得越来越普遍,为的是满足 AI 应用程序中并行处理的特定需求,从而实现更高的效率和更快的计算。
如何利用 GPU 驱动开发解决这些问题
GPU 核心的大规模并行性
与 CPU 的核心相比,工程师们设计的 GPU 具有更小、高度专业化的核心。这种架构允许 GPU 同时执行多个并行任务。
GPU中的大量核心非常适合依赖于并行性的工作负载,例如图形渲染和复杂的数学计算。
在本文中,我们将演示如何利用 GPU 的并行性来缩短完成复杂的任务所需的时间。
AI 模型中使用的并行性
AI模型,特别是基于 TensorFlow 等深度学习框架构建的模型,展现出了高度的并行性。神经网络的训练涉及大量矩阵运算,而 GPU 凭借其庞大的核心数量,能够并行化这些运算。TensorFlow 以及其他流行的深度学习框架都进行了优化,能够利用 GPU 的能力来加速模型的训练和推理。
在本文中,我们将展示如何利用 GPU 的强大功能来训练神经网络。
CPU与 GPU 有何不同?CPU
顺序架构
中央处理单元(CPU)的设计重心是顺序处理。它们擅长线性执行一组指令。
CPU针对需要高单线程性能的任务进行了优化,例如
处理并行任务的核心数量有限
CPU的核心数量较少,消费级的处理器通常有 2~16个核心。每个核心都能够独立处理自己的指令集。
GPU
并行架构
图形处理单元(GPU)采用并行架构设计,能够高效地执行并行处理任务。
适合于:
GPU通过将多个任务分解为更小的并行子任务来同时处理多个任务。
数千个用于并行任务的核心
与 CPU 不同,GPU 拥有大量核心,通常高达数千个。这些核心组织成了流式多处理器(SM)或类似的结构。
丰富的核心使 GPU 能够同时处理大量数据,非常适合并行任务,例如图像和视频处理、深度学习和科学模拟等。
AWS GPU 实例:初学者指南
Amazon Web Services(AWS)提供各种用于机器学习等任务的 GPU 实例。
以下是不同类型的 AWS GPU 实例及其用例:
通用 GPU 实例
推理优化 GPU 实例
图形优化 GPU 实例
托管 GPU 实例
使用 Nvidia 的 CUDA 进行GPU 驱动开发CUDA是什么?
CUDA是一款 NVIDIA 开发的并行计算平台和编程模型,可帮助开发人员利用 GPU 加速器的强大功能来提高应用程序的速度。
下面,我们将使用 CUDA 来展示一个示例。
设置 CUDA
你可以按照以下步骤操作,在计算机上设置 CUDA。
在安装好 CUDA 后,你可以尝试以下命令。
LSPCI | grep VGA
此命令可识别并列出系统中的 GPU。
nvidia-smi
此命令为 NVIDIA System Management Interface(NVIDIA 系统管理界面)的缩写,可提供系统中有关 NVIDIA GPU 的详细信息,包括利用率、温度、内存使用情况等。
sudo lshw -C display
此命令可提供系统中有关显示控制器(包括显卡)的详细信息。
inxi -G
此命令可提供有关图形子系统的信息,包括有关 GPU 和显示器的详细信息。
sudo hwinfo --gfxcard
此命令可提供系统中有关显卡的详细信息。
使用 CUDA 框架
下面,我们来展示 CUDA 的一些具体功能。
数组加法问题
数组加法问题很适合演示 GPU 并行化。
考虑以下数组:
如果由 CPU 来执行整个操作,则代码如下:
前一个循环遍历数组的每个元素,并依次执行加法。当需要处理大量数字时,这种方法就会由于其顺序执行的性质而变得缓慢。
为了克服这个限制,GPU 提供了一种解决方案:并行化加法运算。不同于依次执行运算的 CPU,GPU 可以同时执行多项加法。
例如,运算 1+7、2+8、3+9、4+10、5+11 和 6+12 可以借助 GPU 并行化同时执行。
利用 CUDA,实现并行加法的代码如下:
我们将使用内核文件(.cu)进行演示。
我们来逐行讲解代码。
下面,我们来看看 main 函数。
创建指针 cudaA、cudaB 和 cudaC,指向 GPU 上的内存。
我们使用 cudaMalloc,为向量 cudaA、cudaB 和 cudaC 分配 GPU上的内存。
使用 cudaMemcpy 将向量 a 和b 的内容从主机复制到 GPU。
使用一个块和多个(数量等于向量大小)线程调用内核函数 vectorAdd。
将结果向量 cudaC 从 GPU 复制回主机。
然后就可以正常输出结果了:
我们使用 nvcc 命令执行这段代码。
输出如下:
完整的代码,请参见这里(https://Github.com/RijulTP/GPUToolkit/tree/main/array-addition?ref=journal.hexmos.com)。
使用 GPU 优化 Python/ target=_blank class=infotextkey>Python 中的图像生成
下面,我们来探讨如何使用 GPU 处理来优化性能密集型任务,例如图像生成。
曼德博集合是一种数学结构,可根据指定方程中特定数字的行为形成复杂的视觉模式。生成这种集合是一项资源密集型操作。
通过下面的代码片段,你可以了解到使用 CPU 处理生成曼德博集合的传统方法,该方法的速度很慢。
上面的代码生成结果需要耗费 4.07 秒。
为了提高速度,我们可以通过 Numba 库利用 GPU 的并行化。具体方法如下。
首先,我们导入 Numba 库的即时编译、用于 GPU 加速的 CUDA 以及其他实用程序。
@jit指示 Numba 执行即时编译,将 Python 代码转换为机器代码,以提高执行速度。
根据定义,mandel_kernel 将在 CUDA GPU 上执行。负责跨 GPU 线程并行生成曼德博集合。
接下来,我们可以在 create_fractal_gpu 函数中使用 GPU 加速的曼德博集合生成。create_fractal_gpu 函数需要分配 GPU 内存,启动 GPU 内核 (mandel_kernel),并将结果复制回 CPU。
上述代码只需 0.0046 秒内就能执行完成。比之前的 CPU 的代码要快许多。
完整的代码,请参见这里(https://github.com/RijulTP/GPUToolkit/tree/main/mandelbrot?ref=journal.hexmos.com)。
使用 GPU 训练区分猫狗的神经网络
GPU在 AI 领域的应用是如今的热门话题之一,出于演示的目的,下面我们来创建一个用于区分猫和狗神经网络。
准备工作
导入库:
初始化卷积神经网络(CNN)
加载训练数据
构建 CNN 架构
编译模型
训练模型
训练完成后,使用 classifier.save 将模型存储在 .h5 文件中。
在下面的代码中,我们将使用 trained_model.h5 来识别猫和狗。
输出如下:
完整的代码,请参见这里(https://github.com/RijulTP/GPUToolkit/tree/main/neural-network?ref=journal.hexmos.com)。
总结
在即将到来的 AI 时代,GPU 是不容忽视的存在,我们应该深入了解它的能力。
随着我们从传统的顺序算法过渡到日益流行的并行算法,GPU 将成为加速复杂计算不可或缺的工具。在 AI 和机器学习任务等具有海量数据集和复杂的神经网络的架构中,GPU 的并行处理能力具有很大的优势。
此外,GPU 已超出传统的机器学习领域,在科学研究、模拟和数据密集型任务中也有找到了应用。事实证明,GPU 的并行处理能力有助于解决药物发现、气候建模以及金融模拟等各个领域的难题。