在 Cloud TPU 虚拟机上分析模型

借助性能剖析,您可以在 Cloud TPU 上优化模型的训练性能。 您可以使用 TensorBoardCloud TPU TensorBoard 插件:用于分析模型。

如需详细了解如何将 TensorBoard 与其中一个支持的框架搭配使用,请参阅以下文档:

对训练脚本进行性能剖析的前提条件

在使用 TPU 性能剖析工具之前,您需要:

  1. 开始模型训练会话

    1. 设置 v4-8 TPU 来训练模型。本文档中介绍的分析过程 使用 ResNet 模型,但您也可以使用另一个模型, 虚拟私有云 (v4 TPU)。
    2. 在 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 Profiler 服务器将在您的 TPU 虚拟机上启动: 运行该脚本

    3. 开始模型训练。

      运行训练脚本,然后等待系统显示输出指示 模型正在训练。输出取决于 您的代码和模型。查找类似 Epoch 1/100 的输出。 或者,您也可以前往 Cloud TPU 页面 在 Google Cloud 控制台中,选择您的 TPU 并查看 CPU 利用率图表。虽然 CPU 利用率图表未显示 TPU 利用率,它是一个 这表明 TPU 正在训练模型。

开始分析模型训练

在模型训练时,打开一个单独的终端窗口或 Cloud Shell。 按照以下步骤开始分析模型训练。

  1. 在新窗口或 shell 中,通过端口转发连接到您的 TPU 虚拟机。

    gcloud compute tpus tpu-vm ssh your-vm --zone=us-central2-b --ssh-flag="-4 -L 9001:localhost:9001"
    

    端口转发允许本地浏览器与 TensorBoard 通信 您的 TPU 虚拟机上运行的服务器。

  2. 安装 TensorFlow 要求 {: id="install-tensorboard"}。

    您的 TPU 虚拟机默认安装了 TensorBoard。您 您也可以手动安装 TensorFlow。 无论采用哪种方式,都可能需要一些额外的依赖项。安装这些 您的 TPU 虚拟机上的依赖项:

    pip3 install -r /usr/share/tpu/models/official/requirements.txt
    
  3. 安装 Cloud TPU TensorBoard 插件 {: id="install-plugin"}。

    从 TPU 虚拟机运行以下命令:

     pip3 install --upgrade "cloud-tpu-profiler>=2.3.0"
     pip3 install tensorflow
     pip3 install tensorboard_plugin_profile
    
  4. 启动 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 输出中显示的网址。选择 分析 (Profile)。 工具下拉菜单中会显示可用的性能分析工具列表 。

图片

捕获 TPU 虚拟机上的性能剖析文件

  1. 选择捕获配置文件按钮。
  2. 选择 IP 地址单选按钮。
  3. Profile Service URL 字段中输入 HOSTNAME:6000
  4. 选择拍摄按钮。

图片

使用 TensorBoard 查看性能剖析文件数据

捕获配置文件后,TensorBoard 会显示 overview_page。 左侧窗格中会显示您可以使用的分析工具列表。

图片

个人资料

捕获一些模型数据后,系统会显示分析标签页。您 您可能需要点击 TensorBoard 页面。数据可用后,点击个人资料标签页 提供了一系列可帮助您进行性能分析的工具。您可以 使用以下任一工具来分析您的模型。

性能剖析概览页面

概览页面 (overview_page) 位于配置文件页面,它提供了 显示模型在捕获运行期间性能的顶级视图。页面 显示了所有 TPU 的汇总概览以及 输入流水线分析。有一个用于选择单个 TPU 的选项 (位于主机下拉菜单中)。

该页面在以下面板中显示数据:

图片

  • 性能摘要

    • FLOPS 利用率 - TPU 矩阵单元的使用百分比
  • TPU 上的十大 TensorFlow 操作显示 耗时最多的 TensorFlow 操作:

    每行显示操作的自用时间(以所花费时间的百分比表示) 累计时间、类别、名称和 FLOPS 率) 。

  • 运行环境

    • 使用的主机数量
    • 使用的 TPU 类型
    • TPU 核心数

Input Pipeline Analyzer

Input Pipeline Analyzer 可提供有关性能结果的数据分析。 该工具会立即告诉您程序是否受输入限制, 进行设备端分析和主机端分析,以调试 流水线正在形成瓶颈。

如需深入了解如何优化流水线性能,请参阅有关输入流水线性能的指南。

输入流水线

