使用交互式 shell 监控和调试训练

在训练期间,您可以使用交互式 shell 检查运行训练代码的容器。对于在 AI Platform Training 上运行的每个运行时版本自定义容器,您都可以浏览文件系统并运行调试实用程序。

使用交互式 Shell 检查训练容器可帮助您调试训练代码或 AI Platform Training 配置的问题。例如,您可以使用交互式 shell 执行以下操作:

  • 运行跟踪和剖析工具
  • 分析 GPU 使用情况
  • 检查容器可用的 Google Cloud 权限

准备工作

您可以在运行训练或超参数调节作业时使用交互式 shell。准备训练代码运行训练作业时,请务必满足以下要求:

  • 确保训练容器已安装 bash

  • 所有运行时版本容器都安装了 bash。如果您创建自定义容器进行训练,请使用包含 bash 的基础容器或在 Dockerfile 中安装 bash

  • 支持交互式 shell 的区域中执行训练。

  • 确保想要访问交互式 Shell 的任何人都拥有正在运行训练的 Google Cloud 项目的以下权限:

    • ml.jobs.create
    • ml.jobs.get
    • ml.jobs.cancel

    如果您自行启动训练,则您很可能已具有这些权限,并可以访问交互式 shell。但是,如果要使用交互式 shell 检查组织中其他人创建的训练作业,则可能需要获取这些权限。

    获取这些权限的一种方法是要求组织管理员授予您 AI Platform Training Admin 角色 (roles/ml.admin)。 如您已拥有 AI Platform Training Developer 角色 (roles/ml.developer),则可以访问自己创建的作业的交互式 Shell。

高级案例的要求

如果您使用的是特定高级功能,请满足以下额外要求:

  • 如果您为训练作业附加自定义服务账号,请确保任何想要访问交互式 Shell 的用户都具有所附加的服务账号的 iam.serviceAccounts.actAs 权限。

    自定义服务账号指南指明了您必须拥有此权限才能附加服务账号。此外,必须具有此权限才能在自定义训练期间查看交互式 Shell。

    例如,如需使用附加的服务账号创建作业,必须具有该服务账号的 iam.serviceAccounts.actAs 权限。如果您的某个同事随后想要查看此作业的交互式 Shell,则他们还必须具有相同的 iam.serviceAccounts.actAs 权限。

  • 如果您已将项目配置为将 VPC Service Controls 与 AI Platform Training 搭配使用,则需要考虑以下额外限制:

    • 您不能将 VPC Service Controls 与 VPC 网络对等互连搭配使用。

    • 在交互式 Shell 中,您无法访问服务边界外的公共互联网或 Google Cloud 资源。

    • 如需保护对交互式 Shell 的访问,除了 ml.googleapis.com 之外,您还必须在服务边界内添加 notebooks.googleapis.com 作为受限服务。如果您仅限制 ml.googleapis.com 而不限制 notebooks.googleapis.com,则用户可以从服务边界外的机器访问交互式 Shell,从而降低使用 VPC Service Controls 时的安全优势。

启用交互式 shell

如需为训练作业启用交互式 shell,请在创建训练作业时将作业的 trainingInput 字段中的 enableWebAccess API 字段 设置为 true

以下示例展示了在使用 gcloud CLI 时如何通过添加 --enable-web-access 标志来执行此操作。您目前无法在 Google Cloud 控制台中创建启用了交互式 shell 的训练作业。

该示例假定您在名为 trainer 的目录中的本地文件系统上有一个训练应用,该训练应用有一个名为 task 的模块。

如需创建训练作业,请运行以下命令:

  gcloud ai-platform jobs submit training JOB_ID \
    --enable-web-access \
    --job-dir=JOB_DIR \
    --module-name=trainer.task \
    --package-path=trainer \
    --python-version=3.7 \
    --region=REGION \
    --runtime-version=2.11 \
    --scale-tier=CUSTOM \
    --master-machine-type=n1-highmem-8

在此命令中,替换以下占位符:

  • JOB_ID:您为作业选择的名称。
  • JOB_DIR:Cloud Storage 目录的路径,您的训练应用将上传到该目录。
  • REGION:您计划创建训练作业的区域。请注意,它必须是支持交互式 shell 的地区

    如果成功,则该命令会生成以下输出:

    Job [JOB_ID] submitted successfully.
    Your job is still active. You may view the status of your job with the command
    
      $ gcloud ai-platform jobs describe JOB_ID
    
    or continue streaming the logs with the command
    
      $ gcloud ai-platform jobs stream-logs JOB_ID
    jobId: JOB_ID
    state: QUEUED
    

