使用 Stackdriver 监控 Cloud TPU

本指南介绍了如何使用 Stackdriver 来监控 Cloud TPU。您的 Cloud TPU 会自动收集 Cloud TPU 运行时二进制文件(例如 Cloud TPU 运行时 CPU 使用率、MXU 利用率)的日志和指标,并将其保存在 Stackdriver 中。本指南将帮助您熟悉这些日志,并向您展示如何执行以下操作:

  • 查询这些日志

  • 创建基于日志的指标,用于设置提醒和直观显示信息中心。

前提条件

本文假定您对 Stackdriver Logging 有一些基本了解。您必须先创建 Compute Engine 虚拟机和 Cloud TPU 资源,才能开始生成和使用日志。如需了解详细信息,请参阅快速入门

在您运行完模型并且不再需要资源之前,请勿执行快速入门中的清理说明部分。执行清理步骤可防止产生不必要的费用。

日志

Stackdriver Logging 由 Cloud TPU 自动执行,可能会产生费用。如需详细了解日志记录费用,请参阅日志记录费用

Stackdriver Logging 会随着您添加 Cloud TPU Pod 进行线性扩缩。您可以通过排除日志来减少提取的日志数量或停用 Stackdriver Logging。如需了解详情,请参阅日志排除项

找到 Stackdriver 中的监控日志

本指南中讨论的监控日志是位于名为 runtime_monitor 的特殊日志实体中。要找到监控日志,请执行以下操作:

  1. 转到 Cloud Console 中的 Google Cloud 的运维套件 Logging > 日志(日志查看器)页面:

    转到“日志查看器”页面

  2. 在页面顶部选择一个现有 Google Cloud 项目。

  3. 通过已审核的资源选择器菜单,您可以选择要显示的资源、日志以及显示的日志等级严重程度。点击已审核的资源选择器菜单,向下滚动并将鼠标悬停在 TPU 工作进程上。选择地区,然后选择要查看其日志的 Cloud TPU 的名称 (node_id)。

  4. 在日志下拉菜单中,选择 runtime_monitor。点击确定按钮。

图片

使用 Stackdriver 高级查询

您可以使用 Stackdriver 高级查询来快速识别请求的监控日志。

如需在日志查看器中使用高级日志查询,请执行以下操作:

  1. 转到 Cloud Console 中的Google Cloud 的运维套件 Logging > 日志(日志查看器)页面:

    转到“日志查看器”页面

  2. 在页面顶部选择一个现有 Google Cloud 项目,或者创建一个新项目。

  3. 在搜索查询框中,先点击下拉菜单 ,然后选择转换为高级过滤条件

  4. 在高级日志查询框中,先输入以下脚本,然后点击提交过滤条件按钮:

    resource.type=tpu_worker
    resource.labels.project_id=your-project
    resource.labels.zone=your-tpu-zone
    resource.labels.node_id=your-tpu-name
    logName=projects/your-project/logs/tpu.googleapis.com%2Fruntime_monitor
    

图片

了解日志输出

点击任意日志条目将其展开,您都将会看到名为 jsonPayload 的字段。 这是监控日志所在的位置。点击展开它,您将看到多个子字段。下面汇总了重要的子字段。

  • evententry_timestamp:当前日志条目创建所对应的时间戳。

  • UID:您的 Cloud TPU 的 id

  • logTime:RAW 环境日志生成的的日志条目,进而生成时间戳。

  • checkpoint_succeeded:是否已成功保存检查点。

  • training_completed:是否已将训练过程标记为已完成。

  • compilation_succeeded:编译是否成功。

  • compilation_timed_out:编译是否超时。

  • execute_succeeded:执行是否成功。

  • execute_timed_out:执行是否超时。

  • eager_started:运行时是否采用 Eager 模式。

  • framework:运行时框架,即 tensorflow 或 pytorch。

  • runtime_cpu_perc:Cloud TPU 运行时 CPU 用量百分比。这是一个数值,其范围为 0~5000。

  • runtime_used_MiB:MiT 中的 Cloud TPU 运行时内存用量。这是一个数值,其范围为 0~100。

  • system_available_memory_GiB:GiB 中的剩余系统可用于内存。这是一个数值,其范围为 0~100。

  • matrix_unit_utilization_percent:Cloud TPU MXU 利用率百分比。 这是一个数值,范围为 0~100。

