使用SageMaker Lifecycle配置在启动时执行jupyter笔记本

问题描述

我想为运行SageMaker Notebook设置一些自动时间表。
目前,我发现了这样的链接
https://towardsdatascience.com/automating-aws-sagemaker-notebooks-2dec62bc2c84

我按照步骤设置了lamda,cloudwatch和Lifecycle配置。
在不同的实验中,有时on_start生命周期配置可以执行jupyter笔记本(在笔记本中,我仅安装一些软件包并加载该软件包并将加载状态保存到S3存储桶中)。但是,由于无法停止笔记本而失败。

然后,我向我的IAM角色添加了SageMaker自动停止的权限。现在可以打开和关闭笔记本实例。但是我再也看不到任何东西上传到我的S3了。我想知道on_start是否在完成步骤之前过早开始自动停止?

下面是我当前生命周期配置的脚本

set -e

ENVIRONMENT=python3
NOTEBOOK_FILE="/home/ec2-user/SageMaker/Test Notebook.ipynb"
AUTO_STOP_FILE="/home/ec2-user/SageMaker/auto-stop.py"

source /home/ec2-user/anaconda3/bin/activate "$ENVIRONMENT"

nohup jupyter nbconvert --ExecutePreprocessor.timeout=-1 --ExecutePreprocessor.kernel_name=python3 --execute "$NOTEBOOK_FILE" &

echo "Finishing running the jupyter notebook"

source /home/ec2-user/anaconda3/bin/deactivate

# ParaMETERS
IDLE_TIME=60  # 1 minute

echo "Fetching the autostop script"
wget -O autostop.py https://raw.githubusercontent.com/mariokostelac/sagemaker-setup/master/scripts/auto-stop-idle/autostop.py

echo "Starting the SageMaker autostop script in cron"
(crontab -l 2>/dev/null; echo "*/1 * * * * /bin/bash -c '/usr/bin/python3 $DIR/autostop.py --time ${IDLE_TIME} | tee -a /home/ec2-user/SageMaker/auto-stop-idle.log'") | crontab -

请注意,我确实从cloudwatch日志中看到了回显“完成运行jupyter笔记本”。但这通常是我从日志中看到的第一件事,它会立即显示-速度比我预期的要快。

此外,当前笔记本电脑仅运行一些假任务。实际任务可能需要一个多小时。

任何建议都可以帮助您!感谢您抽出宝贵的时间阅读我的问题。

解决方法

当你说

我确实从 cloudwatch 日志中看到了“正在完成运行 jupyter 笔记本”的回声。但这通常是我从日志中看到的第一件事,它会立即显示出来 - 比我预期的要花多长时间。

当您的脚本中有这一行时,这是预期的

nohup jupyter nbconvert --ExecutePreprocessor.timeout=-1 --ExecutePreprocessor.kernel_name=python3 --execute "$NOTEBOOK_FILE" &

nohup 帮助进程保持运行,即使您从终端注销。 & 将进程发送到后台。 因此,下一个命令会在这一行之后立即运行。

您可能在此处使用了“nohup”和“&”,因为运行笔记本所需的时间比 LifecycleConfiguration 脚本允许的最长时间要长,这在我看来很好。


现在可以打开和关闭笔记本实例。但是我再也看不到任何上传到我的 S3 的内容了。我想知道 on_start 在完成步骤之前是否过早地启动了自动停止?

在你的脚本中你有

(crontab -l 2>/dev/null; echo "*/1 * * * * /bin/bash -c '/usr/bin/python3 $DIR/autostop.py --time ${IDLE_TIME} | tee -a /home/ec2-user/SageMaker/auto-stop-idle.log'") | crontab -

这是设置每分钟运行一次的 Cron 作业。该作业执行 $DIR/autostop.py 脚本(看起来 $DIR 的值没有顺便设置)。而 autostop.py 脚本使用 $IDLE_TIME 来确定它是否应该调用 stop_notebook_instance API。

没有查看有关 autostop.py 脚本功能的详细信息。您可能需要调整 Cron 作业的频率,或调整 $IDLE_TIME。

另一个想法是因为你说你的真实笔记本需要1个多小时,也许你可以让笔记本在最后一个单元格调用stop_notebook_instance API。