Python 在SageMaker中自动执行.ipynb文件

Python 在SageMaker中自动执行.ipynb文件,python,jupyter-notebook,amazon-sagemaker,Python,Jupyter Notebook,Amazon Sagemaker,我想让朱彼特的工作自动化 我在AWS Lambda中创建了一个函数,当S3 bucket接收到一个.csv文件时,它会打开确定的Jupyter实例,并且工作正常 现在我想执行完成所有工作的.ipynb文件 我尝试过使用Jupyter配置生命周期 但它总是失败。是否可以在相同的lambda函数中执行此操作 jupyter nbconvert --execute --to notebook --inplace /home/ec2-user/SageMaker/Sc

我想让朱彼特的工作自动化

我在AWS Lambda中创建了一个函数,当S3 bucket接收到一个.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不会进入running,它会在终端中执行它

我想让你在在线模式下运行它

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

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

有几件事,我想澄清一下,你的问题是: -如何在线而不是通过CLI运行jupyter笔记本 -为什么会出现显示的错误

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

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


编辑:此链接可能有助于

几件事,请澄清一下,您的问题是: -如何在线而不是通过CLI运行jupyter笔记本 -为什么会出现显示的错误

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

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


编辑:此链接可能会有所帮助

感谢您使用亚马逊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

请注意,以下代码涉及PythonWebSocket模块websocket客户端,默认情况下,该模块不提供,因此您需要将其与lambda代码打包并上传到lambda。我遵循了打包依赖项的说明。

感谢您使用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

请注意,以下代码涉及PythonWebSocket模块websocket客户端,默认情况下,该模块不提供,因此您需要将其与lambda代码打包并上传到lambda。我遵循了打包依赖项的定义。

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

首先,您希望将python和ipynb文件放在git或其他源代码管理系统中。使用SageMaker的git集成很容易实现这一点:

第二,你想看看Netflix的开源项目。您可以在以下博客文章中了解Netflix对jupyter的全面支持:

我使用papermill在s3中调度、传递参数、执行笔记本并监控其输出,使用类似于:

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

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

首先,您希望将python和ipynb文件放在git或其他源代码管理系统中。这是e 使用SageMaker的git集成轻松实现:

第二,你想看看Netflix的开源项目。您可以在以下博客文章中了解Netflix对jupyter的全面支持:

我使用papermill在s3中调度、传递参数、执行笔记本并监控其输出,使用类似于:

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

您是否试图在AWS Lambda的SageMaker笔记本实例上执行Jupyter笔记本?SageMaker实例是否始终在运行,或者您是否在需要时创建实例?@rajesh使用Lambda调用jupyter笔记本的stopped中已创建的实例的第一步,工作正常并投入笔记本使用。我需要下一步,即自动执行.ipynb文件。您是否尝试在AWS Lambda的SageMaker笔记本实例上执行Jupyter笔记本?SageMaker实例是否始终在运行,或者您是否在需要时创建实例?@rajesh使用Lambda调用jupyter笔记本的stopped中已创建的实例的第一步,工作正常并投入笔记本使用。我需要下一步是自动化.ipynb文件的执行。我想要完全自动化。在第一个例子中,我有一个lambda函数,它调用boto3到已经创建的笔记本,并处于暂停模式,将其在SageMaker笔记本中投入使用,效果很好。我已经为开始创建了一个生命周期配置,并粘贴了上面解释的代码。朱庇特。。。。这部分也可以工作,但是当.ipynb文件想要导入sagemaker模块时,我遇到了问题@AnonOk,明白了,我误解了你原来的问题。你是从图层导入还是用lambda_hander压缩sagemaker代码?我想要完全自动化。在第一个例子中,我有一个lambda函数,它调用boto3到已经创建的笔记本,并处于暂停模式,将其在SageMaker笔记本中投入使用,效果很好。我已经为开始创建了一个生命周期配置,并粘贴了上面解释的代码。朱庇特。。。。这部分也可以工作,但是当.ipynb文件想要导入sagemaker模块时,我遇到了问题@AnonOk,明白了,我误解了你原来的问题。您是从图层导入还是使用lambda_hander压缩sagemaker代码?