根据日志条目的来源,并非所有子字段都会立即展示。例如,具有子字段 system_available_memory_GiB 的日志条目不会包含 matrix_unit_utilization_percent 等子字段。

创建基于日志的指标

本部分介绍如何创建用于设置监控信息中心和提醒的基于日志的指标。另请参阅使用 Stackdriver REST API 以编程方式创建基于日志的指标

以下示例使用 matrix_unit_utilization_percent 子字段来演示创建用于监控 Cloud TPU 矩阵乘法单元 (MXU) 利用率的基于日志的指标所需的过程。

  1. 在高级查询框中,输入以下查询脚本提取为主要 Cloud TPU 工作器定义了 matrix_unit_utilization_percent 的所有日志条目:

    resource.type=tpu_worker
    resource.labels.project_id=your-project
    resource.labels.zone=your-tpu-zone
    resource.labels.node_id=your-tpu-name
    resource.labels.worker_id=0
    logName=projects/your-project/logs/tpu.googleapis.com%2Fruntime_monitor
    jsonPayload.matrix_unit_utilization_percent:*
    
  2. 点击创建指标按钮。在右侧提示的指标编辑器边栏中,在名称说明字段中分别输入“matrix_unit_utilization_percent”和“MXU utilization”。

  3. 点击类型下拉菜单,然后选择分发分发类型适用于显示数字指标。

  4. 字段名称中,输入“jsonPayload.matrix_unit_utilization_percent”。

  5. 点击更多。在直方图存储分区部分,更改下拉菜单键入线性。在起始值输入 0、在存储分区数量输入 200 以及在存储分区宽度输入 0.5。这将创建 200 个存储分区,其范围为 0~100,存储分区宽度为 0.5。

  6. 点击边栏底部的创建指标按钮完成指标创建。

图片

要准确显示监控结果,您的存储分区范围定义必须合适。 使用了解日志输出中为数字字段指定的范围值。一种方法是始终将用作类型、将 200 用作桶数,然后确定桶宽基于指标范围。

使用 Stackdriver REST API 以编程方式创建基于日志的指标

您可以通过编程方式Stackdriver REST API创建这些指标。 使用此 API 的前提条件是包含所有必需指标定义的 JSON 文件。请参阅创建分布指标的说明,了解如何使用 JSON 定义基于日志的指标。以下示例在一个 JSON 文件中声明两个指标:

[
  {
    "name": "system_available_memory_GiB",
    "description": "System available memory.",
    "filter": "resource.type=tpu_worker AND resource.labels.project_id=your-project AND jsonPayload.system_available_memory_GiB:*",
    "valueExtractor": "EXTRACT(jsonPayload.system_available_memory_GiB)",
    "bucketOptions": {
      "linearBuckets": {
        "numFiniteBuckets": 200,
        "width": 1.75,
        "offset": 0
      }
    },
    "metricDescriptor": {
      "metricKind": "DELTA",
      "valueType": "DISTRIBUTION"
    }
  },
  {
    "name": "matrix_unit_utilization_percent",
    "description": "MXU utilization.",
    "filter": "resource.type=tpu_worker AND resource.labels.project_id=your-project AND jsonPayload.matrix_unit_utilization_percent:*",
    "valueExtractor": "EXTRACT(jsonPayload.matrix_unit_utilization_percent)",
    "bucketOptions": {
      "linearBuckets": {
        "numFiniteBuckets": 200,
        "width": 0.5,
        "offset": 0
      }
    },
    "metricDescriptor": {
      "metricKind": "DELTA",
      "valueType": "DISTRIBUTION"
    }
  }
]

为了简化指标创建,我们在此链接中提供了包含一些预定义指标的 JSON 文件,其中包含以下内容:

  1. matrix_unit_utilization_percent:MXU 利用率百分比。

  2. system_available_memory_GiB:以 GiB 表示的系统可用内存。

  3. runtime_used_MiB:以 MiB 表示的 Cloud TPU 运行时内存用量。

  4. runtime_cpu_perc:Cloud TPU 运行时 CPU 用量百分比。

  5. training_completed:已完成培训活动的次数。

  6. compilation_succeeded:成功的编译事件数量。