获取网络访问 URI

按照上一部分中的说明启动训练后,请使用 Google Cloud 控制台或 gcloud 命令行工具查看可用于访问交互式 shell 的 URI。AI Platform Training 会为作业中的每个训练节点提供 URI。

根据您创建的训练作业的类型,选择以下某个标签页以查看有关如何查找 webAccessUris API 字段的示例,该字段包含作业中每个节点的交互式 shell URI。

训练作业

以下标签页显示了访问标准训练作业的 TrainingOutput 的不同方法。

gcloud

运行 gcloud ai-platform jobs describe 命令

gcloud ai-platform jobs describe JOB_ID

请替换以下内容:

  • JOB_ID:您的作业的 ID。您在创建作业时设置此 ID。(如您不知道作业 ID,则可以运行 gcloud ai-platform jobs list 命令并查找相应的作业。)

在输出中,查找以下内容:

trainingOutput:
  webAccessUris:
    master-replica-0: INTERACTIVE_SHELL_URI

控制台

  1. 在 Google Cloud 控制台中打开 AI Platform Training 作业页面。

    在 Google Cloud 控制台中打开作业

  2. 点击列表中的作业名称以打开作业详细信息页面。

  3. 点击训练输出部分中的显示 JSON 按钮以展开作业的 TrainingOutput 的 JSON 视图。

在输出中,查找以下内容:

{
  "webAccessUris": {
    "master-replica-0": "INTERACTIVE_SHELL_URI"
  }
}

如果您没有看到 webAccessUris 字段,可能是因为 AI Platform Training 尚未开始运行您的作业或试用。验证您是否看到 RUNNINGstate 字段。如果状态为 QUEUEDPREPARING,请稍等片刻。然后再次尝试获取作业信息。

超参数调节作业

以下标签页显示了访问超参数调节作业 TrainingOutput 的不同方法。

gcloud

运行 gcloud ai-platform jobs describe 命令

gcloud ai-platform jobs describe JOB_ID

请替换以下内容:

  • JOB_ID:您的作业的 ID。您在创建作业时设置此 ID。(如您不知道作业 ID,则可以运行 gcloud ai-platform jobs list 命令并查找相应的作业。)

在输出中,查找以下内容:

trainingOutput:
  trials:
  - trialId: '1'
    webAccessUris:
      master-replica-0: INTERACTIVE_SHELL_URI

控制台

  1. 在 Google Cloud 控制台中打开 AI Platform Training 作业页面。

    在 Google Cloud 控制台中打开作业

  2. 点击列表中的作业名称以打开作业详细信息页面。

  3. 点击训练输出部分中的显示 JSON 按钮以展开作业的 TrainingOutput 的 JSON 视图。

在输出中,查找以下内容:

{
  "trials": [
    {
      ...
      "webAccessUris": {
        "master-replica-0": "INTERACTIVE_SHELL_URI"
      }
    },
    ...
  ]
}

如果您没有看到 webAccessUris 字段,可能是因为 AI Platform Training 尚未开始运行您的作业或试用。验证您是否看到 RUNNINGstate 字段。如果状态为 QUEUEDPREPARING,请稍等片刻。然后再次尝试获取作业信息。

当试用进入 RUNNING 状态时,AI Platform Training 会为每次超参数调节试用提供一组交互式 Shell URI。如果您希望获取用于之后试用的交互式 shell URI,请在这些试用开始后再次获取作业信息。

上述示例显示了单副本训练的预期输出:主训练节点一个 URI。如果您正在执行分布式训练,则输出包含每个训练节点的一个 URI,由任务名称标识。

例如,如果您的作业有一个主实例和两个工作器,则 webAccessUris 字段如下所示:

{
  "master-replica-0": "URI_FOR_PRIMARY",
  "worker-replica-0": "URI_FOR_FIRST_SECONDARY",
  "worker-replica-1": "URI_FOR_SECOND_SECONDARY"
}

可用区域

以下区域支持将交互式 shell 用于 AI Platform Training:

美洲

  • 俄勒冈 (us-west1)
  • 洛杉矶 (us-west2)
  • 爱荷华 (us-central1)
  • 南卡罗来纳 (us-east1)
  • 北弗吉尼亚 (us-east4)
  • 蒙特利尔 (northamerica-northeast1)

欧洲

  • 伦敦 (europe-west2)
  • 比利时 (europe-west1)
  • 苏黎世 (europe-west6)
  • 法兰克福 (europe-west3)

亚太地区

  • 新加坡 (asia-southeast1)
  • 台湾 (asia-east1)
  • 东京 (asia-northeast1)
  • 悉尼 (australia-southeast1)
  • 首尔 (asia-northeast3)

