在 SageMaker 中自动执行 .ipynb 文件

1 python jupyter-notebook amazon-sagemaker

我想自动化 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
Run Code Online (Sandbox Code Playgroud)

当您运行文件 .ipynb 没有运行时,它会在终端中执行它。

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

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

ModuleNotFoundError: No module named 'sagemaker' <-- Appears in CloudWatch
Run Code Online (Sandbox Code Playgroud)

小智 6

感谢您使用 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
Run Code Online (Sandbox Code Playgroud)

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