Acelere su ciclo de vida de ML con el nuevo y mejorado SDK de Python para Amazon SageMaker – Parte 2: ModelBuilder

Como
Gustó

Fecha:

In Parte 1 De esta serie, presentamos la nueva clase ModelTrainer en el Amazon SageMaker SDK de Python y sus beneficios, y le mostramos cómo ajustar un modelo Meta Llama 3.1 8B en un conjunto de datos personalizado. En esta publicación, analizamos las mejoras del SDK de Python. Constructor de modelos clase, que le permite implementar sin problemas un modelo desde ModelTrainer a un punto final de SageMaker y proporciona una única interfaz para múltiples configuraciones de implementación.

En noviembre de 2023, lanzamos la clase ModelBuilder (ver Empaquete e implemente modelos más rápido con nuevas herramientas y flujos de trabajo guiados en Amazon SageMaker y Empaquete e implemente fácilmente ML y LLM clásicos con Amazon SageMaker, parte 1: mejoras de PySDK), lo que redujo la complejidad de la configuración inicial para crear un punto final de SageMaker, como crear una configuración de punto final, elegir el contenedor, serialización y deserialización, entre otros, y lo ayuda a crear un modelo implementable en un solo paso. La actualización reciente mejora la usabilidad de la clase ModelBuilder para una amplia gama de casos de uso, particularmente en el campo de rápida evolución de la IA generativa. En esta publicación, profundizamos en las mejoras realizadas en la clase ModelBuilder y le mostramos cómo implementar sin problemas el modelo ajustado desde Parte 1 a un punto final de SageMaker.

Mejoras en la clase ModelBuilder

Hemos realizado las siguientes mejoras de usabilidad en la clase ModelBuilder:

  • Transición fluida del entrenamiento a la inferencia – ModelBuilder ahora se integra directamente con las interfaces de entrenamiento de SageMaker para garantizar que se calcule automáticamente la ruta de archivo correcta al último artefacto del modelo entrenado, lo que simplifica el flujo de trabajo desde el entrenamiento del modelo hasta la implementación.
  • Interfaz de inferencia unificada – Anteriormente, el SDK de SageMaker ofrecía interfaces y flujos de trabajo independientes para distintos tipos de inferencia, como inferencia en tiempo real, por lotes, sin servidor y asincrónica. Para simplificar el proceso de implementación del modelo y brindar una experiencia uniforme, hemos mejorado ModelBuilder para que funcione como una interfaz unificada que admita varios tipos de inferencia.
  • Facilidad de desarrollo, prueba y entrega de producción. – Estamos agregando soporte para pruebas en modo local con ModelBuilder para que los usuarios puedan depurar y probar sin esfuerzo sus scripts de procesamiento e inferencia con pruebas locales más rápidas sin incluir un contenedor, y una nueva función que genera la última imagen del contenedor para un marco determinado para que no tenga que actualizar el código cada vez que salga una nueva versión de LMI.
  • Preprocesamiento y posprocesamiento de inferencia personalizables – ModelBuilder ahora le permite personalizar los pasos de preprocesamiento y posprocesamiento para la inferencia. Al habilitar scripts para filtrar contenido y eliminar información de identificación personal (PII), esta integración agiliza el proceso de implementación, encapsulando los pasos necesarios dentro de la configuración del modelo para una mejor administración e implementación de modelos con requisitos de inferencia específicos.
  • Soporte de evaluación comparativa – La nueva compatibilidad con benchmarking en ModelBuilder le permite evaluar las opciones de implementación (como puntos finales y contenedores) en función de métricas de rendimiento clave, como latencia y costo. Con la introducción de una API de benchmarking, puede probar escenarios y tomar decisiones informadas, optimizando sus modelos para obtener el máximo rendimiento antes de la producción. Esto mejora la eficiencia y proporciona implementaciones rentables.

En las siguientes secciones, analizamos estas mejoras con más detalle y demostramos cómo personalizar, probar e implementar su modelo.

Implementación sin inconvenientes desde la clase ModelTrainer

ModelBuilder se integra perfectamente con el Entrenador de modelos clase; puede simplemente pasar el objeto ModelTrainer que se utilizó para entrenar el modelo directamente a ModelBuilder en el parámetro del modelo. Además de ModelTrainer, ModelBuilder también admite la clase Estimator y el resultado de SageMaker Core TrainingJob.create() función y analiza automáticamente los artefactos del modelo para crear un objeto de modelo de SageMaker. Con el encadenamiento de recursos, puede crear e implementar el modelo como se muestra en el siguiente ejemplo. Si siguió Parte 1 de esta serie para afinar un modelo Meta Llama 3.1 8B, puedes pasar el model_trainer objetar de la siguiente manera:

# set container URI
image_uri = "763104351884.dkr.ecr.us-west-2.amazonaws.com/huggingface-pytorch-tgi-inference:2.3.0-tgi2.2.0-gpu-py310-cu121-ubuntu22.04-v2.0"

