Вопрос или проблема
Я пытаюсь добавить возможность включения/выключения использования спотовых инстансов в существующий конвейер Sagemaker. Для этого мне нужно использовать параметры Estimator
use_spot_instances:boolean | PipelineVariable,
max_wait: int | PipelineVariable | None,
max_run: int | PipelineVariable | None,
Если use_spot_instances
равно True, то max_wait
и max_run
должны быть целыми числами, в противном случае они должны быть None
(иначе вы получите “ClientError: Не удалось вызвать sagemaker:CreateTrainingJob. Подробности об ошибке: Неверное значение MaxWaitTimeInSeconds. Оно поддерживается только когда EnableManagedSpotTraining установлено в true”)
Проблема, с которой я столкнулся, заключается в том, как определить max_wait
и max_run
как PipelineVariable так, чтобы они были либо None, либо int в зависимости от значения use_spot_instances во время выполнения?
Я не знаю, является ли это проблемой интерфейса, но если я объявляю
max_wait = ParameterInteger(
name="MaxWait",
default_value=14400,
)
То, когда я создаю выполнение, используя Sagemaker Studio, требуется предоставить значение для каждого параметра. Похоже, невозможно передать “None”, если только нет способа объявить параметры как необязательные, который я упускаю?
Также, если я пытаюсь начать выполнение из командной строки, я получаю
aws sagemaker start-pipeline-execution \
--pipeline-name model \
--pipeline-execution-display-name executions-20240923-03 \
--pipeline-parameters Name=UseSpotInstances,Value=false Name=MaxRun,Value=None Name=MaxRun,Value=None
Я получаю
Произошла ошибка (ValidationException) при вызове операции StartPipelineExecution: В ходе проверки предоставленных параметров конвейера возникли ошибки. Параметр 'MaxRun' имеет тип 'Integer', но ему было предоставлено несовместимое значение 'None'. Параметр 'MaxRun' имеет тип 'Integer', но ему было предоставлено несовместимое значение 'None'.
Мое главное требование — возможность отключить спотовое обучение при запуске из Sagemaker Studio, так как в последнее время я вообще не мог получить спотовый инстанс. Есть ли способ во время выполнения сделать
max_wait = max_wait if use_spot_instances else None
где значения справа — это параметры, а условие выполняется во время выполнения?
Ответ или решение
Для решения вашей задачи, связанной с условной настройкой параметров в пайплайне SageMaker, нужно использовать условные выражения Python и некоторые конструкции API SageMaker. Ниже я приведу пример, как можно реализовать нужную логику.
Шаг 1: Объявление параметров
В самом начале создадим необходимые параметры пайплайна:
from sagemaker.workflow.parameters import ParameterBoolean, ParameterInteger
# Параметр для использования Spot Instances
use_spot_instances = ParameterBoolean(
name="UseSpotInstances",
default_value=False, # Либо True, либо False в зависимости от ваших требований
)
# Параметры max_wait и max_run
max_wait = ParameterInteger(
name="MaxWait",
default_value=14400, # 4 часа
)
max_run = ParameterInteger(
name="MaxRun",
default_value=3600, # 1 час
)
Шаг 2: Установка параметров в Эстиматоре
Создадим эстиматор, учитывая, что в зависимости от условия использования Spot Instances будут варьироваться параметры max_wait
и max_run
.
from sagemaker.estimator import Estimator
# Создание эстиматора с условной логикой для max_wait и max_run
estimator = Estimator(
# укажите ваши параметры
use_spot_instances=use_spot_instances,
max_wait=max_wait if use_spot_instances else None, # Условие для max_wait
max_run=max_run if use_spot_instances else None, # Условие для max_run
# другие параметры эстиматора
)
Шаг 3: Запуск пайплайна
Запустите пайплайн, передавая параметры, как это описано в вашей задаче. Используйте команды CLI с параметрами. Если вы хотите контролировать параметры из экологической системы, вы можете передать их следующим образом:
aws sagemaker start-pipeline-execution \
--pipeline-name ваш_пайплайн \
--pipeline-execution-display-name ваше_название_выполнения \
--pipeline-parameters Name=UseSpotInstances,Value=true Name=MaxWait,Value=14400 Name=MaxRun,Value=3600
Поскольку SageMaker требует наличия значений для всех параметров, вы не сможете передать None
как значение. Вместо этого следует обрабатывать значения на уровне логики самого эстиматора, как показано выше.
Ручное управление параметрами
Если вы хотите задать более гибкие условия, рассмотрите возможность реализации пользовательской логики в вашем коде, где вы будете определять значения max_wait
и max_run
перед созданием и запуском пайплайна:
if use_spot_instances.resolve() == True:
max_wait_value = max_wait.default_value # Задайте максимальное время ожидания
max_run_value = max_run.default_value # Задайте максимальное время выполнения
else:
max_wait_value = None # Установите None, если Spot Instances не используются
max_run_value = None # Установите None, если Spot Instances не используются
Имейте в виду, что max_wait
и max_run
должны быть именно параметрами типа None
, а не значениями, передаваемыми в самом пайплайне. Это значит, что условия должны быть обработаны до того, как параметры будут переданы в эстиматор.
Заключение
Теперь, когда вы создали необходимые параметры и настраиваем эстиматор с условными значениями, вы сможете динамически управлять использованием Spot Instances в вашем пайплайне SageMaker. Убедитесь, что тестируете ваше решение, чтобы гарантировать, что все условия и зависимости правильно обработаны.