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 文档打包依赖项。
| 归档时间: |
|
| 查看次数: |
4342 次 |
| 最近记录: |