在训练期间,您可以使用交互式 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
控制台
在 Google Cloud 控制台中打开 AI Platform Training 作业页面。
点击列表中的作业名称以打开作业详细信息页面。
点击训练输出部分中的显示 JSON 按钮以展开作业的
TrainingOutput
的 JSON 视图。
在输出中,查找以下内容:
{
"webAccessUris": {
"master-replica-0": "INTERACTIVE_SHELL_URI"
}
}
如果您没有看到 webAccessUris
字段,可能是因为 AI Platform Training 尚未开始运行您的作业或试用。验证您是否看到 RUNNING
和 state
字段。如果状态为 QUEUED
或 PREPARING
,请稍等片刻。然后再次尝试获取作业信息。
超参数调节作业
以下标签页显示了访问超参数调节作业 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
控制台
在 Google Cloud 控制台中打开 AI Platform Training 作业页面。
点击列表中的作业名称以打开作业详细信息页面。
点击训练输出部分中的显示 JSON 按钮以展开作业的
TrainingOutput
的 JSON 视图。
在输出中,查找以下内容:
{
"trials": [
{
...
"webAccessUris": {
"master-replica-0": "INTERACTIVE_SHELL_URI"
}
},
...
]
}
如果您没有看到 webAccessUris
字段,可能是因为 AI Platform Training 尚未开始运行您的作业或试用。验证您是否看到 RUNNING
和 state
字段。如果状态为 QUEUED
或 PREPARING
,请稍等片刻。然后再次尝试获取作业信息。
当试用进入 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 中,您可以使用 gcloud storage
、bq
和其他支持 ADC 的工具。这可以帮助您验证作业是否能够访问训练代码所需的特定 Cloud Storage 存储桶、BigQuery 表或其他 Google Cloud 资源。
使用 py-spy
直观呈现 Python 执行
通过 py-spy
,您可以剖析正在执行的 Python 程序,而无需进行修改。如需在交互式 shell 中使用 py-spy
,请执行以下操作:
安装
py-spy
:pip3 install py-spy
在 shell 中运行
ps aux
,并查找 Python 训练程序的 PID。使用您在上一步中找到的 PID 运行
py-spy
文档中描述的任何子命令。如果您使用
py-spy record
创建 SVG 文件,请将此文件复制到 Cloud Storage 存储桶,以便稍后在本地计算机上查看。例如:gcloud storage 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 存储桶,以便稍后在本地计算机上进行分析。例如:
gcloud storage cp prof.nvvp gs://BUCKET
将 BUCKET 替换为您有权访问的存储桶的名称。
如果遇到 GPU 错误(不是配置或 AI Platform Training 问题),请使用
nvidia-bug-report.sh
创建错误报告。然后将报告转移到 Cloud Storage 存储桶,以便稍后在本地计算机上分析或将其发送到 NVIDIA。例如:
gcloud storage 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}"
后续步骤
- 详细了解 AI Platform Training 服务。
- 了解打包训练应用。