Sagemaker 在训练期间未将 Tensorboard 日志输出到 S3

Posted

技术标签:

【中文标题】Sagemaker 在训练期间未将 Tensorboard 日志输出到 S3【英文标题】:Sagemaker not outputting Tensorboard logs to S3 during training 【发布时间】:2021-04-19 00:51:42 【问题描述】:

我正在使用 Amazon Sagemaker 使用 Tensorflow 训练模型,我希望能够在作业运行时监控训练进度。然而,在训练期间,不会将 Tensorboard 文件输出到 S3,只有在训练作业完成后才会将文件上传到 S3。训练完成后,我可以下载文件并看到 Tensorboard 在整个训练过程中一直正确记录值,尽管训练完成后仅在 S3 中更新一次。

我想知道为什么 Sagemaker 没有在整个训练过程中将 Tensorboard 信息上传到 S3?

这是我在 Sagemaker 上的笔记本中启动培训工作的代码

import sagemaker
from sagemaker.tensorflow import TensorFlow
from sagemaker.debugger import DebuggerHookConfig, CollectionConfig, TensorBoardOutputConfig

import time

bucket = 'my-bucket'
output_prefix = 'training-jobs'
model_name = 'my-model'
dataset_name = 'my-dataset'
dataset_path = f's3://bucket/datasets/dataset_name'

output_path = f's3://bucket/output_prefix'
job_name = f'model_name-dataset_name-training-time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())'
s3_checkpoint_path = f"output_path/job_name/checkpoints" # Checkpoints are updated live as expected
s3_tensorboard_path = f"output_path/job_name/tensorboard" # Tensorboard data isn't appearing here until the training job has completed

tensorboard_output_config = TensorBoardOutputConfig(
    s3_output_path=s3_tensorboard_path,
    container_local_output_path= '/opt/ml/output/tensorboard' # I have confirmed this is the unaltered path being provided to tf.summary.create_file_writer()
)

role = sagemaker.get_execution_role()

estimator = TensorFlow(entry_point='main.py', source_dir='./', role=role, max_run=60*60*24*5,
                           output_path=output_path,
                           checkpoint_s3_uri=s3_checkpoint_path,
                           tensorboard_output_config=tensorboard_output_config,
                           instance_count=1, instance_type='ml.g4dn.xlarge',
                           framework_version='2.3.1', py_version='py37', script_mode=True)

dpe_estimator.fit('train': dataset_path, wait=True, job_name=job_name)

【问题讨论】:

查看训练作业的 cloudwatch 日志。有什么相关的吗? 似乎没有。在日志中搜索“tensorboard”没有产生任何结果。唯一与远程相关的日志似乎是 Creating hook from json_config at /opt/ml/input/config/debughookconfig.json.Saving to /opt/ml/output/tensors ,它们出现在训练开始之前。 只是为了确认.. 训练作业完成后,日志是否上传到您在训练期间尝试上传的完全相同的 s3 位置?或者它是一个不同的桶? 日志被上传到嵌套在我试图让它们在整个培训过程中上传的位置的目录中,我将其传递为s3_output_path。我传递给TensorBoardOutputConfig 的目录是s3://bucket/training-jobs/job_name/tensorboard。在训练结束时,日志输出文件到嵌套在其中的目录,特别是s3://bucket/training-jobs/job_name/tensorboard/job_name/tensorboard_output/ 更新:我已将 s3_output_path 更改为 s3://bucket/training-jobs,以便在训练后,日志直接在 s3://bucket/training-jobs/job_name/tensorboard-output/ 中而不是嵌套,但 tensorboard-output 文件夹和日志仍然没有' t 出现直到训练完成 【参考方案1】:

在 tensorflow github 上有一个 issue 与 2.3.1 版中的 s3 客户端相关,这是您正在使用的那个。如果您遇到类似的错误,请检查 cloudwatch 日志

OP_REQUIRES 在 whole_file_read_ops.cc:116 处失败:前提条件失败:AWS 凭证未正确设置。无法访问指定的 S3 位置

那么提供的解决方案是给bucket添加GetObejectVersion权限。或者,要确认这是 tensorflow 问题,您可以尝试其他版本。

【讨论】:

查看日志后,我找不到任何与 S3 权限相关的内容 我尝试更新角色权限以包含 GetObjectVersion 以防万一,但直到训练完成后,张量板日志仍然不会出现在 S3 中 你可以试试 tensorflow 【参考方案2】:

首先是一些没有任何事实的猜测:Sagemaker 可以作为其他一些在本地驱动器和 s3 之间同步文件的系统工作。他们可能会在同步之前检查该文件是否最近未被访问过,这样他们就不会在有人写入时复制它。日志文件会不断写入,直到关闭,因此可能导致它们永远不会被复制。

我使用 Sagemaker Docker 容器时遇到了同样的问题。我尝试了两种方法来规避这个问题,它们似乎有效。

第一个是定期创建一个新的日志文件。所以例如每 30 分钟再次调用 tf.summary.create_file_writer(...) 以切换到新的日志文件。旧文件不再使用时会同步到 s3。

第二种是直接将日志写入s3。 tf.summary.create_file_writer('s3://bucket/dir/')。这是将信息导入 s3 的更即时方式。

【讨论】:

以上是关于Sagemaker 在训练期间未将 Tensorboard 日志输出到 S3的主要内容,如果未能解决你的问题,请参考以下文章

将经过训练的 AWS SageMaker MXNet 模型部署/转换到 iOS 设备

AWS SageMaker:使用托管在 S3 中的经过训练的模型创建终端节点

Sagemaker批处理转换作业-输入数据位置

SageMaker - CloudFormation 中 SageMaker 实体的说明

在 sagemaker 中使用带有对象检测 API 的 tensorboard

在webpack构建期间,未将Favicon添加到构建文件夹