在 Cloud TPU 虚拟机上分析模型的性能
借助性能剖析,您可以在 Cloud TPU 上优化模型的训练性能。 您可以使用 TensorBoard 和 Cloud TPU TensorBoard 插件来分析模型。
如需详细了解如何将 TensorBoard 与其中一个支持的框架搭配使用,请参阅以下文档:
对训练脚本进行性能剖析的前提条件
在使用 TPU 性能分析工具之前,您需要:
开始模型训练会话
- 设置 v4-8 TPU 来训练模型。本文档中介绍的性能分析过程使用的是 ResNet 模型,但您也可以使用其他模型,前提是该模型是在 v4 TPU 上训练的。
在 TPU 虚拟机中,将用于启动性能分析器服务器的一行代码添加到训练脚本中。
对于 ResNET 训练,训练脚本位于:
/usr/share/tpu/tensorflow/resnet50_keras/resnet50.py
。将突出显示的行插入 resnet50.py。 在文件顶部,添加以下 import:
import tensorflow.compat.v2 as tf2
在脚本开始训练循环之前,将 突出显示的行:
if name == 'main': tf.logging.set_verbosity(tf.logging.INFO) tf2.profiler.experimental.server.start(6000) app.run(main)
运行脚本后,TensorFlow 性能分析器服务器会在 TPU 虚拟机上启动。
开始模型训练。
运行训练脚本,然后等待系统显示输出指示 模型正在训练。输出取决于您的代码和模型。查找类似
Epoch 1/100
的输出。 或者,您也可以前往 Google Cloud 控制台中的 Cloud TPU 页面,选择您的 TPU,然后查看 CPU 利用率图。虽然 CPU 利用率图表未显示 TPU 利用率,它是一个 这表明 TPU 正在训练模型。
开始分析模型训练
在模型训练时,打开一个单独的终端窗口或 Cloud Shell。 按照以下步骤开始分析模型训练。
在新窗口或 Shell 中,使用端口转发连接到 TPU 虚拟机。
gcloud compute tpus tpu-vm ssh your-vm --zone=us-central2-b --ssh-flag="-4 -L 9001:localhost:9001"
通过端口转发,您的本地浏览器可以与 TPU 虚拟机上运行的 TensorBoard 服务器通信。
安装 TensorFlow 要求。
您的 TPU 虚拟机默认安装了 TensorBoard。您也可以手动安装 TensorFlow。无论采用哪种方式,都可能需要一些额外的依赖项。在 TPU 虚拟机上安装这些依赖项,具体方法是运行以下命令:
pip3 install -r /usr/share/tpu/models/official/requirements.txt
安装 Cloud TPU TensorBoard 插件。
在 TPU 虚拟机中,运行以下命令:
pip3 install --upgrade "cloud-tpu-profiler>=2.3.0" pip3 install tensorflow pip3 install tensorboard_plugin_profile
启动 TensorBoard 服务器
运行 TensorBoard 并创建日志目录 (
logdir
) 在 TPU 虚拟机上,TensorBoard 可以在其中写入分析数据。使用--logdir
标志指定日志目录。例如:mkdir log-directory TPU_LOAD_LIBRARY=0 tensorboard --logdir log-directory --port 9001
TensorBoard 会启动一个网络服务器并显示其网址:
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all TensorBoard 2.3.0 at http://localhost:9001 (Press CTRL+C to quit)
打开网络浏览器并转到 TensorBoard 输出中显示的网址。从 TensorBoard 页面右上角的下拉菜单中选择 Profile。可用性能分析工具的列表显示在左侧边栏的工具下拉菜单中。
捕获 TPU 虚拟机上的性能剖析文件
- 选择捕获性能剖析文件按钮。
- 选择 IP 地址单选按钮。
- 在
Profile Service URL
字段中输入 HOSTNAME:6000。 - 选择拍摄按钮。
使用 TensorBoard 查看性能剖析文件数据
捕获配置文件后,TensorBoard 会显示 overview_page。 左侧窗格中会显示可用的性能分析工具列表。
个人资料
性能剖析 (Profile) 标签页在您捕获某些模型数据后显示。您可能需要点击 TensorBoard 页面上的刷新按钮。数据可用后,点击个人资料标签页 提供了一系列可帮助您进行性能分析的工具。您可以使用以下任一工具对模型进行性能分析。
- 概览页面
- Input Pipeline Analyzer
- XLA Op Profile
- Trace Viewer(仅限 Chrome 浏览器)
- Memory Viewer
性能剖析概览页面
概览页面 (overview_page) 位于配置文件页面,它提供了 显示模型在捕获运行期间性能的顶级视图。页面 会显示所有 TPU 的汇总概览以及 输入流水线分析。有一个用于选择单个 TPU 的选项 (位于主机下拉菜单中)。
该页面在以下面板中显示数据:
性能摘要
- FLOPS 利用率 - TPU 矩阵单元的使用百分比
TPU 上的十大 TensorFlow 操作显示 耗时最多的 TensorFlow 操作:
每行显示操作的自用时间(以所花费时间的百分比表示) 累计时间、类别、名称和 FLOPS 率) 。
运行环境
- 使用的主机数
- 使用的 TPU 类型
- TPU 核心数
Input Pipeline Analyzer
Input Pipeline Analyzer 可提供有关性能结果的数据分析。 该工具会立即告诉您程序是否受限于输入, 进行设备端分析和主机端分析,以调试 流水线正在形成瓶颈。
如需深入了解如何优化流水线性能,请参阅有关输入流水线性能的指南。
输入流水线
当 TensorFlow 程序从文件中读取数据时,读取过程会分为多个串联连接的数据处理阶段。一个输出结果 是下一个阶段的输入。这个读取系统称为输入流水线。
从文件中读取记录的典型流水线具有以下阶段:
- 文件读取
- 文件预处理(可选)
- 将文件从主机传输到设备
效率低下的输入流水线可能会严重降低应用的速度。当应用在其输入流水线上花费大量时间时,我们将其称为输入受限。使用 Input Pipeline Analyzer 可以确定输入流水线的低效位置。
输入流水线信息中心
如需打开 Input Pipeline Analyzer,请选择性能剖析 (Profile),然后从工具下拉列表中选择 input_pipeline_analyzer。
此信息中心会显示设备端和主机端分析详细信息。
设备端分析 - 显示设备单步用时的详细信息。
- 设备单步用时统计信息
- 等待输入数据的设备单步用时百分比
主机端分析
本部分显示主机端分析的详细信息,将主机端分析细分为几类:
- 将要传输到设备的数据加入队列。向设备传输数据之前将数据加入馈入队列所花费的时间。
- 数据预处理:用于预处理操作(例如图片解压缩)的时间。
- 预先从文件中读取数据:读取文件所花费的时间,包括缓存、预取和交错。
- 按需从文件中读取数据:在没有缓存、预取和交错的情况下从文件读取数据所用的时间。
- 其他数据读取或处理:其他与输入相关的操作所花费的时间
未使用
tf.data
。
如需查看按执行时间细分的各个输入操作及其类别的统计信息,请展开 Show Input Op statistics
部分。
系统将显示如下所示的源数据表:
每个表条目包含以下信息:
- 输入操作:显示输入操作的 TensorFlow 操作名称。
- 计数:显示执行操作的实例总数 性能分析期间的数据
- 总时间(以毫秒为单位):显示每个操作实例所用时间的累计总和。
- 总时间百分比表示操作上花费的总时间占总时间的比例 输入处理所用的总时间。
- 总自用时间(以毫秒为单位):显示函数的所有实例的累计时间。自测时间用于测量所花费的时间
(不包括它调用的任何函数所花的时间)。
例如,
Iterator::PaddedBatch::Filter::ForeverRepeat::Map
为 由Iterator::PaddedBatch::Filter
调用,因此其总调用次数 后者的总自用时间不包括自身。 - 总自用时间百分比。显示总自用时间占输入处理总时间的比例。
- 类别:显示输入操作的处理类别。
Op Profile
Op Profile () 是一款 Cloud TPU 工具,它可展示在性能剖析期间执行的 XLA 操作的性能统计信息。操作配置文件会显示以下内容:
- 您的应用使用 Cloud TPU 的程度,按类别和 TPU FLOPS 利用率显示各操作所用时间的百分比。
- 最耗时的操作。这些操作可能有待优化。
- 各个操作的详细信息,包括形状、填充和使用该操作的表达式。
您可以使用 Op Profile 查找要优化的目标。例如,您可以 使用操作配置文件确定哪些 XLA 操作执行时间最长 以及它们消耗了多少 TPU FLOPS。
使用 Op Profile
Op Profile 工具包含 XLA 操作的性能统计信息。您可以 在 TensorBoard 中查看操作配置文件数据,请点击 从屏幕顶部的 Tools 中选择 op_profile 下拉菜单中。您将看到如下所示的界面:
- “概览”部分显示 Cloud TPU 利用率并提供 优化建议。
- 控制台 通过包含的控件,您可设置表格中显示的操作数量、显示哪些操作,以及这些操作的排序方式。
- 操作表:列出最高的 TensorFlow 操作 与 XLA 操作相关联的类别。这些操作按 Cloud TPU 使用率百分比排序。
- 操作详细信息卡片:显示有关操作的详细信息 。这些详细信息包括 FLOPS 利用率、使用该操作的表达式以及操作布局(拟合)。
XLA 操作表
操作表按照 Cloud TPU 使用率百分比从高到低的顺序列出 XLA 操作类别。下表显示了 所花费的时间百分比、操作类别名称、 关联的 TensorFlow 操作 以及类别的 FLOPS 利用率百分比。显示位置 (或隐藏)某个类别中 10 个最耗时的 XLA 操作,请点击 三角形。
- 时间:显示该类别中所有操作所用时间的总百分比。您可以点击以展开条目,查看每个操作所用时间的明细。
- 十大操作:用于显示或隐藏类别名称旁边的切换开关 顶部 类别中十个耗时的操作。如果操作列表中显示了融合操作条目,您可以将其展开以查看其包含的非融合元素级操作。
- TensorFlow 操作 - 显示 TensorFlow 操作的名称 与 XLA 操作相关联。
- FLOPS 显示 FLOPS 利用率,即已测量的 FLOPS 表示为 Cloud TPU 峰值 FLOPS 的百分比。 FLOPS 利用率百分比越高,操作运行速度越快。表单元格采用颜色编码:绿色表示 FLOPS 利用率高(好),红色表示 FLOPS 利用率低(差)。
操作详细信息卡片
选择表格条目后,系统会显示一张卡片,其中显示了 有关 XLA 操作或操作类别的详细信息。典型的卡片如下所示:
- 名称和类别:显示突出显示的 XLA 操作名称和类别。
- FLOPS 利用率:以占总数的百分比显示 FLOPS 利用率 可能为 FLOPS。
- 表达式:显示包含该操作的 XLA 表达式。
- 内存利用率:显示 计划。
- 布局(仅限卷积运算)显示张量的形状和布局,包括 对 XLA 编译器执行的任何填充的说明。
解读结果
对于卷积运算,TPU FLOPS 利用率低可能是由以下原因之一或全部造成的:
- 填充(矩阵单元仅被部分使用)
- 卷积运算受限于内存
本部分解释了模型的一些性能指标 并且 FLOP 利用率低。在这个例子中,output fusion(输出融合)和 convolution(卷积) 会占用执行时间许多矢量或标量运算的 FLOPS 利用率较低。
此类性能剖析文件的一种优化策略是将矢量或标量操作转换为卷积运算。
在以下示例中,%convolution.399 显示的 FLOPS 利用率和内存利用率低于上例中的 %convolution.340。
在此示例中,批量大小被填充至 128,特征大小被填充至 8。在本示例中,只有 5% 的矩阵 单位得到有效利用。利用率的计算方法为:(((batch_time * num_of_features) / padding_size ) / num_of_cores)。将此示例中的 FLOPS 与上一个示例中的 %convolution.340 进行比较 没有内边距的示例。
Trace Viewer
Trace Viewer 是一款 Cloud TPU 性能分析工具, (在个人资料页面上)。此工具使用 Chrome 跟踪记录事件分析查看器,因此仅适用于 Chrome 浏览器。
Trace Viewer 包含一个时间轴,其中显示了以下内容:
- TensorFlow 所执行操作的时长 模型。
- 系统的哪个部分(TPU 还是主机)执行了操作。通常,主机执行馈入操作,它会预处理训练数据并将其传输到 TPU,而 TPU 执行实际的模型训练。
您可以通过 Trace Viewer 找出模型中的性能问题,然后采取措施来加以解决。例如,您可以大致了解 馈入还是模型训练占用了大部分时间。展开细目后,您可以确定哪些 TensorFlow 操作执行时间最长。
Trace Viewer 针对每个 Cloud TPU 仅限访问 100 万个事件。如果您需要访问更多事件,请改用Streaming Trace Viewer。
Trace Viewer 界面
如需打开 Trace Viewer,请转到 TensorBoard,然后点击位于顶端的 Profile 标签页 从屏幕顶部的工具下拉列表中选择 trace_viewer。Trace Viewer 会显示最近的运行:
此屏幕包含以下主要元素(在前面的屏幕截图中标有数字):
- “运行”下拉菜单 - 包含已捕获其跟踪记录信息的所有运行。默认视图为最近的运行,您也可以打开下拉列表选择其他运行。
- Tools 下拉菜单 选择不同的性能分析工具。
- “主机”下拉菜单 选择包含 Cloud TPU 集的主机。
- 时间轴窗格显示 Cloud TPU 和 随时间推移不断执行的
- “详细信息”窗格,显示与操作相关的其他信息 选择“时间轴”
以下是时间轴窗格的详细信息:
时间轴窗格包含以下元素:
- 顶栏:包含各种辅助控件。
- 时间轴:显示相对于跟踪记录开始时的时间。
- 版块和轨道标签:每个版块包含多个轨道,并且 一个三角形,点击该三角形便可展开和收起 部分。系统中的每个处理元素都有一个版块。
- 工具选择器:包含与 Trace Viewer 交互的各种工具。
- 事件 - 显示执行操作的时间,或 元事件的时长,例如训练步数。
- 垂直标签页栏:此栏对 Cloud TPU 没有用处。 此栏是 Chrome 提供的通用跟踪记录查看器工具的一部分 用于各种性能分析任务中。
版块和跟踪记录
Trace Viewer 包含以下版块:
- 每个 TPU 节点有一个版块,上面标有 TPU 芯片的编号及芯片内 TPU 核心的编号(例如“芯片 2: TPU 核心 1”)。每个 TPU 节点版块包含以下跟踪记录:
- 步骤:显示 TPU 上运行的训练步的时长。
- TensorFlow 操作 - 显示在 TPU 上执行的 TensorFlow 操作。
- XLA 操作:显示在 TPU 上运行的 XLA 操作。(每个操作都会转换为一个或多个 XLA 操作。XLA 编译器会将这些 XLA 操作转换为在 TPU 上运行的代码。)
- 有一个部分针对在主机 CPU 上运行的线程 标记为“Host Threads”。对于每个 CPU 线程,此版块都包含一个跟踪记录。注意:您可以忽略版块标签旁边显示的信息。
时间轴工具选择器
您可以使用 TensorBoard 中的时间轴工具选择器与时间轴视图进行交互。点击时间轴工具以激活并突出显示该工具。 如需移动时间轴工具选择器,请点击顶部的虚线区域,然后将选择器拖动到所需位置。
以下是各个时间轴工具的使用方法:
选择工具 点击事件可将其选中,拖动可选择多个事件。有关所选事件(名称、开始时间和时长)的更多信息将显示在“详细信息”窗格中。 |
|
平移工具 拖动可在水平和垂直方向平移时间轴视图。 |
|
缩放工具 沿水平(时间)轴方向,向上拖动可放大视图,向下拖动可缩小视图。鼠标光标的水平位置决定缩放操作的中心。 注意:如果您松开鼠标按钮后缩放工具仍处于活动状态,请点击时间轴视图以停用缩放工具。 |
|
计时工具 水平拖动可以标记时间间隔。间隔的时长会显示在时间轴上。如需调整间隔,请拖动其末端。如需清除间隔,可点击时间轴视图内的任意位置。 如果您选择其他工具,间隔标记仍会保留。 |
Memory Viewer
借助 Memory Viewer,您可以直观地了解程序的峰值内存使用量和内存使用趋势。
Memory Viewer 界面如下所示:
- 主机 下拉列表选择 TPU 主机和 XLA 高级优化器 (HLO) 模块进行直观呈现。
- 内存概览显示峰值内存分配和无填充的大小。
- 工作空间图表:显示峰值内存用量和内存用量图 趋势。将光标指向其中一个缓冲区中的缓冲区 图表,以便在缓冲区分配卡中显示其他信息。
- 缓冲区图表:这两个图表显示峰值内存用量时的缓冲区分配。将光标指向缓冲区图表中的某个缓冲区,即可在缓冲区详细信息卡片中显示更多信息。
- 缓冲区分配详细信息卡片:显示有关缓冲区分配的详细信息。
内存概览面板
内存概览(顶部)面板显示模块名称,以及总缓冲区分配大小达到最大值时的峰值内存分配设置。此面板还显示未填充的峰值分配大小以供比较。
工作空间图表
此图表显示峰值内存使用量,以及您的 计划。竖线表示程序的峰值内存利用率。这个 图表会显示您的程序能否放进可用的全局内存空间。
图中的每个点都代表 XLA HLO 程序中的“程序点”。通过 行显示了程序的内存用量随时间变化的情况。
与缓冲区图表元素的交互
在缓冲区图表中指向缓冲区时,水平方向将 显示缓冲区生命周期的线条显示在工作空间图表中。
水平线的粗细表示缓冲器的相对大小 相对于峰值内存分配的大小。线的长度表示 缓冲区的生命周期。
缓冲区图表
两个图表显示了峰值内存用量的细分情况。
按程序顺序:按程序执行期间缓冲区的活动顺序从左到右显示缓冲区。
按大小显示程序执行期间处于活动状态的缓冲区 按大小从小到大的顺序排列。
缓冲区分配详细信息卡片
当您将光标指向其中一个缓冲区图表中显示的缓冲区时,缓冲区就会被 分配详细信息卡片。典型的详细信息卡片如下所示:
- 名称 - XLA 操作的名称。
- 类别 - 操作类别。
- 大小 - 缓冲区分配的大小(包括填充)。
- 未填充大小 - 未填充的缓冲区分配的大小。
- 扩展 - 含填充的缓冲区空间与未填充的缓冲区空间的相对大小 。
- 额外内存 - 指示填充额外使用了多少内存量。
- Shape(形状)- 描述 N 维数组的阶、大小和数据类型。
- TensorFlow 操作名称 - 显示 TensorFlow 的名称 关联的操作 缓冲区分配。
- 分配类型 - 表示缓冲区分配类别: 参数、输出、线程局部和临时(例如缓冲区) 一次融合中的分配)。
内存不足错误
如果运行模型时出现“内存不足”错误,请按照本文档中的准则捕获配置文件。等到脚本开始训练模型 然后再启动 Profiler性能分析输出可以帮助您了解导致错误的原因。