CPU
-
CPU 是一种基于冯·诺依曼结构的通用处理器。这意味着 CPU 与软件和内存协同工作,如下所示:
-
CPU 最大的优点是它们的灵活性。可以在 CPU 上为许多不同类型的应用加载任何类型的软件。
-
对于每次计算,CPU 从内存加载值,对值执行计算,然后将结果存储回内存中。与计算速度相比,内存访问速度较慢,并可能会限制 CPU 的总吞吐量。这通常称为[冯·诺依曼瓶颈]。
-
CPU的应用场景
- 需要最高灵活性的快速原型设计
- 训练时间不长的简单模型
- 有效批量大小较小的小型模型
- 包含许多以 C++ 编写的自定义 TensorFlow/PyTorch/JAX 操作的模型
- 受主机系统可用 I/O 或网络带宽限制的模型
-
冯·诺依曼结构:是一种基于[约翰·冯·诺依曼John von Neumann]和其他人1945年在*[EDVAC报告初稿]*中的描述的计算机架构。描述了具有以下组件的电子[数字计算机]的设计架构:
- 具有[算术逻辑单元]和[处理器寄存器的处理单元]
- 包含[指令寄存器]和[程序计数器的控制单元]
- [存储数据]和指令的内存
- 外部[大容量存储]
- 输入和输出机构
GPU
- 为了提高吞吐量,GPU 在单个处理器中包含数千个算术逻辑单元 (ALU)。现代 GPU 通常包含 2500 - 5000 个 ALU。大量的处理器意味着您可以同时执行数千次乘法和加法运算。
- 这种 GPU 架构非常适合并行处理大量运算(例如神经网络中的矩阵运算)的应用。实际上,在用于深度学习的典型训练工作负载上,GPU 的吞吐量可比 CPU 高出一个数量级。
- 不过,GPU 仍然是一种通用处理器,必须支持许多不同应用和软件。因此,GPU 存在与 CPU 相同的问题。对于数千个 ALU 中的每一次计算,GPU 都必须访问寄存器或共享内存,以读取运算对象以及存储中间计算结果。
- GPU的应用场景
- 具有大量自定义且必须至少部分在 CPU 上运行的 TensorFlow/PyTorch/JAX 操作的模型
- 具有不能在 Cloud TPU 上使用的 TensorFlow/PyTorch 操作的模型
- 有效批量大小较大的中到大型模型
TPU
-
Google 设计了 Cloud TPU,它们是专门用于神经网络工作负载的矩阵处理器。TPU 不能运行文字处理程序、控制火箭引擎或执行银行交易等多样化服务,但它们可以很快地处理神经网络中使用的大量矩阵运算。
-
TPU 的主要任务是矩阵处理,这是乘法和累加运算的组合。TPU 包含数千个乘法累加器,这些累加器彼此直接连接以形成大型物理矩阵。这称为脉动阵列架构。Cloud TPU v3 在单个处理器上包含两个 128 x 128 ALU 的脉动阵列。
-
TPU 主机将数据流式传输到馈入队列中。TPU 从馈入队列加载数据,并将其存储在 HBM 内存中。计算完成后,TPU 会将结果加载到馈出队列中。然后,TPU 主机从馈出队列读取结果并将其存储在主机的内存中。
-
为了执行矩阵操作,TPU 将 HBM 内存中的参数加载到 MXU 中。
-
然后,TPU 从内存加载数据。每次执行乘法运算时,系统都会将结果传递给下一个乘法累加器。输出是数据和参数之间所有乘法结果的总和。在矩阵乘法过程中,不需要访问内存。
-
TPU的应用场景
- 由矩阵计算主导的模型
- 在主训练循环内没有自定义 TensorFlow/PyTorch/JAX 操作的模型
- 需要训练数周或数月的模型
- 有效批量大小较大的大型模型
-
TPU不太适合
- 需要频繁分支或包含许多元素级代数运算的线性代数程序
- 以稀疏方式访问内存的工作负载
- 需要高精度算法的工作负载
- 主训练循环中包含自定义操作的神经网络工作负载
-
Cloud TPU 资源提高了机器学习应用中大量使用的线性代数计算的性能。在训练大型复杂的神经网络模型时,TPU 可以最大限度地缩短达到准确率所需的时间。以前在其他硬件平台上需要花费数周时间进行训练的模型,在 TPU 中只需数小时即可收敛。
-
张量处理单元 (TPU) 是 Google 设计的机器学习加速器。Cloud TPU 将 TPU 作为一种可伸缩的 GPC 云资源提供。可以使用机器学习框架(如 TensorFlow、Pytorch 和 JAX)在 Cloud TPU 上运行机器学习工作负载。
-
单个 TPU 设备包含 4 个芯片,每个芯片包含 2 个 TPU 核心。TPU 核心包含一个或多个矩阵乘法单元 (MXU)、矢量处理单元 (VPU) 和标量单元。
- MXU 由收缩阵列中的 128 x 128 乘法/累加器组成。MXU 可在 TPU 芯片中提供大部分计算能力。每个 MXU 能够使用 bfloat16 数字格式在每个周期中执行 16K 乘法累加运算。
- VPU 用于激活函数、softmax 等常规计算。 标量单位用于控制流、计算内存地址和其他维护操作。
-
TPU v2
- 一个 TPU v2 开发板包含四个 TPU 芯片和 16 GiB 的 HBM。每个 TPU 芯片包含两个核心。每个核心都有一个 MXU、矢量单位和标量单位。
-
TPU v3
- 一个 TPU v3 开发板包含四个 TPU 芯片和 32 GiB 的 HBM。每个 TPU 芯片包含两个核心。每个核心都有一个 MXU、矢量单位和标量单位。
-
TPU v3 相对于 v2 的性能优势
-
TPU v3 配置中增加的每个核心的 FLOPS 和内存容量可以通过以下方式提高模型的性能:
- 对于计算受限的模型,TPU v3 配置可为每个核心提供明显的性能优势。如果采用 TPU v2 配置且内存受限的模型在采用 TPU v3 配置时同样也受内存限制,则可能无法实现同等的性能提升。
- 如果采用 TPU v2 配置时,内存放不下数据,则 TPU v3 可以提供改进的性能并减少中间值的重计算(重实体化)。
- TPU v3 配置可以运行批次大小不适合 TPU v2 配置的新模型。例如,TPU v3 可能允许更深的 ResNet 和使用 RetinaNet 的较大图片。
-
因训练步骤等待输入而在 TPU v2 上几乎成为受限于输入(“馈入”)的模型,在 Cloud TPU v3 中也可能会受限于输入。流水线性能指南可以帮助解决馈入问题。
-
bfloat16 数值格式
- 使用降低精确率的浮点数是一种缩短收敛时间而不会损失准确率的常用方法。TPU 在执行矩阵运算时使用
bfloat16
数字格式。矩阵乘法运算是针对bfloat16
值执行,而累积是针对 IEEEfloat32
值执行。 bfloat16
是用于机器学习的自定义 16 位浮点格式,由一个符号位、八个指数位和七个尾数位组成。下图显示了三种浮点格式的内部:float32
:IEEE 单精度,float16
:IEEE 半精度和bfloat16
。bfloat16
和float32
的动态范围是等效的。但是,bfloat16
会占用一半的内存空间。[1905.12322] BFLOAT16深度学习训练的研究 (arxiv.org)
- Google 硬件团队为 Cloud TPU 选择了
bfloat16
,旨在提高硬件效率,同时保持准确训练深度学习模型的能力,并将float32
的转换费用降至最低。硬件乘法器的物理大小根据尾数宽度的平方进行扩缩。如果尾数位比FP16
少,则bfloat16
乘法器的芯片大小是典型FP16
乘法器的一半,并且比float32
乘法器小 8 倍。 - 神经网络对指数大小的灵敏度要高于尾数。为确保下溢、上溢和 NaN 的行为相同,
bfloat16
的指数大小与float32
相同。bfloat16
处理非正规数的方式与float32
不同,它会将它们刷新为零。与通常需要进行特殊处理(如损失扩缩)的float16
不同,bfloat16
是在训练和运行深度神经网络时可以直接替代float32
。 - 神经网络对指数大小的灵敏度要高于尾数。为确保下溢、上溢和 NaN 的行为相同,
bfloat16
的指数大小与float32
相同。bfloat16
处理非正规数的方式与float32
不同,它会将它们刷新为零。与通常需要进行特殊处理(如损失扩缩)的float16
不同,bfloat16
是在训练和运行深度神经网络时可以直接替代float32
。- 以
bfloat16
格式存储值可节省片上内存,使 Cloud TPU 能够训练更大的模型或使用更大的批量大小。 - 某些操作受内存带宽限制,这意味着从内存加载数据所需的时间会减慢执行计算的总体时间。以
bfloat16
格式存储这些运算的操作数和输出可减少必须传输的数据量,从而提高整体速度。
- 以