【问题标题】:Automate the execution of a .ipynb file in SageMaker在 SageMaker 中自动执行 .ipynb 文件
【发布时间】:2019-04-21 09:28:05
【问题描述】:

我想自动化 Jupyter 的工作。

我在 AWS Lambda 中创建了一个函数,当 S3 存储桶接收到一个 .csv 文件时,它会打开确定的 Jupyter 实例并且它工作正常。

现在我想执行完成所有工作的 .ipynb 文件。

我尝试过使用 Jupyter 配置生命周期。

但它总是失败。是否可以在同一个 lambda 函数中做到这一点?

jupyter nbconvert --execute --to notebook
                  --inplace /home/ec2-user/SageMaker/Scikit.ipynb
                  --ExecutePreprocessor.kernel_name=python3
                  --ExecutePreprocessor.timeout=1500

当你运行文件时,.ipynb 并没有投入运行,而是在终端中执行。

我希望你以在线模式运行它。

在文件 .ipynb 中,我调用 Sagemaker 来提供角色,AWS CloudWatch 显示的错误之一如下:

ModuleNotFoundError: No module named 'sagemaker' <-- Appears in CloudWatch

【问题讨论】:

  • 您是否尝试从 AWS Lambda 在 SageMaker Notebook 实例上执行 Jupyter Notebook? SageMaker 实例是始终在运行,还是您在需要时创建实例?
  • @rajesh 第一步使用 Lambda 在 jupyter 中调用已停止的笔记本中创建的实例,工作正常并投入使用笔记本。我需要下一步是自动执行 .ipynb 文件

标签: python jupyter-notebook amazon-sagemaker


【解决方案1】:

感谢您使用 Amazon SageMaker。

没有从 Lambda 在笔记本实例上执行代码的官方方法,但下面的解决方法有些杂乱无章。

附带说明,如果使用 Lambda 不是硬性要求,那么您可以在笔记本实例上使用某种 cron 作业来定期执行 jupyter 笔记本。

由于您已经找到了一种从 Lambda 启动笔记本实例的方法,您可以使用以下代码(将 notebook_instance_name 替换为您的笔记本实例名称)连接到您的 InService 笔记本实例并在其上执行命令,包括您提供给运行 jupyter 笔记本。

import boto3
import time
from botocore.vendored import requests
import websocket

def lambda_handler(event, context):
    sm_client = boto3.client('sagemaker')
    notebook_instance_name = 'test'
    url = sm_client.create_presigned_notebook_instance_url(NotebookInstanceName=notebook_instance_name)['AuthorizedUrl']

    url_tokens = url.split('/')
    http_proto = url_tokens[0]
    http_hn = url_tokens[2].split('?')[0].split('#')[0]

    s = requests.Session()
    r = s.get(url)
    cookies = "; ".join(key + "=" + value for key, value in s.cookies.items())

    ws = websocket.create_connection(
        "wss://{}/terminals/websocket/1".format(http_hn),
        cookie=cookies,
        host=http_hn,
        origin=http_proto + "//" + http_hn
    )

    ws.send("""[ "stdin", "jupyter nbconvert --execute --to notebook --inplace /home/ec2-user/SageMaker/Scikit.ipynb --ExecutePreprocessor.kernel_name=python3 --ExecutePreprocessor.timeout=1500\\r" ]""")
    time.sleep(1)
    ws.close()
    return None

请注意,以下代码涉及 python websocket 模块websocket-client,默认情况下不提供,因此您需要将其与您的 lambda 代码打包并上传到 lambda。我按照Lambda documentation 打包依赖项。

【讨论】:

    【解决方案2】:

    为了澄清,您的问题是: -如何在线而不是通过 CLI 运行 jupyter notebook - 你为什么会得到你显示的错误

    那么回答第一个问题,与在 EC2 实例上相比,在 lambda 中运行 .ipynb 文件有什么意义?如果你只是在那里部署文件并安装 anaconda/jupyter,你可以在云环境中执行,显然使用 GUI,所有这些都在 AWS 资源上。

    第二个问题,它看起来不像是角色错误,但我认为 lambda 可以访问 sagemaker?另外,您如何通过 boto 访问 sagemaker?

    编辑:这个链接可能对https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-root-access.html?sc_channel=sm&sc_campaign=Docs&sc_publisher=LINKEDIN&sc_country=Global&sc_geo=GLOBAL&sc_outcome=awareness&trk=Docs_LINKEDIN&sc_content=Docs&linkId=66519000有帮助

    【讨论】:

    • 我想要完全自动化。在第一个实例中,我有一个 lambda 函数,该函数将 boto3 调用到已创建并处于暂停模式的笔记本,以将其投入 SageMaker Notebook 中的服务,并且效果很好。我已经为开始创建了一个生命周期配置,并粘贴了我上面解释的代码。 jupyter .... 这部分也可以,但是当 .ipynb 文件想要导入 sagemaker 模块时我遇到了问题。 @Anon
    • 好的,明白了,我误解了你原来的问题。您是从图层导入还是使用 lambda_hander 压缩了 sagemaker 代码?
    【解决方案3】:

    不清楚您想通过问题实现什么。冒着我弄错的风险,我将描述我使用我在 SageMaker Jupyter 笔记本实例中开发的 jupyter 笔记本的方式。毕竟,notebooks 服务是为开发而设计的,而不是为 Python 执行的生产或自动化而设计的。

    首先,您希望在 git 或其他源代码控制系统中拥有您的 python 和 ipynb 文件。这使用 SageMaker 的 git 集成很容易实现:https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html

    其次,您要查看 Netflix 的开源项目,papermill。您可以在这篇博文中了解 Netflix 中完整的 jupyter 支持堆栈:https://medium.com/netflix-techblog/notebook-innovation-591ee3221233

    我正在使用 papermill 来安排、传递参数、执行笔记本并在 s3 中监视其输出,使用类似:

    $ papermill s3://bkt/input.ipynb s3://bkt/output.ipynb -p alpha 0.6 -p l1_ratio 0.1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2013-12-09
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多