#python #jupyter-notebook #amazon-sagemaker
#python #jupyter-записная книжка #amazon-sagemaker
Вопрос:
Я хочу автоматизировать работу Jupyter.
Я создал функцию в AWS Lambda, которая, когда корзина S3 получает файл .csv, открывает определенный экземпляр Jupyter и работает нормально.
Теперь я хочу выполнить файл .ipynb, который выполняет всю работу.
Я пытался использовать жизненный цикл конфигурации Jupyter.
Но это всегда завершается неудачей. Возможно ли это сделать в той же лямбда-функции?
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
Комментарии:
1. Вы пытаетесь запустить Jupyter Notebook в экземпляре SageMaker Notebook из AWS Lambda? Экземпляр SageMaker всегда запущен или вы создаете экземпляр по мере необходимости?
2. @rajesh Первый шаг для вызова экземпляра, уже созданного в stopped из ноутбука в jupyter с помощью Lambda, работает нормально и вводит в эксплуатацию notebook. Мне нужен следующий шаг, который заключается в автоматизации выполнения файла .ipynb
Ответ №1:
Благодарим вас за использование Amazon SageMaker.
Официального способа выполнения кода на экземпляре Notebook из Lambda не существует, но ниже приведен несколько неаккуратный обходной путь.
Кстати, если использование Lambda не является жестким требованием, вы можете использовать какое-либо задание cron в вашем экземпляре Notebook для периодического выполнения jupyter notebook.
Поскольку вы уже выяснили способ запуска вашего экземпляра Notebook из Lambda, вы можете использовать следующий код (замените notebook_instance_name на имя вашего экземпляра Notebook), чтобы подключиться к вашему экземпляру InService Notebook и выполнить на нем команду, включая ту, которую вы предоставили для запуска jupyter notebook.
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. Я следовал документации по лямбде для упаковки зависимостей.
Редактировать:
Продаваемая версия запросов была удалена из botocore, поэтому from botocore.vendored import requests
должна быть заменена на import requests
По какой-то причине сервер websockets возвращает websocket._exceptions.WebSocketBadStatusException: Handshake status 500 Internal Server Error
, когда заголовок «User-Agent» отсутствует.
Чтобы включить заголовок, мы можем включить header
параметр в create_connection
метод:
ws = websocket.create_connection(
"wss://{}/terminals/websocket/5".format(http_hn),
cookie=cookies,
host=http_hn,
origin=http_proto "//" http_hn,
header = [
"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
]
)
Комментарии:
1. Я получаю сообщение об ошибке
websocket._exceptions.WebSocketBadStatusException: Handshake status 500 Internal Server Error
при создании соединения с websocket. Есть какие-либо подсказки о том, что происходит?2. Сравнил заголовки запросов из python и при доступе к терминалу через браузер и выяснил, что нам нужно добавить заголовок user-agent к запросам ws. Это можно сделать, добавив
header
параметр при создании соединения:header = [ "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36" ]
3. В настоящее время это не удается с
WebSocketBadStatusException:Handshake status 200 OK
Ответ №2:
Несколько вещей, просто чтобы уточнить, ваши вопросы: -Как вы можете запустить jupyter notebook онлайн, а не через CLI -Почему вы получаете отображаемую ошибку
Итак, чтобы ответить на первый вопрос, какой смысл запускать файл .ipynb в lambda, а не в экземпляре EC2? Если вы просто развернете файл там и установите anaconda / jupyter, вы сможете выполнять в облачной среде и, очевидно, использовать графический интерфейс, все на ресурсах AWS.
Второй вопрос, это не похоже на ошибку роли, но я предполагаю, что лямбда может получить доступ к sagemaker? кроме того, как вы получаете доступ к sagemaker через boto?
Редактировать: эта ссылка может помочь https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-root-access.html?sc_channel=smamp;sc_campaign=Docsamp;sc_publisher=LINKEDINamp;sc_country=Globalamp;sc_geo=GLOBALamp;sc_outcome=awarenessamp;trk=Docs_LINKEDINamp;sc_content=Docsamp;linkId=66519000
Комментарии:
1. Я хочу полной автоматизации. В первом случае у меня есть лямбда-функция, которая вызывает boto3 для ноутбука, который уже создан и находится в режиме паузы, чтобы запустить его в эксплуатацию в SageMaker Notebook, и это работает хорошо. Я создал конфигурацию жизненного цикла для начала и вставил код, который я объяснил выше. jupyter …. Эта часть также работает, но у меня возникают проблемы, когда файл .ipynb хочет импортировать модуль sagemaker. @Анон
2. Хорошо, понял, я неправильно понял ваш первоначальный вопрос. Вы импортируете из слоя или у вас есть код sagemaker, заархивированный с помощью lambda_hander?
Ответ №3:
Неясно, чего вы хотите достичь своим вопросом. Рискуя, что я ошибся, я опишу способ использования записных книжек jupyter, которые я разрабатываю в экземпляре SageMaker Jupyter notebook. В конце концов, служба notebooks предназначена для разработки, а не для производства или автоматизации выполнения python.
Во-первых, вы хотите, чтобы ваши файлы python и ipynb были в git или других системах управления версиями. Этого легко достичь, используя интеграцию SageMaker с git: https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html
Во-вторых, вы хотите ознакомиться с проектом Netflix с открытым исходным кодом papermill. Вы можете прочитать о полном стеке поддержки jupyter в Netflix в этом сообщении в блоге: 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