model_builder = ModelBuilder(
    model=model_trainer,  # ModelTrainer object passed onto ModelBuilder directly
    role_arn=role,
    image_uri=image_uri,
    inference_spec=inf_spec,
    instance_type="ml.g5.2xlarge"
)
# deploy the model
model_builder.build().deploy()

Personalice el modelo utilizando InferenceSpec

El InferenceSpec La clase le permite personalizar el modelo al proporcionar una lógica personalizada para cargar e invocar el modelo, y especificar cualquier lógica de preprocesamiento o posprocesamiento según sea necesario. Para los puntos finales de SageMaker, los scripts de preprocesamiento y posprocesamiento se utilizan a menudo como parte de la canalización de inferencia para manejar las tareas que se requieren antes y después de que los datos se envíen al modelo para realizar predicciones, especialmente en el caso de flujos de trabajo complejos o modelos no estándar. El siguiente ejemplo muestra cómo puede especificar la lógica personalizada mediante InferenceSpec:

from sagemaker.serve.spec.inference_spec import InferenceSpec

class CustomerInferenceSpec(InferenceSpec):
    def load(self, model_dir):
        from transformers import AutoModel
        return AutoModel.from_pretrained(HF_TEI_MODEL, trust_remote_code=True)

    def invoke(self, x, model):
        return model.encode(x)

    def preprocess(self, input_data):
        return json.loads(input_data)["inputs"]

    def postprocess(self, predictions):
        assert predictions is not None
        return predictions

Prueba usando modo local y en proceso

Implementar un modelo entrenado en un punto final de SageMaker implica crear un modelo de SageMaker y configurar el punto final. Esto incluye el script de inferencia, cualquier serialización o deserialización requerida, la ubicación del artefacto del modelo en Servicio de almacenamiento simple de Amazon (Amazon S3), la URI de la imagen del contenedor, el tipo y la cantidad de instancias correctas, y más. Los profesionales del aprendizaje automático (ML) deben iterar sobre estas configuraciones antes de implementar finalmente el punto final en SageMaker para la inferencia. ModelBuilder ofrece dos modos para la creación rápida de prototipos:

  • En modo proceso – En este caso, las inferencias se realizan directamente dentro del mismo proceso de inferencia. Esto es muy útil para probar rápidamente la lógica de inferencia proporcionada a través de InferenceSpec y proporciona retroalimentación inmediata durante la experimentación.
  • Modo local – El modelo se implementa y se ejecuta como un contenedor local. Esto se logra configurando el modo en LOCAL_CONTAINER cuando crea el modelo. Esto resulta útil para imitar el mismo entorno que el punto de conexión de SageMaker. Consulte lo siguiente cuaderno para un ejemplo.

El siguiente código es un ejemplo de ejecución de inferencia en modo de proceso, con un InferenceSpec:

from sagemaker.serve.spec.inference_spec import InferenceSpec
from transformers import pipeline
from sagemaker.serve import Mode
from sagemaker.serve.builder.schema_builder import SchemaBuilder
from sagemaker.serve.builder.model_builder import ModelBuilder

value: str = "Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe.nDaniel: Hello, Girafatron!nGirafatron:"
schema = SchemaBuilder(value,
            {"generated_text": "Girafatron is obsessed with giraffes, the most glorious animal on the face of this Earth. Giraftron believes all other animals are irrelevant when compared to the glorious majesty of the giraffe.nDaniel: Hello, Girafatron!nGirafatron: Hi, Daniel. I was just thinking about how magnificent giraffes are and how they should be worshiped by all.nDaniel: You and I think alike, Girafatron. I think all animals should be worshipped! But I guess that could be a bit impractical...nGirafatron: That's true. But the giraffe is just such an amazing creature and should always be respected!nDaniel: Yes! And the way you go on about giraffes, I could tell you really love them.nGirafatron: I'm obsessed with them, and I'm glad to hear you noticed!nDaniel: I'"})

# custom inference spec with hugging face pipeline
class MyInferenceSpec(InferenceSpec):
    def load(self, model_dir: str):
        ...
    def invoke(self, input, model):
        ...
    def preprocess(self, input_data):
        ...
    def postprocess(self, predictions):
        ...
        
inf_spec = MyInferenceSpec()

# Build ModelBuilder object in IN_PROCESS mode
builder = ModelBuilder(inference_spec=inf_spec,
                       mode=Mode.IN_PROCESS,
                       schema_builder=schema
                      )
                      
# Build and deploy the model
model = builder.build()
predictor=model.deploy()

# make predictions
predictor.predict("How are you today?")

Como próximos pasos, puedes probarlo en modo contenedor local como se muestra en el siguiente código, agregando el image_uriNecesitarás incluir el model_server argumento cuando se incluye el image_uri.

image_uri = '763104351884.dkr.ecr.us-west-2.amazonaws.com/huggingface-pytorch-inference:2.0.0-transformers4.28.1-gpu-py310-cu118-ubuntu20.04'