AI Platform Training 还提供其他训练区域

使用交互式 shell

如需将交互式 shell 用于训练节点,请导航到您在上一部分中找到的其中一个 URI。Bash shell 显示在浏览器中,让您能够访问 AI Platform Training 在其中运行训练代码的容器的文件系统。

以下部分介绍了您在使用 shell 时需要考虑的一些事项,并提供了一些可以在 shell 中使用的监控工具示例。

阻止作业结束

当 AI Platform Training 运行完您的作业或试用时,您将立即失去对交互式 shell 的访问权限。如果发生这种情况,您可能会看到消息 command terminated with exit code 137,或者 shell 可能会停止响应。如果您在容器的文件系统中创建了任何文件,则作业结束后,这些文件将不会保留。

在某些情况下,您可能希望故意延长作业运行时间,以便使用交互式 shell 进行调试。例如,您可以将如下所示的代码添加到训练代码中,以便让作业在异常发生后至少继续运行一小时:

import time
import traceback

try:
    # Replace with a function that runs your training code
    train_model()
except Exception as e:
    traceback.print_exc()
    time.sleep(60 * 60)  # 1 hour

但请注意,只要作业继续运行,您就需要支付 AI Platform Training 训练费用

检查权限问题

交互式 Shell 环境使用 AI Platform Training 用于运行训练代码的服务账号的应用默认凭据 (ADC) 进行身份验证。如需了解详情,您可以在 shell 中运行 gcloud auth list

在 shell 中,您可以使用 gsutilbq 和其他支持 ADC 的工具。这可以帮助您验证作业是否能够访问训练代码所需的特定 Cloud Storage 存储桶、BigQuery 表或其他 Google Cloud 资源。

使用 py-spy 直观呈现 Python 执行

通过 py-spy,您可以剖析正在执行的 Python 程序,而无需进行修改。如需在交互式 shell 中使用 py-spy,请执行以下操作:

  1. 安装 py-spy

    pip3 install py-spy
    
  2. 在 shell 中运行 ps aux,并查找 Python 训练程序的 PID。

  3. 使用您在上一步中找到的 PID 运行 py-spy 文档中描述的任何子命令。

  4. 如果您使用 py-spy record 创建 SVG 文件,请将此文件复制到 Cloud Storage 存储桶,以便稍后在本地计算机上查看。例如:

    gsutil cp profile.svg gs://BUCKET
    

    BUCKET 替换为您有权访问的存储桶的名称。

使用 perf 分析性能

perf 可让您分析训练节点的性能。如需安装适合节点 Linux 内核的 perf 版本,请运行以下命令:

apt-get update
apt-get install -y linux-tools-generic
rm /usr/bin/perf
LINUX_TOOLS_VERSION=$(ls /usr/lib/linux-tools | tail -n 1)
ln -s "/usr/lib/linux-tools/${LINUX_TOOLS_VERSION}/perf" /usr/bin/perf

之后,您可以运行 perf 文档中介绍的任意子命令。

获取有关 GPU 使用情况的信息

在具有 GPU 的节点上运行的支持 GPU 的容器通常预装了几个命令行工具,可以帮助您监控 GPU 使用情况。例如:

  • 使用 nvidia-smi 监控各种进程的 GPU 利用率。

  • 使用 nvprof 收集各种 GPU 剖析信息。由于 nvprof 无法附加到现有进程,因此您可能需要使用该工具启动运行训练代码的其他进程。(这意味着您的训练代码将在节点上运行两次。)例如:

    nvprof -o prof.nvvp python3 -m MODULE_NAME
    

    MODULE_NAME 替换为训练应用的入口点模块的完全限定名称;例如 trainer.task

    然后将输出文件转移到 Cloud Storage 存储桶,以便稍后在本地计算机上进行分析。例如:

    gsutil cp prof.nvvp gs://BUCKET
    

    BUCKET 替换为您有权访问的存储桶的名称。

  • 如果遇到 GPU 错误(不是配置或 AI Platform Training 问题),请使用 nvidia-bug-report.sh 创建错误报告。

    然后将报告转移到 Cloud Storage 存储桶,以便稍后在本地计算机上分析或将其发送到 NVIDIA。例如:

    gsutil cp nvidia-bug-report.log.gz gs://BUCKET
    

    BUCKET 替换为您有权访问的存储桶的名称。

如果 bash 找不到上述任何 NVIDIA 命令,请尝试将 /usr/local/nvidia/bin/usr/local/cuda/bin 添加到 shell 的 PATH

export PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}"

后续步骤