趋近智
tf.distribute.Strategy 概述通过性能分析工具识别潜在性能问题时,图形处理器 (GPU) 的使用情况常常是一个需要关注的常见方面。GPU 擅长同时执行大量并行计算,这使得它们非常适合深度学习中的矩阵乘法和卷积运算。然而,仅仅拥有一个强大的 GPU 并不能保证最佳性能。如果 GPU 闲置等待数据或指令,潜在的加速效果就会丢失。为了最大化其计算吞吐量,将着重介绍一些策略来确保您的 GPU 持续繁忙。
GPU 通过大规模并行来达到高性能。它们包含数千个核心,旨在同时在不同数据点上执行相同的操作(内核)。这与 CPU 形成对比,CPU 通常具有数量较少但更强大的核心,这些核心经过优化以处理顺序任务和复杂的控制流。
为了有效使用 GPU,您需要向其提供大量可并行处理的工作块。GPU 利用率低下的常见原因有:
持续监控对于诊断利用率问题非常重要。
如前所述,TensorBoard 分析器提供了模型执行期间 GPU 活动的详细信息。请密切关注:
tf.data 管道中可能出现的停滞相关联(稍后将详细介绍)。对于实时监控,NVIDIA 系统管理界面 (nvidia-smi) 命令行工具非常有帮助。在观察模式下运行它可以提供持续更新:
watch -n 1 nvidia-smi
需要观察的重要指标包括:
低 GPU-Util 通常表明存在 CPU 瓶颈、数据加载效率低下或模型/操作结构不佳等问题。
根据监控结果,有几种技术可以帮助提高 GPU 利用率:
这通常是影响最大的调整。更大的批次可以为每次迭代提供更多并行工作,从而降低内核启动开销的相对影响,并可能提高利用率。
nvidia-smi 监控内存使用情况,并使用 TensorBoard 监控训练速度和 GPU 利用率。增加批次大小通常会提高 GPU 利用率,但会受到硬件容量和内存的限制。
tf.data)慢速的输入管道是导致 GPU 闲置的常见原因。请确保您的 tf.data 管道经过优化:
dataset.prefetch(tf.data.AUTOTUNE) 用作管道的最后一步。这使得 CPU 可以在 GPU 处理当前批次时准备下一个批次,从而实现数据准备和计算的重叠。dataset.map() 操作中,对于图像增强或数据解析等转换,使用 num_parallel_calls=tf.data.AUTOTUNE。这会使用多个 CPU 核心进行数据预处理。dataset.cache() 在初始 epoch 后存储结果。这些 tf.data 优化在“tf.data 管道的性能考虑”部分中会更详细地介绍。
主机 (CPU) 和设备 (GPU) 之间的数据传输是瓶颈。
tf.device: 虽然您可以使用 tf.device('/GPU:0') 明确指定操作的设备,但 TensorFlow 通常能很好地处理设备放置。主要在需要覆盖默认行为或明确管理多个 GPU 时使用它。tf.function: 正如第 1 章中所讨论的,使用 tf.function 会将 Python 代码编译成 TensorFlow 图。这种图执行通常快得多,Python 开销更少,并允许框架级别的优化,例如更好地调度 GPU 操作。请了解 TensorFlow 的执行引擎会尝试异步运行操作。当您在 Python 中调用 GPU 操作时,控制权通常会立即返回,而操作在 GPU 上在后台执行。有效使用 tf.data.prefetch 可以补充这一点,它确保在 GPU 需要时数据已准备就绪,从而促进 CPU 预处理和 GPU 计算之间的重叠。
优化 GPU 利用率是一个迭代过程,包括监控、找出瓶颈和应用有针对性的解决方案。通过仔细管理批次大小、确保 tf.data 数据管道高效、最小化数据传输以及运用 tf.function 等 TensorFlow 特性,您可以大幅提升训练和推理任务的吞吐量。关于混合精度训练和 XLA 编译的后续章节将介绍更多有力的技术,以从您的硬件加速器中获得最大性能。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造