cloud · temario
6.2tema 2 de 4

Amazon SageMaker

Entrenar y desplegar modelos de ML en la nube: training jobs, endpoints y batch transform.

SageMaker es la plataforma MLOps de AWS: un conjunto de servicios integrados para entrenar, evaluar y servir modelos de machine learning. En lugar de gestionar servidores manualmente, defines un Training Job especificando el script de entrenamiento, el tipo de instancia y la ubicación de los datos en S3. SageMaker lanza la instancia, ejecuta el entrenamiento y la termina automáticamente al finalizar. Solo pagas el tiempo de cómputo real.

El flujo estándar de SageMaker tiene tres etapas: (1) preparar los datos en S3, (2) lanzar un Training Job que lee de S3 y escribe el modelo resultante de vuelta a S3, y (3) desplegar el modelo como un Endpoint para inferencia en tiempo real o como un Batch Transform Job para procesar datasets completos de forma asíncrona. Cada etapa usa tipos de instancias distintos, optimizados para su carga de trabajo.

Los Training Jobs se configuran con un Estimator: el objeto central de boto3/SageMaker SDK que encapsula el script, las dependencias, el tipo de instancia y los hiperparámetros. Para modelos de deep learning, SageMaker ofrece contenedores preconfigurados para PyTorch, TensorFlow y HuggingFace, lo que evita gestionar dependencias manualmente. También puedes traer tu propio contenedor Docker si necesitas control total.

Los Endpoints son el mecanismo de SageMaker para inferencia en tiempo real. Una vez entrenado el modelo, lo despliegas en un Endpoint que expone una API HTTP. El tipo de instancia del Endpoint determina el costo por hora y la latencia. Para modelos de LLM grandes, instancias como ml.g5.2xlarge o ml.p4d.24xlarge son habituales. El error más frecuente es elegir una instancia demasiado pequeña para el tamaño del modelo y provocar un error de OOM (out of memory) en el despliegue.

Batch Transform es la alternativa al Endpoint para casos donde no necesitas inferencia en tiempo real sino procesar un dataset completo. En lugar de mantener un servidor activo 24/7, Batch Transform lanza instancias, procesa los datos de S3 y los termina. Es significativamente más barato para workloads batch: clasificar millones de textos, generar embeddings de un corpus, o predecir sobre un dataset de predicción mensual.

SageMaker Experiments y Model Registry son las capas de gobernanza: Experiments registra automáticamente métricas, parámetros e hiperparámetros de cada training job (comparables a MLflow); Model Registry almacena versiones aprobadas de modelos listos para producción. Usar estas herramientas desde el inicio evita el problema de 'no sé qué hiperparámetros usé en el modelo que está en producción'.

structure.txt
# Install SageMaker SDK
pip install sagemaker boto3

# Training Job with HuggingFace container
import sagemaker
from sagemaker.huggingface import HuggingFace

estimator = HuggingFace(
    entry_point='train.py',
    source_dir='./src',
    role='arn:aws:iam::123456789:role/SageMakerRole',
    instance_type='ml.p3.2xlarge',
    instance_count=1,
    transformers_version='4.36',
    pytorch_version='2.1',
    py_version='py310',
    hyperparameters={'epochs': 3, 'learning_rate': 2e-5},
)

estimator.fit({'train': 's3://my-bucket/data/train'})

# Deploy as a real-time endpoint
predictor = estimator.deploy(
    initial_instance_count=1,
    instance_type='ml.g5.2xlarge',
    endpoint_name='my-model-endpoint',
)

# Call the endpoint
response = predictor.predict({'inputs': 'Classify this text'})

# Batch Transform for offline inference
from sagemaker.transformer import Transformer

transformer = estimator.transformer(
    instance_count=1,
    instance_type='ml.m5.xlarge',
    output_path='s3://my-bucket/batch-output/',
)
transformer.transform(
    data='s3://my-bucket/batch-input/',
    content_type='application/json',
    split_type='Line',
)

# Delete endpoint when done (avoid charges)
predictor.delete_endpoint()

Debugging lab

Detecta y corrige el error en el código.

0/5 tests passing0%
  1. 6.2.5.1

    estimator = HuggingFace( entry_point='train.py', instance_type='ml.t2.micro', transformers_version='4.36', pytorch_version='2.1', )

  2. 6.2.5.2

    predictor = estimator.deploy( initial_instance_count=1, instance_type='ml.t3.medium', endpoint_name='llm-endpoint', )

  3. 6.2.5.3

    estimator.fit({'train': 's3://my-bucket/data/train'}) # Deployment done. Training job artifacts are temporary.

  4. 6.2.5.4

    transformer = estimator.transformer( instance_count=1, instance_type='ml.p4d.24xlarge', output_path='s3://my-bucket/batch-output/', )

  5. 6.2.5.5

    predictor = estimator.deploy(instance_type='ml.g5.2xlarge') response = predictor.predict({'inputs': 'test'}) # Done with testing