Вопрос или проблема
В качестве теста я запускаю train_manifest и validation_manifest, которые идентичны и содержат только один файл…
{"source-ref": "s3://<имя_бакета>/bad_ofs/Images_final/Crushing/iO/A_2208040CA2_1430_220804-205516.jpg", "bounding-box": {"annotations": [{"class_id": 0, "top": 750, "left": 7000, "height": 450, "width": 5500}, {"class_id": 0, "top": 3000, "left": 7000, "height": 500, "width": 5500}]}, "bounding-box-metadata": {"objects": [{"confidence": 1.0}, {"confidence": 1.0}], "class-map": {"0": "good"}, "type": "groundtruth/object-detection", "human-annotated": "yes", "creation-date": "2024-11-05T00:00:00", "job-name": "labeling-job/bounding-box"}}
При попытке обучить модель я получаю следующую ошибку…
INFO:sagemaker.image_uris:Одни и те же изображения использованы для обучения и вывода. Устанавливаю область изображения: вывод.
INFO:sagemaker.image_uris:Устанавливаю единственную поддерживаемую версию фреймворка/алгоритма: 1.
INFO:sagemaker.image_uris:Игнорирую ненужный тип экземпляра: None.
INFO:sagemaker:Создание задания на обучение с именем: object-detection-2024-11-06-11-11-07-815
----------------------------------------------
Конфигурация входных данных для обучения: {'DataSource': {'S3DataSource': {'S3DataType': 'AugmentedManifestFile', 'S3Uri': 's3://agilent-aws-tmp-12-data/bad_ofs/Images_final/Crushing/train_manifest.json', 'S3DataDistributionType': 'FullyReplicated', 'AttributeNames': ['source-ref', 'bounding-box']}}, 'ContentType': 'application/x-image', 'InputMode': 'Pipe'}
----------------------------------------------
Конфигурация входных данных для валидации: {'DataSource': {'S3DataSource': {'S3DataType': 'AugmentedManifestFile', 'S3Uri': 's3://agilent-aws-tmp-12-data/bad_ofs/Images_final/Crushing/validation_manifest.json', 'S3DataDistributionType': 'FullyReplicated', 'AttributeNames': ['source-ref', 'bounding-box']}}, 'ContentType': 'application/x-image', 'InputMode': 'Pipe'}
----------------------------------------------
2024-11-06 11:11:10 Запуск - Начало обучения...
2024-11-06 11:11:23 Запуск - Подготовка экземпляров для обучения...
2024-11-06 11:12:08 Загрузка - Загрузка изображения для обучения...............
2024-11-06 11:14:40 Обучение - Загрузка изображения завершена. Обучение в процессе... Docker entrypoint вызван с аргументами: train
Запуск скрипта конфигурации окружения по умолчанию
Устройства Nvidia gpu, драйверы и версии cuda toolkit (доступны только на хостах с GPU):
Ср Ноя 6 11:14:49 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.127.05 Версия драйвера: 550.127.05 Версия CUDA: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| Название GPU Продолжительность-M | Bus-Id Disp.A | Уязвимые некорр. ECC |
| Вентилятор Темп Производительность Потребление:Использование/Макс. | Использование памяти | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 Tesla T4 Вкл | 00000000:00:1E.0 Оф | 0 |
| N/A 23C P8 9W / 70W | 1MiB / 15360MiB | 0% По умолчанию |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Процессы: |
| GPU GI CI PID Тип Название процесса Использование GPU памяти |
| ID ID Использование |
|=========================================================================================|
| Процессов не найдено |
+-----------------------------------------------------------------------------------------+
Проверка совместимости драйвера nvidia и cuda.
Предоставлен драйвер совместимости CUDA.
Продолжаю с проверкой совместимости между драйвером, cuda-toolkit и cuda-compat.
Обнаружена версия cuda-toolkit: 11.1.
Обнаружена версия cuda-compat: 455.32.00.
Обнаружена версия драйвера Nvidia: 550.127.05.
Драйвер Nvidia совместим с cuda-toolkit. Отключение cuda-compat.
Запуск пользовательского скрипта конфигурации окружения
/opt/amazon/lib/python3.8/site-packages/mxnet/model.py:97: SyntaxWarning: "is" с литералом. Вы имели в виду "=="?
if num_device is 1 and 'dist' not in kvstore:
[11/06/2024 11:14:52 INFO 140179896461120] Чтение конфигурации по умолчанию из /opt/amazon/lib/python3.8/site-packages/algorithm/default-input.json: {'base_network': 'vgg-16', 'use_pretrained_model': '0', 'num_classes': '', 'mini_batch_size': '32', 'epochs': '30', 'learning_rate': '0.001', 'lr_scheduler_step': '', 'lr_scheduler_factor': '0.1', 'optimizer': 'sgd', 'momentum': '0.9', 'weight_decay': '0.0005', 'overlap_threshold': '0.5', 'nms_threshold': '0.45', 'num_training_samples': '', 'image_shape': '300', '_tuning_objective_metric': '', '_kvstore': 'device', 'kv_store': 'device', '_num_kv_servers': 'auto', 'label_width': '350', 'freeze_layer_pattern': '', 'nms_topk': '400', 'early_stopping': 'False', 'early_stopping_min_epochs': '10', 'early_stopping_patience': '5', 'early_stopping_tolerance': '0.0', '_begin_epoch': '0'}
[11/06/2024 11:14:52 INFO 140179896461120] Слияние с предоставленной конфигурацией из /opt/ml/input/config/hyperparameters.json: {'base_network': 'resnet-50', 'epochs': '30', 'image_shape': '300', 'learning_rate': '0.001', 'mini_batch_size': '16', 'nms_threshold': '0.45', 'num_classes': '2', 'num_training_samples': '1000', 'optimizer': 'adam', 'overlap_threshold': '0.5', 'use_pretrained_model': '1'}
[11/06/2024 11:14:52 INFO 140179896461120] Финальная конфигурация: {'base_network': 'resnet-50', 'use_pretrained_model': '1', 'num_classes': '2', 'mini_batch_size': '16', 'epochs': '30', 'learning_rate': '0.001', 'lr_scheduler_step': '', 'lr_scheduler_factor': '0.1', 'optimizer': 'adam', 'momentum': '0.9', 'weight_decay': '0.0005', 'overlap_threshold': '0.5', 'nms_threshold': '0.45', 'num_training_samples': '1000', 'image_shape': '300', '_tuning_objective_metric': '', '_kvstore': 'device', 'kv_store': 'device', '_num_kv_servers': 'auto', 'label_width': '350', 'freeze_layer_pattern': '', 'nms_topk': '400', 'early_stopping': 'False', 'early_stopping_min_epochs': '10', 'early_stopping_patience': '5', 'early_stopping_tolerance': '0.0', '_begin_epoch': '0'}
Процесс 13 является рабочим.
[11/06/2024 11:14:52 INFO 140179896461120] Использую worker по умолчанию.
[11/06/2024 11:14:52 INFO 140179896461120] Загружен создатель итератора application/x-image для типа контента ('application/x-image', '1.0')
[11/06/2024 11:14:52 INFO 140179896461120] Загружен создатель итератора application/x-recordio для типа контента ('application/x-recordio', '1.0')
[11/06/2024 11:14:52 INFO 140179896461120] Загружен создатель итератора image/jpeg для типа контента ('image/jpeg', '1.0')
[11/06/2024 11:14:52 INFO 140179896461120] Загружен создатель итератора image/png для типа контента ('image/png', '1.0')
[11/06/2024 11:14:52 INFO 140179896461120] Загрузка и сохранение контрольных точек отключены.
[11/06/2024 11:14:52 INFO 140179896461120] Канал 'train' находится в режиме ввода pipe под /opt/ml/input/data/train.
[11/06/2024 11:14:52 INFO 140179896461120] Канал 'train' находится в режиме ввода pipe под /opt/ml/input/data/train.
[11/06/2024 11:14:52 ERROR 140179896461120] Ошибка клиента: канал train не указан.
2024-11-06 11:15:04 Загрузка - Загрузка сгенерированной модели обучения
2024-11-06 11:15:04 Не удалось - Задание на обучение не выполнено
---------------------------------------------------------------------------
UnexpectedStatusException Traceback (most recent call last)
Cell In[118], line 70
54 od_model.set_hyperparameters(
55 base_network="resnet-50",
56 use_pretrained_model=1,
(...)
65 num_training_samples=1000
66 )
68 # Запуск задания на обучение с каналами train и validation
69 # od_model.fit({"train": train_input, "validation": validation_input})
---> 70 od_model.fit({"train": train_input, "validation": validation_input})
File ~/anaconda3/envs/tensorflow2_p310/lib/python3.10/site-packages/sagemaker/workflow/pipeline_context.py:346, in runnable_by_pipeline.<locals>.wrapper(*args, **kwargs)
342 return context
344 return _StepArguments(retrieve_caller_name(self_instance), run_func, *args, **kwargs)
--> 346 return run_func(*args, **kwargs)
File ~/anaconda3/envs/tensorflow2_p310/lib/python3.10/site-packages/sagemaker/estimator.py:1376, in EstimatorBase.fit(self, inputs, wait, logs, job_name, experiment_config)
1374 forward_to_mlflow_tracking_server = True
1375 if wait:
-> 1376 self.latest_training_job.wait(logs=logs)
1377 if forward_to_mlflow_tracking_server:
1378 log_sagemaker_job_to_mlflow(self.latest_training_job.name)
File ~/anaconda3/envs/tensorflow2_p310/lib/python3.10/site-packages/sagemaker/estimator.py:2750, in _TrainingJob.wait(self, logs)
2748 # Если запрашиваются логи, вызовите logs_for_jobs.
2749 if logs != "None":
-> 2750 self.sagemaker_session.logs_for_job(self.job_name, wait=True, log_type=logs)
2751 else:
2752 self.sagemaker_session.wait_for_job(self.job_name)
File ~/anaconda3/envs/tensorflow2_p310/lib/python3.10/site-packages/sagemaker/session.py:5945, in Session.logs_for_job(self, job_name, wait, poll, log_type, timeout)
5924 def logs_for_job(self, job_name, wait=False, poll=10, log_type="All", timeout=None):
5925 """Отображение логов для данного задания на обучение, с возможностью их подгрузки до завершения задания.
5926
5927 Если вывод является tty или ячейкой Jupyter, он будет цветным
(...)
5943 exceptions.UnexpectedStatusException: Если будет ожидание и задание на обучение завершится неудачно.
5944 """
-> 5945 _logs_for_job(self, job_name, wait, poll, log_type, timeout)
File ~/anaconda3/envs/tensorflow2_p310/lib/python3.10/site-packages/sagemaker/session.py:8547, in _logs_for_job(sagemaker_session, job_name, wait, poll, log_type, timeout)
8544 last_profiler_rule_statuses = profiler_rule_statuses
8546 if wait:
-> 8547 _check_job_status(job_name, description, "TrainingJobStatus")
8548 if dot:
8549 print()
File ~/anaconda3/envs/tensorflow2_p310/lib/python3.10/site-packages/sagemaker/session.py:8611, in _check_job_status(job, desc, status_key_name)
8605 if "CapacityError" in str(reason):
8606 raise exceptions.CapacityError(
8607 message=message,
8608 allowed_statuses=["Completed", "Stopped"],
8609 фактический статус=status,
8610 )
-> 8611 raise exceptions.UnexpectedStatusException(
8612 message=message,
8613 allowed_statuses=["Completed", "Stopped"],
8614 фактический статус=status,
8615 )
UnexpectedStatusException: Ошибка для задания на обучение object-detection-2024-11-06-11-11-07-815: Не удалось. Причина: ClientError: канал train не указан., код выхода: 2. Проверьте руководство по устранению неполадок для общих ошибок: https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-python-sdk-troubleshooting.html
Код выглядит следующим образом:
import boto3
import sagemaker
from sagemaker import get_execution_role
from sagemaker.inputs import TrainingInput
from sagemaker.image_uris import retrieve
# Инициализация сессии и роли
sagemaker_session = sagemaker.Session()
role = get_execution_role()
# Укажите имя бакета S3 и путь к файлу манифеста
bucket_name = "<имя_бакета>"
train_manifest_s3_key = "bad_ofs/Images_final/Crushing/train_manifest.json"
validation_manifest_s3_key = "bad_ofs/Images_final/Crushing/validation_manifest.json"
# Определите TrainingInput для обучающих и валидирующих данных
train_input = TrainingInput(
s3_data=f"s3://{bucket_name}/{train_manifest_s3_key}",
content_type="application/x-image",
s3_data_type="AugmentedManifestFile",
attribute_names=["source-ref", "bounding-box"],
input_mode="Pipe"
)
validation_input = TrainingInput(
s3_data=f"s3://{bucket_name}/{validation_manifest_s3_key}",
content_type="application/x-image",
s3_data_type="AugmentedManifestFile",
attribute_names=["source-ref", "bounding-box"],
input_mode="Pipe"
)
print('----------------------------------------------')
print("Конфигурация входных данных для обучения:", train_input.config)
print('----------------------------------------------')
print("Конфигурация входных данных для валидации:", validation_input.config)
print('----------------------------------------------')
# Получите контейнер Docker для обнаружения объектов
container = retrieve("object-detection", sagemaker_session.boto_region_name)
# Определите эстиматор для SageMaker
od_model = sagemaker.estimator.Estimator(
контейнер,
роль,
количество_экземпляров=1,
тип_экземпляра="ml.g4dn.xlarge",
объем_хранилища=50,
максимальное_время_выполнения=3600,
выходной_путь=f"s3://{bucket_name}/output",
sagemaker_session=sagemaker_session
)
# Установите гиперпараметры для обнаружения объектов
od_model.set_hyperparameters(
базовая_сеть="resnet-50",
использовать_предобученную_модель=1,
количество_классов=2,
размер_мини_пакета=16,
эпохи=30,
скорость_обучения=0.001,
оптимизатор="adam",
порог_перекрытия=0.5,
порог_nms=0.45,
форма_изображения=300,
количество_обучающих_образцов=1000
)
# Начните задание на обучение с каналами train и validation
# od_model.fit({"train": train_input, "validation": validation_input})
od_model.fit({"train": train_input, "validation": validation_input})
Ответ или решение
Ошибка клиента AWS Sagemaker: не указан канал train (Ошибка файла манифеста)
Когда вы работаете с AWS Sagemaker для обучения моделей, важно убедиться, что все параметры конфигурации и входные данные корректно настроены. Сообщение об ошибке "train channel is not specified" связано с тем, что Sagemaker не может найти необходимые данные для всех указанных каналов ввода во время обучения модели. Рассмотрим основные аспекты, связанные с этой ошибкой, и предложим возможные решения.
Что происходит?
На основе вашего описания, вы используете AugmentedManifestFile
для обработки данных. Однако возникает ошибка, указывающая на то, что Sagemaker не может распознать канал train. Это может происходить по нескольким причинам:
-
Неверное форматирование манифеста: Проверить структуру вашего файла манифеста. Он должен соответствовать требованиям Sagemaker, чтобы правильно воспринимать источники данных и аннотации.
-
Ошибки в конфигурации DataInput: Убедитесь, что при создании объекта
TrainingInput
вы указали все необходимые параметры. -
Проблемы с именами каналов: Убедитесь, что ключи в словаре
fit()
совпадают с именами каналов, которые ожидает Sagemaker. Если вы пытаетесь использовать другой вид данных, ошибка может появиться из-за неправильного назначения данных.
Анализ предоставленного кода
В вашем коде вы создали два объекта TrainingInput
для обучения и валидации:
train_input = TrainingInput(
s3_data=f"s3://{bucket_name}/{train_manifest_s3_key}",
content_type="application/x-image",
s3_data_type="AugmentedManifestFile",
attribute_names=["source-ref", "bounding-box"],
input_mode="Pipe"
)
validation_input = TrainingInput(
s3_data=f"s3://{bucket_name}/{validation_manifest_s3_key}",
content_type="application/x-image",
s3_data_type="AugmentedManifestFile",
attribute_names=["source-ref", "bounding-box"],
input_mode="Pipe"
)
Важный момент здесь – правильно ли вы указали s3_data_type
. Убедитесь, что ваша версия AWS SDK для Python (boto3 и sagemaker) обновлена, так как это может также повлиять на поведение функций.
Рекомендации по исправлению ошибки
-
Проверка файла манифеста: Убедитесь, что ваш JSON-файл корректен и отсутствуют ошибки в его структуре. Каждый объект в JSON должен быть правильно сформирован, как указано в документации AWS.
-
Тестирование Слояоватие манифеста: Если вы сталкиваетесь с ошибкой, попробуйте протестировать другой, более простой файл манифеста, чтобы уточнить, не является ли проблема в текущем формате.
-
Проверка конфигурации: Убедитесь, что вы определили
fit()
с правильными ключами:od_model.fit({"train": train_input, "validation": validation_input})
Проверьте, что названия каналов (‘train’ и ‘validation’) действительно совпадают с ожидаемыми Sagemaker.
-
Логи Sagemaker: Просмотр логов может дать больше информации о том, почему произошла ошибка. Вы можете использовать консоль AWS, чтобы увидеть, что именно происходит во время выполнения задачи.
-
Обновление пакетов: Убедитесь, что используете последнюю версию библиотек SDK:
pip install --upgrade boto3 sagemaker
Заключение
Ошибки при настройке моделирования на платформе AWS Sagemaker могут быть непредсказуемыми и требовать внимательного анализа различных этапов разработки. Следуя приведенным рекомендациям, вы сможете выявить корень проблемы и корректно настроить каналы ввода. Для более детальной информации всегда обращайтесь к документации AWS, где представлены все последние обновления и советы.