虽然CPU处理AI管线的核心序列任务,但模型训练的繁重计算几乎总是由另一种处理器完成:图形处理器(GPU)。GPU最初用于渲染视频游戏中的3D图形,但其架构已被证实非常适合深度学习的数学运算。原因是其大规模并行性。吞吐量架构CPU旨在低延迟执行多种任务。它包含少量高性能核心,每个核心都能够执行复杂指令并做出精密判断,以加速单个执行线程。可以将其想象成一小队资深厨师,每位厨师都能快速地从头到尾准备一整套多道菜肴。相比之下,GPU旨在高吞吐量计算。它包含数千个更小、更简单的核心,这些核心单个能力较弱,但可以同步处理同一个问题。这不像一队资深厨师,更像一个大型厨房流水线,数千名厨师每人执行一项简单、重复的任务,例如同时切数千个洋葱。这种架构方式有时被称为单指令多数据(SIMD)。digraph G { rankdir=TB; splines=ortho; node [shape=box, style="filled", fontname="sans-serif"]; subgraph cluster_cpu { label="CPU 架构"; bgcolor="#e9ecef"; style="rounded,filled"; fontcolor="#495057"; c_control [label="复杂\n控制", fillcolor="#a5d8ff", shape=box, height=1]; c_cache [label="大缓存", fillcolor="#b2f2bb", shape=box, height=1]; subgraph cluster_cpu_cores { label="更少、更快的核心"; style=invis; node [shape=box, style="filled", fillcolor="#74c0fc", fixedsize=true, width=1, height=1.5]; c_core1 [label="核心 1"]; c_core2 [label="核心 2"]; c_core3 [label="核心 3"]; c_core4 [label="核心 4"]; } c_mem [label="系统内存\n(DRAM)", shape=cylinder, fillcolor="#ffc9c9", height=1.5]; c_control -> {c_core1, c_core2, c_core3, c_core4} [style=invis]; c_cache -> {c_core1, c_core2, c_core3, c_core4} [style=invis]; {c_core1, c_core2, c_core3, c_core4} -> c_mem [dir=both, penwidth=2, color="#495057"]; } subgraph cluster_gpu { label="GPU 架构"; bgcolor="#e9ecef"; style="rounded,filled"; fontcolor="#495057"; g_control [label="简单\n控制", fillcolor="#a5d8ff", shape=box, height=0.5]; g_cache [label="小缓存", fillcolor="#b2f2bb", shape=box, height=0.5]; subgraph cluster_gpu_cores { label="数千个更简单的核心"; style=invis; node [shape=box, style="filled", fillcolor="#74c0fc", fixedsize=true, width=0.3, height=0.3, label=""]; g_core1 g_core2 g_core3 g_core4 g_core5 g_core6 g_core7 g_core8 g_core9 g_core10; g_core11 g_core12 g_core13 g_core14 g_core15 g_core16 g_core17 g_core18 g_core19 g_core20; g_core21 g_core22 g_core23 g_core24 g_core25 g_core26 g_core27 g_core28 g_core29 g_core30; } g_mem [label="高带宽\n内存 (VRAM)", shape=cylinder, fillcolor="#ffc9c9", height=1.5]; g_control -> cluster_gpu_cores [style=invis]; g_cache -> cluster_gpu_cores [style=invis]; cluster_gpu_cores -> g_mem [dir=both, penwidth=5, color="#495057"]; } }CPU与GPU架构对比图。CPU将更多硅片用于复杂的控制逻辑和缓存,以支持更少但更强大的核心。GPU则将其大部分硅片用于大量的简单算术核心,并连接到专用、高带宽的内存。神经网络运算加速深度学习模型由人工神经元层构成,这些层内的计算主要由几种数学运算组成,这些运算在大型数据张量上反复执行。最常见的是矩阵乘法。在模型的前向传播过程中,输入数据在每一层都与一个权重矩阵相乘。这可以表示为: $$ \text{输出} = \text{激活}(\text{输入} \cdot \text{权重} + \text{偏置}) $$ 输出矩阵中的每个元素都是点积的结果,这种运算独立于其他任何元素的计算。GPU可以将其数千个核心分配给数千个小而独立的点积计算,同时执行所有计算。CPU则需要以更序列化的方式执行这些计算,使用其少量高性能核心逐一或小批量处理这些操作。这种固有的并行性使GPU在处理神经网络层时比CPU快数个数量级。人工智能的重要硬件特点并非所有GPU都相同。选择用于AI工作负载的GPU时,某些特点特别重要:计算核心: 这些是基本的处理单元。在NVIDIA GPU中,它们被称为CUDA核心。GPU拥有的核心越多,能执行的并行操作就越多。张量核心: 在NVIDIA的Volta架构中引入,张量核心是旨在加速一种特定运算的专用硬件单元:矩阵乘加运算(MAC)。这种运算是深度学习的核心。张量核心可以在单个时钟周期内对4x4矩阵执行融合乘加运算,为训练和推理都提供了显著加速,尤其在使用FP16等混合精度格式时。内存带宽: GPU的核心只有在有数据输入时才有用。GPU使用自己的专用高速内存,通常称为VRAM。现代面向AI的GPU使用高带宽内存(HBM),它提供了极宽的内存接口。这种高带宽对于确保数千个核心持续获得数据供应是必要的,并防止它们闲置,这种情况被称为内存饥饿。软件层:CUDA 和 cuDNN如果没有软件层管理,GPU的原始算力将无法使用。NVIDIA的CUDA平台便在此发挥作用。CUDA(Compute Unified Device Architecture)是一个并行计算平台和编程模型,允许开发人员使用类C语言编写GPU程序。然而,大多数数据科学家和机器学习工程师并不编写低级CUDA代码。他们转而使用TensorFlow和PyTorch等深度学习框架。这些框架又依赖于高度优化的库,例如NVIDIA CUDA 深度神经网络库 (cuDNN)。cuDNN是一个GPU加速的深度神经网络基元库。它为标准例程提供优化实现,例如:卷积池化归一化激活函数当你编写一行PyTorch代码来定义一个卷积层时,cuDNN会高效地在GPU硬件上执行该操作。这种抽象让开发人员能够从GPU获得最大性能,而无需成为并行编程专家。这种大规模并行硬件和成熟软件栈的组合,使GPU成为进行认真深度学习任务的首选。