NVIDIA A100 GPU - 推理基准测试分析

运行最先进的文本到图像模型需要什么?游戏卡可以完成这项工作,还是选择A100?如果只有一个 CPU 怎么办?

为了阐明这些问题,我们提出了在不同 GPU 和 CPU 上稳定扩散的推理基准。这些是我们的发现:

  • 许多消费级 GPU 可以做得很好,因为稳定的扩散只需要大约 5 秒和 5 GB 的 VRAM 即可运行。
  • 在输出单张图像的速度方面,最强大的 Ampere GPU (A100) 仅比 3080 快 33%(或 1.85 秒)。
  • 通过将批量大小推到最大,与 3080 相比,A100 可以提供 2.5 倍的推理吞吐量。

我们的基准测试使用文本提示作为输入并输出分辨率图像512x512。我们使用Huggingface 的扩散器库中的模型实现,并从速度、内存消耗、吞吐量和输出图像的质量方面分析推理性能。我们研究了硬件(GPU 模型、GPU 与 CPU)和软件(单精度与半精度、pytorch 与 onnxruntime)的不同选择如何影响推理性能。

作为参考,我们将为以下 GPU 设备提供基准测试结果:A100 80GB PCIe、RTX3090、RTXA5500、RTXA6000、RTX3080、RTX8000。

速度

下图展示了使用(任意)文字提示,使用不同硬件和精度生成单张图片时的推理速度:“a photo of an astronaut interviewing a horse on mars”。
稳定的扩散 Text2Image 速度(以秒为单位)
我们发现:

  • 在我们测试的 Ampere GPU(包括消费级 3080 卡到旗舰 A100 80GB 卡)中,生成单个输出图像的时间范围从几秒3.74到几秒。5.59
  • 半精度将40%Ampere GPU 的时间缩短了大约,而52%上一代RTX8000GPU 的时间缩短了。

我们认为 Ampere GPU 由于使用TF32. 对于不熟悉的读者来说TF32,它是一种19-bit格式,已被用作 PyTorch 和 TensorFlow 等主要深度学习框架的 Ampere GPU 上的默认单精度数据类型。由于它是一种真正的格式,因此可以预期半精度的加速FP32会更大。32-bit

我们在 CPU 设备上运行这些相同的推理作业,以便了解在 GPU 设备上观察到的性能。
稳定的扩散 Text2Image GPU 与 CPU
我们注意到:

  • GPU 的速度明显更快——根据精度提高一到两个数量级。
  • onnxruntime根据 CPU 的类型,可以将 CPU 推理时间减少约40%至50%。

附带说明一下,ONNX 运行时目前没有对 Huggingface 扩散器的稳定CUDA 后端支持CUDAExecutionProvider,我们在初步测试中也没有观察到有意义的加速。我们期待在 ONNX 运行时针对稳定扩散进行更优化后进行更彻底的基准测试。

记忆

我们还测量了运行稳定扩散推理的内存消耗。
稳定扩散 Text2Image Memory (GB)
观察到所有测试 GPU 的内存使用情况是一致的:

  • 7.7 GB运行批量大小为 1 的单精度推理需要大约GPU 内存。
  • 4.5 GB使用批量大小为 1 运行半精度推理需要大约GPU 内存。

吞吐量

到目前为止,我们已经测量了单个输入的处理速度,这对于不能容忍哪怕是最轻微的延迟的在线应用程序来说是至关重要的。但是,一些(离线)应用程序可能会关注“吞吐量”,它衡量在固定时间内处理的数据总量。

我们的吞吐量基准将每个 GPU 的批量大小推到最大,并测量它们每分钟可以处理的图像数量。最大化批量大小的原因是保持张量核心繁忙,以便计算可以主导工作负载,避免任何非计算瓶颈并最大化吞吐量。

我们在 pytorch 中以半精度运行一系列吞吐量实验,并使用可用于每个 GPU 的最大批量大小:
稳定的扩散 Text2Image 吞吐量(图像/分钟)
我们注意到:

  • 再一次,A100 80GB 是表现最好的并且具有最高的吞吐量。
  • A100 80GB 与其他卡在吞吐量方面的差距可以用这张卡上可以使用的更大的最大批量大小来解释。

作为一个具体的例子,下图显示了64%当我们将批量大小从 1 更改为 28(最大但不会导致内存不足错误)时,A100 80GB 的吞吐量如何增加。有趣的是,当batch size达到一定值时,增加不是线性的并且变平,此时GPU上的张量核心已经饱和,GPU内存中的任何新数据都必须排队才能获得他们自己的计算资源。
稳定的扩散 Text2Image 批量大小与吞吐量(图像/分钟

Autocast

Hugging Face 团队对其扩散器代码进行的更新声称,删除自动投射可将 pytorch 的半精度推理速度提高约 25%。

使用自动广播:
with autocast(“cuda”): image = pipe(prompt).images[0]
没有自动投射:
image = pipe(prompt).images[0]

我们在 NVIDIA RTX A6000 上重现了该实验,并且能够验证速度和内存使用方面的性能提升。我们预计其他支持半精度的设备也会有类似的改进。
在这里插入图片描述
在这里插入图片描述
总之:不要将 autocast 与 FP16 结合使用

精确

我们很好奇半精度是否会降低输出图像的质量。为了测试这一点,我们修复了文本提示以及“潜在”输入,并将它们提供给单精度模型和半精度模型。随着步数的增加,我们运行了 100 次推理。每次运行都会保存两个模型的输出以及它们的差异图。
在这里插入图片描述
我们的观察是,单精度输出和半精度输出之间确实存在明显的差异,尤其是在早期步骤中。差异通常会随着步数的增加而减少,但可能不会消失。

有趣的是,这种差异可能并不意味着半精度输出中的伪影。例如,在步骤 70 中,下图显示了半精度在单精度输出中没有产生伪影(额外的前腿):
单精度 v 步 70 的半精度

A100 GPU服务器

NVIDIA A100 Tensor Core GPU能够加速所有AI应用和超过2700种HPC应用,超微GPU服务器平台集成了NVIDIA A100,为企业提供了一个强大的系统,可以为包括HPC、AI推理、培训和机器学习在内的各种工作负载提供卓越的性能和生产力。
在这里插入图片描述
更多A100 GPU服务器产品信息可查看【昊源诺信】

猜你喜欢

转载自blog.csdn.net/weixin_50197960/article/details/127316131