当 TensorFlow 程序从文件中读取数据时,读取过程 可分为 串联连接的多个数据处理阶段。一个输出结果 是下一个阶段的输入。这个读取系统称为输入流水线

从文件中读取记录的典型流水线具有以下阶段:

  1. 文件读取
  2. 文件预处理(可选)
  3. 将文件从主机传输到设备

效率低下的输入流水线可能会严重降低应用的速度。当应用在其输入流水线上花费大量时间时,我们将其称为输入受限。使用 Input Pipeline Analyzer 了解 输入流水线效率低下的情况。

输入流水线信息中心

如需打开 Input Pipeline Analyzer,请选择分析,然后选择 Tools 下拉菜单中的 input_pipeline_analyzer

此信息中心会显示设备端和主机端分析详细信息。

设备端分析 - 显示设备单步用时的详细信息。

  • 设备单步用时统计信息
  • 等待输入数据的设备单步用时百分比

主机端分析

本部分显示了主机端分析的详细信息,分为以下几个类别:

  • 将要传输到设备的数据加入队列。向设备传输数据之前将数据加入馈入队列所花费的时间。
  • 数据预处理:预处理操作(例如图片)所用的时间 解压缩。
  • 预先从文件中读取数据 读取文件所用的时间,包括 缓存、预提取和交错
  • 按需从文件中读取数据 读取所用的时间 无需缓存、预取和交错即可从文件读取数据。
  • 其他数据读取或处理:其他与输入相关的操作所花费的时间 未使用 tf.data

图片

查看各个输入操作及其类别的统计信息 请展开 Show Input Op statistics 部分。

系统将显示如下所示的源数据表:

图片

每个表条目包含以下信息:

  1. 输入操作:显示输入操作的 TensorFlow 操作名称。
  2. 计数:显示执行操作的实例总数 性能分析期间的数据
  3. 总时间(以毫秒为单位):显示每个查询上花费的时间的累计总和 操作实例。
  4. 总时间百分比表示操作上花费的总时间占总时间的比例 输入处理所用的总时间。
  5. 总自用时间(以毫秒为单位):显示累计时间 该函数的所有实例。自测时间用于测量所花费的时间 (不包括它调用的任何函数所花的时间)。 例如,Iterator::PaddedBatch::Filter::ForeverRepeat::Map 为 由 Iterator::PaddedBatch::Filter 调用,因此其总调用次数 后者的总自用时间不包括自身。
  6. 总自用时间百分比 显示总自用时间占总时间的比例 输入处理所花费的时间。
  7. 类别:显示输入操作的处理类别。

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 下拉菜单中。您将看到如下所示的界面:

图片

  1. “概览”部分显示 Cloud TPU 利用率并提供 优化建议。
  2. 控制面板:包含用于设置 表格中显示的操作、显示哪些操作以及如何 对它们进行排序。
  3. 操作表:列出最高的 TensorFlow 操作 与 XLA 操作相关联的类别。这些操作按 Cloud TPU 使用率百分比排序。
  4. 操作详细信息卡片:显示有关操作的详细信息 。这些详细信息包括 FLOPS 利用率、使用该操作的表达式以及操作布局(拟合)。

XLA 操作表

操作表按从高到低的顺序列出了 XLA 操作类别 Cloud TPU 用量的百分比。下表显示了 所花费的时间百分比、操作类别名称、 关联的 TensorFlow 操作 以及类别的 FLOPS 利用率百分比。显示位置 (或隐藏)某个类别中 10 个最耗时的 XLA 操作,请点击 三角形。

图片

  1. 时间 显示所有用户花费时间的总百分比, 操作。您可以点击以展开条目,查看每个操作所用时间的明细。
  2. 十大操作:用于显示或隐藏类别名称旁边的切换开关 顶部 类别中十个耗时的操作。如果一个融合操作 条目会显示在操作列表中,您可以展开它来查看 非融合元素级操作。
  3. TensorFlow 操作 - 显示 TensorFlow 操作的名称 与 XLA 操作相关联。
  4. FLOPS 显示 FLOPS 利用率,即已测量的 FLOPS 表示为 Cloud TPU 峰值 FLOPS 的百分比。 FLOPS 利用率百分比越高,操作运行速度越快。表单元格采用颜色编码:绿色表示 FLOPS 利用率高(好),红色表示 FLOPS 利用率低(差)。

操作详细信息卡片

当您选择表格条目后,系统会显示一张卡片,其中显示了 有关 XLA 操作或操作类别的详细信息。典型的卡片如下所示:

