Я настроил локальный экземпляр JupyterLab с расширением SageMaker для запуска заданий в AWS, и теперь я вижу, что задания запускаются с правильным файлом .ipynb во входной папке S3, но не вижу никакого результата, поскольку файлов с префиксом «выход» не существует. и нечего скачивать.
Все настраивается по этой инструкции . Роли, разрешения перепроверены и идеи у меня закончились. Не могли бы вы дать мне направление? Есть ли у нас какие-либо соответствующие журналы, чтобы заглянуть под капот?
Обновление 1
Полный сценарий:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EventBridgeSchedule",
"Effect": "Allow",
"Action": [
"events:TagResource",
"events:DeleteRule",
"events:PutTargets",
"events:DescribeRule",
"events:EnableRule",
"events:PutRule",
"events:RemoveTargets",
"events:DisableRule"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/sagemaker:is-scheduling-notebook-job": "true"
}
}
},
{
"Sid": "IAMPassRoleToNotebookJob",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::*:role/SagemakerJupyterScheduler*",
"Condition": {
"StringLike": {
"iam:PassedToService": [
"sagemaker.amazonaws.com",
"events.amazonaws.com"
]
}
}
},
{
"Sid": "IAMListRoles",
"Effect": "Allow",
"Action": "iam:ListRoles",
"Resource": "*"
},
{
"Sid": "S3ArtifactsAccess",
"Effect": "Allow",
"Action": [
"s3:PutEncryptionConfiguration",
"s3:CreateBucket",
"s3:PutBucketVersioning",
"s3:ListBucket",
"s3:PutObject",
"s3:GetObject",
"s3:GetEncryptionConfiguration",
"s3:DeleteObject",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::sagemaker-automated-execution-*"
]
},
{
"Sid": "S3DriverAccess",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::sagemakerheadlessexecution-*"
]
},
{
"Sid": "SagemakerJobs",
"Effect": "Allow",
"Action": [
"sagemaker:DescribeTrainingJob",
"sagemaker:StopTrainingJob",
"sagemaker:DescribePipeline",
"sagemaker:CreateTrainingJob",
"sagemaker:DeletePipeline",
"sagemaker:CreatePipeline"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/sagemaker:is-scheduling-notebook-job": "true"
}
}
},
{
"Sid": "AllowSearch",
"Effect": "Allow",
"Action": "sagemaker:Search",
"Resource": "*"
},
{
"Sid": "SagemakerTags",
"Effect": "Allow",
"Action": [
"sagemaker:ListTags",
"sagemaker:AddTags"
],
"Resource": [
"arn:aws:sagemaker:*:*:pipeline/*",
"arn:aws:sagemaker:*:*:space/*",
"arn:aws:sagemaker:*:*:training-job/*",
"arn:aws:sagemaker:*:*:user-profile/*"
]
},
{
"Sid": "ECRImage",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchGetImage"
],
"Resource": "*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"sagemaker.amazonaws.com",
"events.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:AbortMultipartUpload"
],
"Resource": [
"arn:aws:s3:::sagemaker-automated-execution-xxxxxxxxxxxx-us-east-1/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListAllMyBuckets",
"s3:GetBucketCors",
"s3:PutBucketCors"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetBucketAcl",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::sagemaker-automated-execution-xxxxxxxxxxxx-us-east-1"
]
}
]
}
Image: arn:aws:sagemaker:us-east-1:081325390199:image/sagemaker-base-python-38
Kernel: python3
Role ARN: arn:aws:iam::xxxxxxxxxxxx:role/SagemakerJupyterSchedulerRole
Input: s3://sagemaker-automated-execution-xxxxxxxxxxxx-us-east-1/
Output: s3://sagemaker-automated-execution-xxxxxxxxxxxx-us-east-1/
В конце концов, я вижу только входные ipynb-файлы в целевой корзине S3.
❯ aws s3 ls s3://sagemaker-automated-execution-xxxxxxxxxxxx-us-east-1/ --recursive
2024-04-18 16:57:19 4536 helloworld2ipynb-helloworld2-45e83409-2024-04-18-16-57-17/input/hello-world2.ipynb
2024-04-18 16:49:00 4536 helloworld2ipynb-helloworld2-4d179d7f-2024-04-18-16-48-57/input/hello-world2.ipynb
2024-04-15 11:31:10 4536 helloworld2ipynb-helloworld2-ae714726-2024-04-15-11-31-08/input/hello-world2.ipynb
2024-04-15 10:47:33 2631 helloworld2ipynb-helloworld2-b516481a-2024-04-15-10-47-31/input/hello-world2.ipynb
Обновление 2
@Tomonori Shimomura подал идею провести эксперимент, и в конце концов я понял, что SageMaker вообще не управляет этой работой!
Теперь нужно упомянуть один шаг назад и мой предыдущий вопрос на StackOverflow, где я придумал собственное «решение», но теперь кажется, что моя текущая проблема каким-то образом связана с этим хаком.
Обновление 3
Я помещаю в ресурс-метаданные.json:
{
"AppType": "JupyterLab"
}
... потому что я нашел в amazon_sagemaker_jupyter_scheduler/model_converter.py:
if get_app_type() == "JupyterLab":
container_entrypoint = ["amazon_sagemaker_scheduler"]
else:
container_entrypoint = ["/bin/bash"]
Теперь задание запускается, но сразу завершается с ошибкой: «[FATAL tini (8)] exec amazon_sagemaker_scheduler не удалось: нет такого файла или каталога»
Пытаюсь разобраться, но идей пока нет.
Последнее обновление
Я пропустил строгие требования к версии в руководстве и пытался использовать разные версии из 3-й ветки. К счастью, @Tomonori-сан заметил мою ошибку.
Однако следует отметить, что не все начало работать так, как ожидалось, сразу после перехода на более раннюю версию, потому что я столкнулся с проблемой GetBucketLocation, и сразу после нескольких часов отладки расширений aiobotocore и amazon-sagemaker-jupyter-scheduler я наконец понял, что ведро S3 размещаться где-то еще, а не в us-east-1, потому что LocationConstraint таких сегментов имеет значение null, что влияет на логику в amazon_sagemaker_jupyter_scheduler/clients.py
(base) lab4:~$ aws s3api get-bucket-location --bucket sagemaker-automated-execution-xxxxxxxxxxxx-us-east-2
{
"LocationConstraint": "us-east-2"
}
(base) lab4:~$ aws s3api get-bucket-location --bucket sagemaker-automated-execution-xxxxxxxxxxxx-us-east-1
{
"LocationConstraint": null
}
Я только что проследил за сообщением в блоге и смог успешно выполнить задание в блокноте.
Если вы успешно запустите задание, вы увидите следующие файлы в указанной вами корзине S3.
$ aws s3 ls s3://sagemaker-automated-execution-123456789012-us-east-2 --recursive
2024-04-17 17:57:49 9480 notebookjobtestip-notebookjobtest-bf50211d-2024-04-18-00-57-47/input/notebook-job-test.ipynb
2024-04-17 18:00:14 13948 notebookjobtestip-notebookjobtest-bf50211d-2024-04-18-00-57-47/output/output.tar.gz
Делюсь своими входными конфигурациями:
Попробуйте аналогичные конфигурации и проверьте, работает ли они.
Единственное отличие, которое я обнаружил, заключается в том, что я подключил AmazonSageMakerFullAccess только к SagemakerJupyterSchedulerRole. Я не думаю, что это связано с проблемой, с которой вы сталкиваетесь, потому что ваша SagemakerJupyterSchedulerExecutionPolicy разрешает только дополнительные разрешения. AmazonSageMakerFullAccess должен иметь разрешение на чтение и запись в корзины S3, в имени которых содержится ключевое слово «sagemaker».
Чтобы изолировать проблему: если вы загрузите какой-либо файл в корзину S3 из самого ноутбука (с помощью команды aws s3 или boto3), удастся ли это?
Аригато @Tomonori, реальная проблема серьезнее, чем я думал. Не могли бы вы проверить второе обновление и найти файл resources-metadata.json в /opt/ml/metadata: существует он или нет? пустой или нет? Спасибо!
Я добавлю еще один ответ для основной причины
Эта проблема связана с добавленным вручную файлом resources-metadata.json.
Пожалуйста, проверьте ответ в своем предыдущем сообщении, чтобы найти решение, позволяющее избежать ошибки «[Errno 2] Нет такого файла или каталога: '/opt/ml/metadata/resource-metadata.json'», и вы сможете отменить свои хаки. .
Спасибо, что связались со мной в обоих местах :) Я обновил свой ответ со всеми шагами, не могли бы вы пойти со мной и сравнить со своим?