builder = ModelBuilder(inference_spec=inf_spec,
                       mode=Mode.LOCAL_CONTAINER,  # you can change it to Mode.SAGEMAKER_ENDPOINT for endpoint deployment
                       schema_builder=schema,
                       image_uri=image,
                       model_server=ModelServer.TORCHSERVE
                      )

model = builder.build()                      
predictor = model.deploy()

predictor.predict("How are you today?")

Implementar el modelo

Una vez finalizada la prueba, ahora puede implementar el modelo en un punto final en tiempo real para realizar predicciones actualizando el modo a mode.SAGEMAKER_ENDPOINT y proporcionando un tipo y tamaño de instancia:

sm_predictor = model.deploy(
    initial_instance_count=1,
    instance_type="ml.g5.2xlarge",
    mode=Mode.SAGEMAKER_ENDPOINT,
    role=execution_role,
)

sm_predictor.predict("How is the weather?")

Además de la inferencia en tiempo real, SageMaker admite la inferencia sin servidor, la inferencia asincrónica y los modos de inferencia por lotes para la implementación. También puede utilizar InferenceComponents para abstraer sus modelos y asignar CPU, GPU, aceleradores y políticas de escalado por modelo. Para obtener más información, consulte Reduzca los costos de implementación de modelos en un 50 % en promedio utilizando las funciones más recientes de Amazon SageMaker..

Después de que tengas el ModelBuilder objeto, puede implementar cualquiera de estas opciones simplemente agregando las configuraciones de inferencia correspondientes al implementar el modelo. De manera predeterminada, si no se proporciona el modo, el modelo se implementa en un en tiempo real Punto final. Los siguientes son ejemplos de otras configuraciones:

from sagemaker.serverless.serverless_inference_config import ServerlessInferenceConfig
predictor = model_builder.deploy(
    endpoint_name="serverless-endpoint",
    inference_config=ServerlessInferenceConfig(memory_size_in_mb=2048))
from sagemaker.async_inference.async_inference_config import AsyncInferenceConfig
from sagemaker.s3_utils import s3_path_join

predictor = model_builder.deploy(
    endpoint_name="async-endpoint",
    inference_config=AsyncInferenceConfig(
        output_path=s3_path_join("s3://", bucket, "async_inference/output")))

from sagemaker.batch_inference.batch_transform_inference_config import BatchTransformInferenceConfig

transformer = model_builder.deploy(
    endpoint_name="batch-transform-job",
    inference_config=BatchTransformInferenceConfig(
        instance_count=1,
        instance_type='ml.m5.large',
        output_path=s3_path_join("s3://", bucket, "batch_inference/output"),
        test_data_s3_path = s3_test_path
    ))
print(transformer)

  • Implementar un multimodelo punto final usando InferenceComponent:
from sagemaker.compute_resource_requirements.resource_requirements import ResourceRequirements

predictor = model_builder.deploy(
    endpoint_name="multi-model-endpoint",
    inference_config=ResourceRequirements(
        requests={
            "num_cpus": 0.5,
            "memory": 512,
            "copies": 2,
        },
        limits={},
))

Limpiar

Si creó algún punto final al seguir esta publicación, se le cobrarán cargos mientras esté en funcionamiento. Como práctica recomendada, elimine cualquier punto final si ya no es necesario, ya sea mediante el Consola de administración de AWS, o utilizando el siguiente código:

predictor.delete_model() 
predictor.delete_endpoint()

Conclusión

En esta serie de dos partes, presentamos las mejoras de ModelTrainer y ModelBuilder en el SDK de Python de SageMaker. Ambas clases tienen como objetivo reducir la complejidad y la sobrecarga cognitiva de los científicos de datos, proporcionándoles una interfaz sencilla e intuitiva para entrenar e implementar modelos, tanto localmente en sus cuadernos de SageMaker como en puntos de conexión remotos de SageMaker.

Le recomendamos que pruebe las mejoras del SDK de SageMaker (SageMaker Core, ModelTrainer y ModelBuilder) consultando la Documentación del SDK y cuadernos de muestra en el Repositorio GitHub¡Y déjanos saber tu opinión en los comentarios!


Acerca de los autores

Durga Sury es arquitecta de soluciones sénior en el equipo de Amazon SageMaker. Durante los últimos 5 años, ha trabajado con varios clientes empresariales para configurar una plataforma de IA/ML segura y escalable basada en SageMaker.

Shweta Singh es gerente sénior de productos en el equipo de la plataforma de aprendizaje automático (ML) de Amazon SageMaker en AWS y dirige el SDK de Python de SageMaker. Ha trabajado en varios puestos de productos en Amazon durante más de 5 años. Tiene una licenciatura en Ciencias en Ingeniería Informática y una maestría en Ciencias en Ingeniería Financiera, ambas de la Universidad de Nueva York.

Artículos relacionados

punto_img

Artículos Recientes

punto_img