在SageMaker中自动执行.ipynb文件

时间:2019-04-21 09:28:06

标签: 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

运行文件.ipynb不会使其处于运行状态,它将在终端中执行该文件。

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

在文件.ipynb中,我打电话给Sagemaker担当角色,AWS CloudWatch显示的错误之一是:

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

3 个答案:

答案 0 :(得分:0)

为了澄清一下,您的问题是: -如何在线运行jupyter笔记本而不是通过CLI -为什么收到显示的错误

因此,第一个问题是,与在EC2实例上相反,在lambda中运行.ipynb文件有什么意义?如果仅在此处部署文件并安装anaconda / jupyter,则可以在云环境中执行,并且显然可以在所有AWS资源上使用GUI。

第二个问题,它看起来好像不是角色错误,但我认为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

有帮助

答案 1 :(得分:0)

感谢您使用Amazon SageMaker。

没有官方的方法可以在Lambda上的Notebook实例上执行代码,但是下面是一些杂乱的解决方法。

另外,如果不是很严格要求使用Lambda,则可以在Notebook实例上使用某种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 :(得分:0)

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

首先,您要在git或其他源代码控制系统中安装python和ipynb文件。使用SageMaekr的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

我正在使用造纸厂来计划,传递参数,执行笔记本并在s3中使用以下命令监视其输出:

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