AWS Sagemaker DeepAR Validation Error Дополнительные свойства не разрешены («обучение» было неожиданным)
Я не знаю, в чем проблема. Вот код:
estimator = sagemaker.estimator.Estimator(
image_uri=image_name,
sagemaker_session=sagemaker_session,
role=role,
train_instance_count=1,
train_instance_type="ml.m5.large",
base_job_name="deepar-stock",
output_path=s3_output_path,
)
hyperparameters = {
"time_freq": "24H",
"epochs": "100",
"early_stopping_patience": "10",
"mini_batch_size": "64",
"learning_rate": "5E-4",
"context_length": str(context_length),
"prediction_length": str(prediction_length),
"likelihood": "gaussian",
}
estimator.set_hyperparameters(**hyperparameters)
%%time
estimator.fit(inputs=f"{s3_data_path}/train/")
И когда я пытаюсь обучить модель, я получаю следующую ошибку (полностью).
------------------------------------------------------------------------
---
UnexpectedStatusException Traceback (most recent call last)
<timed eval> in <module>
/opt/conda/lib/python3.7/site-packages/sagemaker/estimator.py in fit(self, inputs, wait, logs, job_name, experiment_config)
681 self.jobs.append(self.latest_training_job)
682 if wait:
--> 683 self.latest_training_job.wait(logs=logs)
684
685 def _compilation_job_name(self):
/opt/conda/lib/python3.7/site-packages/sagemaker/estimator.py in wait(self, logs)
1626 # If logs are requested, call logs_for_jobs.
1627 if logs != "None":
-> 1628 self.sagemaker_session.logs_for_job(self.job_name, wait=True, log_type=logs)
1629 else:
1630 self.sagemaker_session.wait_for_job(self.job_name)
/opt/conda/lib/python3.7/site-packages/sagemaker/session.py in logs_for_job(self, job_name, wait, poll, log_type)
3658
3659 if wait:
-> 3660 self._check_job_status(job_name, description, "TrainingJobStatus")
3661 if dot:
3662 print()
/opt/conda/lib/python3.7/site-packages/sagemaker/session.py in _check_job_status(self, job, desc, status_key_name)
3218 ),
3219 allowed_statuses=["Completed", "Stopped"],
-> 3220 actual_status=status,
3221 )
3222
UnexpectedStatusException: Error for Training job deepar-2021-07-31-22-25-54-110: Failed. Reason: ClientError: Unable to initialize the algorithm. Failed to validate input data configuration. (caused by ValidationError)
Caused by: Additional properties are not allowed ('training' was unexpected)
Failed validating 'additionalProperties' in schema:
{'$schema': 'http://json-schema.org/draft-04/schema#',
'additionalProperties': False,
'anyOf': [{'required': ['train']}, {'required': ['state']}],
'definitions': {'data_channel': {'properties': {'ContentType': {'enum': ['json',
'json.gz',
'parquet',
'auto'],
'type': 'string'},
'RecordWrapperType': {'enum': ['None'],
On instance:
{'training': {'RecordWrapperType': 'None',
'S3DistributionType': 'FullyReplicated',
'TrainingInputMode': 'File'}}
Здесь говорится
'training' was unexpected
. Я не знаю, почему там написано
'training'
на этой последней строке
On instance:
. Я не знаю, как это решить. Я просмотрел другие страницы в поисках помощи, но не могу найти прямого ответа. Я знаю, что мои данные правильно структурированы. Кажется, что ошибки связаны с гиперпараметрами, но я этого точно не знаю. Пожалуйста помоги!
2 ответа
Мне просто нужно было добавить эту строку кода и изменить следующий код, чтобы он выглядел так.
data_channels = {"train": f"{s3_data_path}/train/"}
estimator.fit(inputs=data_channels)
Всем оценщикам AWS требуется словарь для ввода данных. Просто указать путь к файлу не получится. Это связано с тем, что все оценщики AWS (встроенные и пользовательские) используют контейнеры. Каждый раз, когда модель используется, для нее строится новый контейнер. Каждый контейнер имеет свою собственную общую файловую систему каталогов. Путь обучающих данных внутри каждого контейнера обычно выглядит примерно так: opt/ml/data/train. При создании контейнера он ищет данные в форме data = {'train': x, 'test': y}. Вам нужно установить эти ключи и значения, потому что контейнер ищет их, а затем создает каталог, извлекая и копируя данные из data['train'] в общее расположение внутри контейнера, связанное с обучающими данными. Точно так же, если бы вы настроили DeepAR для тестирования, он бы копировал и сохранял данные из data['test'