图片

  • 名称类别:显示突出显示的 XLA 操作名称和类别。
  • FLOPS 利用率:以占总数的百分比显示 FLOPS 利用率 可能为 FLOPS。
  • 表达式显示 XLA 表达式 包含相应操作。
  • 内存利用率:显示 计划。
  • 布局(仅限卷积运算)显示张量的形状和布局,包括 对 XLA 编译器执行的任何填充的说明。

解读结果

对于卷积运算,TPU FLOPS 利用率低的原因可能是 以下两个原因:

  • 填充(矩阵单元仅被部分使用)
  • 卷积运算受内存限制

本部分解释了模型的一些性能指标 并且 FLOP 利用率低。在这个例子中,output fusion(输出融合)和 convolution(卷积) 会占用执行时间有许多向量或标量操作 FLOP 利用率较低。

此类性能剖析文件的一种优化策略是将矢量或标量操作转换为卷积运算。

在以下示例中,%convolution.399 显示的 FLOPS 利用率和内存利用率低于上例中的 %convolution.340

图片

在此示例中,将批次大小填充为 128, 将特征大小填充为 8。在本示例中,只有 5% 的矩阵 单位得到有效利用。利用率计算方法:((batch_time * num_of_features) / padding_size) / 核心数。 将此示例中的 FLOPS 与上一个示例中的 %convolution.340 进行比较 没有内边距的示例。

Trace Viewer

Trace Viewer 是一款 Cloud TPU 性能分析工具, (在个人资料页面上)。此工具使用 Chrome 跟踪记录事件分析查看器,因此仅适用于 Chrome 浏览器。

Trace Viewer 包含一个时间轴,其中显示了以下内容:

  • TensorFlow 所执行操作的时长 model.
  • 系统的哪个部分(TPU 还是主机)执行了操作。通常,宿主机执行馈入操作, 训练数据并将其传输到 TPU,而 TPU 负责执行 实际模型训练。

借助 Trace Viewer,您可以识别模型中的性能问题,然后 采取措施来解决这些问题。例如,您可以大致了解 馈入还是模型训练占用了大部分时间。钻探 您可以确定哪些 TensorFlow 操作 最长执行时间。

对于每个 Cloud TPU,Trace Viewer 仅限访问 100 万个事件。如果 如果您需要评估更多事件,请使用 Streaming Trace Viewer

Trace Viewer 界面

如需打开 Trace Viewer,请转到 TensorBoard,然后点击位于顶端的 Profile 标签页 从屏幕顶部的工具下拉列表中选择 trace_viewer。Trace Viewer 会显示最近的运行:

图片

此屏幕包含以下主要元素( 前一个屏幕截图):

  1. “Runs”(运行情况)下拉菜单包含您已执行的所有运行作业 捕获的跟踪记录信息。默认视图是您最近查看的内容 但您可以打开下拉菜单选择其他运行作业。
  2. Tools 下拉菜单:选择不同的分析工具。
  3. 主机下拉菜单:选择包含 Cloud TPU 的主机 。
  4. 时间轴窗格显示 Cloud TPU 和 随时间推移不断执行的
  5. “详细信息”窗格显示与操作相关的其他信息 选择“时间轴”

以下是时间轴窗格的详细信息:

图片

时间轴窗格包含以下元素:

  1. 顶栏包含各种辅助控件。
  2. 时间轴:显示相对于跟踪记录开始时的时间。
  3. 版块和轨道标签:每个版块包含多个轨道,并且 一个三角形,点击该三角形便可展开和收起 部分。系统中的每个处理元素都有一个版块。
  4. 工具选择器:包含各种用于 Trace Viewer。
  5. 事件 - 显示执行操作的时间,或 元事件的时长,例如训练步数。
  6. 垂直标签页栏:此栏对 Cloud TPU 没有用处。 此栏是 Chrome 提供的通用跟踪记录查看器工具的一部分 用于各种性能分析任务中。

版块和跟踪记录

Trace Viewer 包含以下版块:

  • 每个 TPU 节点有一个版块,版块标有 TPU 芯片的编号 和芯片内的 TPU 核心(例如“Chip 2: TPU Core 1”)。每个 TPU 节点版块包含以下跟踪记录:
    • :显示之前选择的训练步的时长 在 TPU 上运行。
    • TensorFlow 操作 - 显示在 TPU 上执行的 TensorFlow 操作。
    • XLA 操作显示 XLA 在 TPU 上运行的多个操作的数量。(每个操作都会转换为一个或多个 XLA 操作。XLA 编译器会将这些 XLA 操作转换为在 TPU 上运行的代码。)
  • 有一个部分针对在主机 CPU 上运行的线程 标记为“Host Threads”。对于每个 CPU 线程,此版块都包含一个跟踪记录。注意:您可以忽略版块标签旁边显示的信息。

