Как пишет AWS Machine Learning, обновление конфигурации реального времени Amazon SageMaker AI (изменение типа экземпляра, количества экземпляров или переменных окружения) приводит к сбоям развертываний через AWS CloudFormation или AWS Cloud Development Kit (AWS CDK). SageMaker AI требует от вас отмены регистрации масштабируемой цели перед обновлением конечной точки, однако при отмене регистрации CloudFormation не может отслеживать ресурсы AWS Application Auto Scaling. В этой статье показано, как использовать многоразовый конструктив CDK с пользовательскими ресурсами CloudFormation для автоматизации процесса отмены регистрации и регистрации автоматического масштабирования во время обновления конечной точки. Вы можете обновить конфигурацию конечной точки и параметры автоматического масштабирования в одном развертывании без ручного вмешательства. Проблема возникает, когда вы развертываете конечную точку SageMaker AI с ресурсами автоматического масштабирования, зарегистрированными в CloudFormation, а затем изменяете конфигурацию конечной точки и повторно развертываете. В зависимости от того, что вы изменяете, могут возникнуть различные сбои. Изменение конфигурации конечной точки с зарегистрированным автоматическим масштабированием приводит к тому, что CloudFormation пытается обновить конечную точку, в то время как масштабируемая цель все еще зарегистрирована. SageMaker AI отклоняет обновление с ошибкой: «Варианты [AllTraffic] должны быть отменены как масштабируемые цели с Application Auto Scaling, прежде чем их можно будет удалить или обновить тип экземпляра». SageMaker AI блокирует обновление конечной точки до того, как CloudFormation достигнет ресурсов автоматического масштабирования. Если вы вручную отмените регистрацию автоматического масштабирования, а затем измените только конфигурацию конечной точки, развертывание пройдет успешно. Однако CloudFormation не зарегистрирует автоматическое масштабирование, даже если оно указано в шаблоне CloudFormation. Поскольку параметры автоматического масштабирования в шаблоне CloudFormation не изменились, CloudFormation не зарегистрирует масштабируемую цель или не повторно применит политику масштабирования. Конечная точка теперь работает без автоматического масштабирования, и нет ошибок, указывающих на то, что что-то пошло не так. Если вы отмените регистрацию масштабируемой цели через интерфейс командной строки AWS (AWS CLI) и повторно развернете с изменениями параметров автоматического масштабирования, CloudFormation попытается обновить ресурс ScalableTarget, который больше не существует: ресурс типа 'AWS::ApplicationAutoScaling::ScalableTarget' с идентификатором 'endpoint//variant/AllTraffic|sagemaker:variant:DesiredInstanceCount|sagemaker' не найден. Этот сбой примечателен тем, что откат также не удается (UPDATE_ROLLBACK_FAILED), оставляя стек в поврежденном состоянии, требующем ручного вмешательства в консоли CloudFormation для восстановления. Вы можете использовать этот конструктив CDK, чтобы заменить родные ресурсы CloudFormation AWS::ApplicationAutoScaling::ScalableTarget и AWS::ApplicationAutoScaling::ScalingPolicy тремя пользовательскими ресурсами. Эти пользовательские ресурсы автоматически отменяют регистрацию и регистрируют автоматическое масштабирование вокруг обновления конечной точки с явным порядком зависимостей, обеспечиваемым вызовами node.add_dependency в CDK. Полная последовательность включает: отмену регистрации (пользовательский ресурс): удаляет масштабируемую цель перед началом обновления конечной точки. При первом развертывании масштабируемая цель еще не существует, поэтому обработчик обрабатывает ошибку корректно и продолжает. Обновление конечной точки (управляемое CDK): CDK обновляет ресурс конечной точки в обычном режиме, переключаясь на новую конфигурацию конечной точки. Регистрация масштабируемой цели (пользовательский ресурс): ждет, пока конечная точка достигнет статуса InService, а затем регистрирует масштабируемую цель. Применение политики масштабирования (пользовательский ресурс): ждет, пока масштабируемая цель станет доступной для запросов, затем применяет политику отслеживания цели. Каждый пользовательский ресурс имеет обработчик on_event, который возвращает результат немедленно, и обработчик is_complete. Ожидание провайдера повторно вызывает обработчик is_complete через определенные интервалы (каждые 30 секунд), пока не пройдет проверка готовности. Общий тайм-аут провайдера (1 час для регистрации масштабируемой цели, 15 минут для применения политики масштабирования) ограничивает ожидание, поэтому оно не зависит от тайм-аута любого отдельного вызова Lambda. Свойство ConfigHash на каждом пользовательском ресурсе заставляет CloudFormation повторно вызывать функции Lambda всякий раз, когда изменяется значение конфигурации. Конфигурация конечной точки и параметры автоматического масштабирования определяются вместе, потому что единственный ConfigHash управляет оркестрацией автоматического масштабирования. Хотя конструктив определяет три пользовательских ресурса, развернутый стек содержит более трех функций Lambda. Каждый пользовательский ресурс поддерживается провайдером cr.Provider CDK, и фреймворк провайдера генерирует свои собственные вспомогательные функции Lambda. Синхронный провайдер (Deregister) добавляет одну функцию фреймворка. Асинхронный провайдер (Register Scalable Target и Attach Scaling Policy) добавляет три (onEvent, isComplete и onTimeout), плюс машина состояний AWS Step Functions, которая управляет ожиданием. В результате развернутый стек содержит три пользовательских ресурса, две машины состояний Step Functions и двенадцать функций Lambda. Пять из ресурсов содержат собственный код обработчика конструктивов (один для Deregister и пара on_event и is_complete для каждого асинхронного ресурса), остальные семь сгенерированы фреймворком провайдера. Вы не пишете или не поддерживаете функции, сгенерированные фреймворком, но они присутствуют в стеке и стоит учитывать их при просмотре развернутых ресурсов. В этом пошаговом руководстве вы развернете конечную точку SageMaker AI с автоматическим масштабированием, используя предоставленный пример стека, а затем убедитесь, что обновления конфигурации работают правильно. Пошаговое руководство включает следующие шаги: клонирование репозитория и установка зависимостей, настройка вашей конечной точки и параметров автоматического масштабирования, развертывание и проверка, тестирование обновления. Исходный код доступен в связанном репозитории GitHub. Для этого пошагового руководства вам потребуется следующее: учетная запись AWS с правами на Amazon SageMaker AI, AWS Lambda, AWS Identity and Access Management (IAM), Application Auto Scaling и Amazon CloudWatch; установленный AWS CDK v2; Python 3.12 или новее; uv для управления зависимостями Python; артефакт модели SageMaker AI в Amazon Simple Storage Service (Amazon S3) и образ контейнера в Amazon Elastic Container Registry (Amazon ECR), или встроенный контейнер алгоритма SageMaker AI. Клонируйте репозиторий: git clone https://github.com/aws-samples/sample-sagemaker-endpoint-autoscaling.git cd sample-sagemaker-endpoint-autoscaling. Установите зависимости: uv sync. Конфигурация вашей конечной точки и параметров автоматического масштабирования определяются вместе в config/config.yaml, потому что единственный config_hash управляет оркестрацией автоматического масштабирования. Изменение любой из секций запускает полную последовательность. Отредактируйте config/config.yaml с вашими значениями: endpoint: endpoint_name: "my-model-endpoint" image: "123456789012.dkr.ecr.us-east-1.amazonaws.com/my-model:latest" model_data_url: "s3://my-bucket/models/model.tar.gz" instance_type: "ml.m5.large" initial_instance_count: 1 environment: {} autoscaling: min_capacity: 1 max_capacity: 10 target_value: 100 scale_in_cooldown: 600 scale_out_cooldown: 120. Параметры конечной точки сопоставляются с API SageMaker AI CreateModel и CreateEndpointConfig. Параметры автоматического масштабирования сопоставляются с API Application Auto Scaling RegisterScalableTarget и PutScalingPolicy. Подготовьте свою среду AWS, если вы еще этого не сделали: uv run cdk bootstrap. Разверните стек: uv run cdk deploy InferenceStack. CloudFormation создает модель SageMaker AI, конфигурацию конечной точки и конечную точку, а затем выполняет три пользовательских ресурса последовательно, чтобы зарегистрировать автоматическое масштабирование. Убедитесь, что развертывание зарегистрировало масштабируемую цель: aws application-autoscaling describe-scalable-targets --service-namespace sagemaker --resource-ids endpoint/my-model-endpoint/variant/AllTraffic. Убедитесь, что развертывание применило политику масштабирования: aws application-autoscaling describe-scaling-policies --service-namespace sagemaker --resource-id endpoint/my-model-endpoint/variant/AllTraffic. Измените значение в config/config.yaml, например, обновите тип экземпляра с ml.m5.large до ml.m5.xlarge, и повторно разверните: uv run cdk deploy InferenceStack. После завершения развертывания убедитесь, что автоматическое масштабирование все еще зарегистрировано и имеет обновленные значения: aws application-autoscaling describe-scalable-targets --service-namespace sagemaker --resource-ids endpoint/my-model-endpoint/variant/AllTraffic. Используйте пример стека, если вы начинаете с нуля или хотите ссылочную реализацию. Используйте конструктив напрямую, если у вас уже есть стек CDK с ресурсами SageMaker AI. Чтобы интегрировать с существующим стеком, скопируйте каталог sagemaker_autoscaling/constructs/ в ваш проект и добавьте конструктив рядом с вашими ресурсами конечной точки. Как работает конструктив: пользовательский ресурс Deregister вызывает deregister_scalable_target перед обновлением конечной точки. Он обрабатывает ObjectNotFoundException для первых развертываний, когда масштабируемая цель еще не существует. Зависимость устанавливается в CDK: props.endpoint.node.add_dependency(deregister). Хотя CloudFormation рассматривает ресурс конечной точки как завершенный, как только обновление принимается, масштабируемая цель может быть зарегистрирована только после того, как конечная точка достигнет InService. Вместо того, чтобы блокировать одно выполнение Lambda на этом ожидании, Register Scalable Target использует асинхронный шаблон завершения провайдера. Обработчик on_event возвращает результат немедленно, а ожидатель провайдера повторно вызывает обработчик is_complete на интервале запроса, пока конечная точка не будет InService. Общий тайм-аут провайдера (1 час) ограничивает ожидание, а не тайм-аут любого отдельного выполнения Lambda. При удалении стека обработчик on_event отменяет регистрацию масштабируемой цели для очистки. Существует краткий промежуток времени после того, как RegisterScalableTarget возвращает результат, когда цель еще не доступна для запросов. Attach Scaling Policy использует тот же асинхронный шаблон завершения: обработчик on_event возвращает результат немедленно, а обработчик is_complete сообщает о завершении только после того, как масштабируемая цель станет доступной для запросов, в этот момент он применяет политику. Общий тайм-аут провайдера (15 минут) ограничивает ожидание. Чтобы избежать будущих расходов, удалите ресурсы: uv run cdk destroy InferenceStack. Это удаляет конечную точку SageMaker AI, конфигурацию конечной точки, модель, функции Lambda, роли IAM, сигналы Amazon CloudWatch, созданные политикой отслеживания цели, и отменяет регистрацию масштабируемой цели. В этой статье мы показали, как использовать многоразовый конструктив CDK для автоматической отмены регистрации и регистрации автоматического масштабирования, чтобы организовать обновления конечной точки SageMaker AI. Конструктив использует три пользовательских ресурса CloudFormation с явным порядком зависимостей и свойством ConfigHash, чтобы сохранить автоматическое масштабирование в целостности при развертываниях. Чтобы начать, клонируйте репозиторий sample-sagemaker-endpoint-autoscaling и следуйте инструкциям по настройке. Репозиторий включает пример стека, который вы можете развернуть напрямую, или вы можете интегрировать конструктив в свой существующий стек CDK. Материал подготовлен нейросетью на основе оригинальной публикации. ИИ может ошибаться в деталях (цифры, имена, даты, цитаты) — для важной информации сверяйтесь с первоисточником.