Stackdriver REST API 一次仅接受输入一个 JSON 对象。因此,我们需要一种工具来将 JSON 文件中的列表分解为单个 JSON 对象,然后再将其传递到 REST API。我们建议您使用开源工具jq

如果您已经创建了具有相同名称的指标,则需要在运行 Stackdriver REST API 之前,或者更改 JSON 文件中的指标名称或者移除现有指标。要移除现有指标,您首先需要删除为其设置的所有提醒。您可以按照本指南中的说明移除现有提醒政策。 请按以下步骤操作,移除指标和创建新指标的操作可以自动完成:

  1. 打开下载的 JSON 文件,然后将 your-project 替换为您的项目。

  2. 移除所有现有指标:

    jq -c '.[] | .name' your-json-file-name | \
    xargs -I % curl -X DELETE "https://logging.googleapis.com/v2/projects/your-project/metrics/%" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Accept: application/json"
    
  3. 创建新指标:

    jq -c .[] your-json-file-name | \
    xargs -0 -d '\n' -I % curl -X POST "https://logging.googleapis.com/v2/projects/your-project/metrics" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Accept: application/json" -H "Content-Type: application/json" -d %
    

使用基于日志的指标创建信息中心和提醒

创建基于日志的指标后,您可以在 Stackdriver Monitoring 中创建信息中心和提醒。信息中心有助于直观显示指标(预计会延迟大约 2 分钟);提醒有助于您在出现问题时收到通知。

创建信息中心

本部分中的步骤展示了一个示例,它是在 Stackdriver Monitoring 中为 matrix_unit_utilization_percent 指标创建信息中心。

  1. 转到 Stackdriver Monitoring Console。

    转到 Stackdriver Monitoring

  2. 先将光标移动到信息中心,然后点击所提示菜单中的创建信息中心

  3. 点击右上角的添加图表按钮。

  4. 在提示的新页面中,在图表标题文本输入框中输入“TPU 运行时 MXU 利用率”。

  5. 查找资源类型和指标字段中,输入“matrix_unit_utilization_percent”。 Stackdriver 将自动加载已创建的指标 logging.googleapis.com/user/matrix_unit_utilization_percent。 选择找到的指标。请注意,TPU 工作器应该会自动填充资源类型字段。

  6. 过滤条件字段中,将 project_id 设置为项目,将 zone 设置为您的 tpu 地区,将 node_id 设置为您的 tpu 名称。

  7. Aggregator更改为none。然后点击页面底部的保存按钮。

创建提醒

本部分中的步骤显示如何为 matrix_unit_utilization_percent 指标添加提醒政策的示例。此示例将创建与 Cloud TPU MXU 利用率相关的提醒政策。只要此变量低于 5% 超过 1 小时,Stackdriver 就会向注册的电子邮件地址发送电子邮件。如果 Cloud TPU 的 MXU 利用率再次高于 5%,则 Stackdriver 会发送一条通知,告知您已移除提醒。

  1. 转到 Stackdriver Monitoring Console。

    转到 Stackdriver Monitoring

  2. 将光标移至提醒,然后点击所提示菜单中的创建政策

  3. 在提示的创建新的提醒政策页面上,点击添加条件按钮。

  4. 条件字段中输入“TPU 运行时低 MXU 利用率提醒”。

  5. 查找资源类型和指标字段中,输入“matrix_unit_utilization_percent”。 Stackdriver 将自动加载已创建的指标 logging.googleapis.com/user/matrix_unit_utilization_percent。 选择找到的指标。请注意,TPU 工作器应该会自动填充资源类型字段。

  6. 配置部分中,将条件更改为低于;在阈值字段中输入 5,然后在持续下拉菜单中选择 1 小时。点击保存按钮。

  7. Notification Channel Type 下拉菜单中,选择 Email,然后在 Email address 文本框中输入您的电子邮件地址。点击 Add Notification Channel 按钮。

  8. Documentation 字段中,您可以在触发提醒后输入任何信息来帮助您确定问题。

  9. 在文本输入框的 Name this policy 下方,输入“TPU runtime low MXU utilization alert”。 点击底部的保存按钮。