时间轴工具选择器

您可以使用 TensorBoard 中的时间轴工具选择器与时间轴视图进行交互。点击时间轴工具以激活并突出显示该工具。 如需移动时间轴工具选择器,请点击顶部的虚线区域,然后将选择器拖动到所需位置。

以下是各个时间轴工具的使用方法:

选择工具
点击事件可将其选中,拖动可选择多个事件。 有关所选事件(名称、开始时间和时长)的更多信息将显示在“详细信息”窗格中。

平移工具
拖动可在水平和垂直方向平移时间轴视图。

缩放工具
沿水平(时间)轴方向,向上拖动可放大视图,向下拖动可缩小视图。鼠标光标的水平位置决定缩放操作的中心。

注意:如果在您放开缩放工具后,缩放工具仍处于启用状态, 鼠标按钮,点击时间轴视图可停用缩放工具。

计时工具
水平拖动可以标记时间间隔。间隔的时长会显示在时间轴上。如需调整间隔,请拖动其末端。如需清除间隔,可点击时间轴视图内的任意位置。

如果您选择其他工具,间隔标记仍会保留。

Memory Viewer

借助 Memory Viewer,您可以直观地查看峰值内存用量和内存用量趋势 。

Memory Viewer 界面如下所示:

图片

  1. 主机 下拉列表选择 TPU 主机和 XLA 高级优化器 (HLO) 模块进行直观呈现。
  2. 内存概览显示峰值内存分配和无填充的大小。
  3. 工作空间图表:显示峰值内存用量和内存用量图 趋势。将光标指向其中一个缓冲区中的缓冲区 图表,以便在缓冲区分配卡中显示其他信息。
  4. 缓冲区图表 两个图表,显示峰值内存时的缓冲区分配情况 。将光标指向其中一个缓冲区图表中的缓冲区,以显示额外的缓冲区 缓冲区详细信息卡片中的信息。
  5. 缓冲区分配详细信息卡片:显示缓冲区的分配详细信息。

内存概览面板

内存概览(顶部)面板显示模块名称,以及总缓冲区分配大小达到最大值时的峰值内存分配设置。此面板还显示未填充的峰值分配大小以供比较。

图片

工作空间图表

此图表显示峰值内存使用量,以及您的 计划。竖线表示程序的峰值内存利用率。这个 图表会显示您的程序能否放进可用的全局内存空间。

图片

图中的每个点代表一个“程序点”是 XLA HLO 程序中的全部通过 行显示了程序的内存用量随时间变化的情况。

与缓冲区图表元素的交互

在缓冲区图表中指向缓冲区时,水平方向将 显示缓冲区生命周期的线条显示在工作空间图表中。

图片

水平线的粗细表示缓冲器的相对大小 相对于峰值内存分配的大小。线条长度表示 缓冲区的生命周期。

缓冲区图表

两个图表显示了峰值内存用量的细分情况。

图片

  • By Program Order(按程序顺序)按从左到右的顺序显示缓冲区, 它们在程序执行期间处于活跃状态。

  • 按大小显示程序执行期间处于活动状态的缓冲区 按大小从小到大的顺序排列。

缓冲区分配详细信息卡片

当您将光标指向其中一个缓冲区图表中显示的缓冲区时,缓冲区就会被 分配详细信息卡片。典型的详细信息卡片如下所示:

图片

  1. 名称 - XLA 操作的名称。
  2. 类别 - 操作类别。
  3. 大小 - 缓冲区分配的大小(包括填充)。
  4. 未填充大小 - 未填充的缓冲区分配的大小。
  5. 扩展 - 含填充的缓冲区空间与未填充的缓冲区空间的相对大小 。
  6. 额外内存 - 指示填充额外使用了多少内存。
  7. 形状 - 描述 N 维的阶、大小和数据类型 数组。
  8. TensorFlow 操作名称 - 显示 TensorFlow 的名称 关联的操作 缓冲区分配。
  9. 分配类型 - 表示缓冲区分配类别: 参数、输出、线程局部和临时(例如缓冲区) 一次融合中的分配)。

内存不足错误

如果您运行模型时出现“内存不足”错误,请遵循本 来捕获配置文件。等到脚本开始训练模型 然后再启动 Profiler分析输出可以帮助您了解 引发了错误。