Ejecuta múltiples modelos de IA generativa en GPU utilizando puntos de enlace multi-modelo de Amazon SageMaker con TorchServe y ahorra hasta un 75% en costos de inferencia

Ejecuta múltiples modelos de IA generativa en GPU con SageMaker y ahorra hasta un 75% en costos de inferencia

Los endpoints multi-modelo (MMEs) son una característica poderosa de Amazon SageMaker diseñada para simplificar la implementación y operación de modelos de aprendizaje automático (ML). Con MMEs, puedes alojar múltiples modelos en un único contenedor de servicio y alojar todos los modelos detrás de un único punto de conexión. La plataforma SageMaker gestiona automáticamente la carga y descarga de modelos y escala los recursos según los patrones de tráfico, reduciendo la carga operativa de gestionar una gran cantidad de modelos. Esta característica es particularmente beneficiosa para modelos de inteligencia artificial generativa y de aprendizaje profundo que requieren computación acelerada. Los ahorros de costos logrados mediante el uso compartido de recursos y la gestión simplificada de modelos hacen que los MMEs de SageMaker sean una excelente opción para alojar modelos a gran escala en AWS.

Recientemente, las aplicaciones de inteligencia artificial generativa han captado una amplia atención e imaginación. Los clientes desean implementar modelos de inteligencia artificial generativa en GPUs pero al mismo tiempo son conscientes de los costos. Los MMEs de SageMaker admiten instancias de GPU y son una gran opción para este tipo de aplicaciones. Hoy, nos complace anunciar el soporte de TorchServe para los MMEs de SageMaker. Este nuevo soporte del servidor de modelos te brinda la ventaja de todos los beneficios de los MMEs mientras sigues utilizando el stack de servicio que los clientes de TorchServe conocen mejor. En esta publicación, demostramos cómo alojar modelos de inteligencia artificial generativa, como Stable Diffusion y Segment Anything Model, en los MMEs de SageMaker utilizando TorchServe y construir una solución de edición guiada por el lenguaje que puede ayudar a artistas y creadores de contenido a desarrollar e iterar sus obras de arte más rápido.

Resumen de la solución

La edición guiada por el lenguaje es un caso de uso común de inteligencia artificial generativa en diversas industrias. Puede ayudar a artistas y creadores de contenido a trabajar de manera más eficiente para satisfacer la demanda de contenido mediante la automatización de tareas repetitivas, la optimización de campañas y la creación de experiencias hiperpersonalizadas para el cliente final. Las empresas pueden beneficiarse de un mayor volumen de contenido, ahorros de costos, personalización mejorada y una experiencia del cliente mejorada. En esta publicación, demostramos cómo puedes construir funciones de edición asistida por lenguaje utilizando MME TorchServe, lo que te permite borrar cualquier objeto no deseado de una imagen y modificar o reemplazar cualquier objeto en una imagen mediante una instrucción de texto.

El flujo de experiencia del usuario para cada caso de uso es el siguiente:

  • Para eliminar un objeto no deseado, selecciona el objeto de la imagen para resaltarlo. Esta acción envía las coordenadas de píxeles y la imagen original a un modelo de inteligencia artificial generativa, que genera una máscara de segmentación para el objeto. Después de confirmar la selección correcta del objeto, puedes enviar las imágenes original y de máscara a un segundo modelo para su eliminación. La ilustración detallada de este flujo de usuario se muestra a continuación.
Paso 1: Selecciona un objeto (“perro”) de la imagen Paso 2: Confirma que el objeto correcto está resaltado Paso 3: Borra el objeto de la imagen
  • Para modificar o reemplazar un objeto, selecciona y resalta el objeto deseado, siguiendo el mismo proceso descrito anteriormente. Una vez que confirmes la selección correcta del objeto, puedes modificar el objeto suministrando la imagen original, la máscara y una indicación de texto. El modelo cambiará entonces el objeto resaltado según las instrucciones proporcionadas. Una ilustración detallada de este segundo flujo de usuario es la siguiente.
Paso 1: Selecciona un objeto (“jarrón”) de la imagen Paso 2: Confirma que el objeto correcto está resaltado Paso 3: Proporciona una indicación de texto (“jarrón futurista”) para modificar el objeto

Para alimentar esta solución, utilizamos tres modelos de IA generativa: Modelo de Segmentación de Cualquier Cosa (SAM), Modelo de Relleno de Máscara Grande (LaMa) y Relleno por Difusión Estable (SD). A continuación se explica cómo se utilizan estos modelos en el flujo de experiencia del usuario:

Para eliminar un objeto no deseado Para modificar o reemplazar un objeto
  1. El Modelo de Segmentación de Cualquier Cosa (SAM) se utiliza para generar una máscara de segmento del objeto de interés. Desarrollado por Meta Research, SAM es un modelo de código abierto que puede segmentar cualquier objeto en una imagen. Este modelo ha sido entrenado en un conjunto de datos masivo conocido como SA-1B, que comprende más de 11 millones de imágenes y 1.100 millones de máscaras de segmentación. Para obtener más información sobre SAM, consulte su sitio web y su artículo de investigación.
  2. LaMa se utiliza para eliminar cualquier objeto no deseado de una imagen. LaMa es un modelo de Red Generativa Antagónica (GAN) especializado en rellenar partes faltantes de imágenes utilizando máscaras irregulares. La arquitectura del modelo incorpora un contexto global de la imagen y una arquitectura de un solo paso que utiliza convoluciones de Fourier, lo que le permite lograr resultados de última generación a una velocidad más rápida. Para obtener más detalles sobre LaMa, visite su sitio web y su artículo de investigación.
  3. El modelo de relleno SD 2 de Stability AI se utiliza para modificar o reemplazar objetos en una imagen. Este modelo nos permite editar el objeto en el área de la máscara proporcionando una indicación de texto. El modelo de relleno se basa en el modelo SD de texto a imagen, que puede crear imágenes de alta calidad con una indicación de texto simple. Proporciona argumentos adicionales como imágenes originales y de máscara, lo que permite una modificación y restauración rápidas del contenido existente. Para obtener más información sobre los modelos de difusión estable en AWS, consulte Crea imágenes de alta calidad con modelos de difusión estable y despliéguelos de manera rentable con Amazon SageMaker.

Los tres modelos están alojados en SageMaker MMEs, lo que reduce la carga operativa de administrar múltiples puntos finales. Además, el uso de MME elimina las preocupaciones acerca de que ciertos modelos se utilicen de manera insuficiente porque los recursos se comparten. Se puede observar el beneficio de la mejora de la saturación de la instancia, lo que finalmente conduce a un ahorro de costos. El siguiente diagrama de arquitectura ilustra cómo se sirven los tres modelos utilizando SageMaker MMEs con TorchServe.

Hemos publicado el código para implementar esta arquitectura de solución en nuestro repositorio de GitHub. Para seguir el resto del artículo, utilice el archivo de bloc de notas. Se recomienda ejecutar este ejemplo en una instancia de bloc de notas de SageMaker utilizando el kernel conda_python3 (Python 3.10.10).

Extender el contenedor de TorchServe

El primer paso es preparar el contenedor de alojamiento del modelo. SageMaker proporciona un contenedor de aprendizaje profundo de PyTorch administrado (DLC) que se puede recuperar utilizando el siguiente fragmento de código:

# Utilice el DLC de PyTorch de SageMaker como imagen base
baseimage = sagemaker.image_uris.retrieve(
    framework="pytorch",
    region=region,
    py_version="py310",
    image_scope="inference",
    version="2.0.0",
    instance_type="ml.g5.2xlarge",
)
print(baseimage)

Debido a que los modelos requieren recursos y paquetes adicionales que no están en el DLC base de PyTorch, es necesario construir una imagen de Docker. Esta imagen se carga luego en el Registro de Contenedores Elástico de Amazon (Amazon ECR) para que podamos acceder a ella directamente desde SageMaker. Las bibliotecas instaladas personalizadas se enumeran en el archivo Docker:

ARG BASE_IMAGE

FROM $BASE_IMAGE

# Instale cualquier biblioteca adicional
RUN pip install segment-anything-py==1.0
RUN pip install opencv-python-headless==4.7.0.68
RUN pip install matplotlib==3.6.3
RUN pip install diffusers
RUN pip install tqdm
RUN pip install easydict
RUN pip install scikit-image
RUN pip install xformers
RUN pip install tensorflow
RUN pip install joblib
RUN pip install matplotlib
RUN pip install albumentations==0.5.2
RUN pip install hydra-core==1.1.0
RUN pip install pytorch-lightning
RUN pip install tabulate
RUN pip install kornia==0.5.0
RUN pip install webdataset
RUN pip install omegaconf==2.1.2
RUN pip install transformers==4.28.1
RUN pip install accelerate
RUN pip install ftfy

Ejecuta el archivo de comandos de shell para construir la imagen personalizada localmente y enviarla a Amazon ECR:

%%capture build_output

reponame = "torchserve-mme-demo"
versiontag = "genai-0.1"

# Construye nuestra propia imagen de Docker
!cd workspace/docker && ./build_and_push.sh {reponame} {versiontag} {baseimage} {region} {account}

Preparar los artefactos del modelo

La principal diferencia para los nuevos MMEs con soporte de TorchServe es cómo se preparan los artefactos del modelo. El repositorio de código proporciona una carpeta esqueleto para cada modelo (carpeta de modelos) para alojar los archivos requeridos para TorchServe. Seguimos el mismo proceso de cuatro pasos para preparar cada archivo .tar del modelo. El siguiente código es un ejemplo de la carpeta esqueleto para el modelo SD:

workspace
|--sd
   |-- custom_handler.py
   |-- model-config.yaml

El primer paso es descargar los puntos de control del modelo pre-entrenado en la carpeta de modelos:

import diffusers
import torch
import transformers

pipeline = diffusers.StableDiffusionInpaintPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2-inpainting", torch_dtype=torch.float16
)

sd_dir = "workspace/sd/model"
pipeline.save_pretrained(sd_dir)

El siguiente paso es definir un archivo custom_handler.py. Esto es necesario para definir el comportamiento del modelo cuando recibe una solicitud, como cargar el modelo, preprocesar la entrada y postprocesar la salida. El método handle es el punto de entrada principal para las solicitudes, y acepta un objeto de solicitud y devuelve un objeto de respuesta. Carga los puntos de control del modelo pre-entrenado y aplica los métodos preprocess y postprocess a los datos de entrada y salida. El siguiente fragmento de código ilustra una estructura simple del archivo custom_handler.py. Para obtener más detalles, consulta la API del controlador de TorchServe.

def initialize(self, ctx: Context):

def preprocess(self, data):

def inference(self, data):

def handle(self, data, context):
    requests = self.preprocess(data)
    responses = self.inference(requests)

    return responses

El último archivo requerido para TorchServe es model-config.yaml. El archivo define la configuración del servidor de modelos, como el número de trabajadores y el tamaño del lote. La configuración es a nivel de modelo, y se muestra un ejemplo de archivo de configuración en el siguiente código. Para obtener una lista completa de parámetros, consulta el repositorio de GitHub.

minWorkers: 1
maxWorkers: 1
batchSize: 1
maxBatchDelay: 200
responseTimeout: 300

El último paso es empaquetar todos los artefactos del modelo en un archivo .tar.gz usando el módulo torch-model-archiver:

!torch-model-archiver --model-name sd --version 1.0 --handler workspace/sd/custom_handler.py --extra-files workspace/sd/model --config-file workspace/sam/model-config.yaml --archive-format no-archive!cd sd && tar cvzf sd.tar.gz .

Crear el punto de acceso multi-modelo

Los pasos para crear un MME de SageMaker son los mismos que antes. En este ejemplo particular, creas un punto de acceso utilizando el SDK de SageMaker. Comienza definiendo una ubicación de Amazon Simple Storage Service (Amazon S3) y el contenedor de alojamiento. Esta ubicación de S3 es donde SageMaker cargará dinámicamente los modelos según los patrones de invocación. El contenedor de alojamiento es el contenedor personalizado que construiste y enviaste a Amazon ECR en el paso anterior. Mira el siguiente código:

# Aquí es donde nuestro MME leerá los modelos desde S3.
multi_model_s3uri = output_path

Luego quieres definir un MulitDataModel que capture todos los atributos como la ubicación del modelo, el contenedor de alojamiento y el acceso de permisos:

print(multi_model_s3uri)
model = Model(
    model_data=f"{multi_model_s3uri}/sam.tar.gz",
    image_uri=container,
    role=role,
    sagemaker_session=smsess,
    env={"TF_ENABLE_ONEDNN_OPTS": "0"},
)

mme = MultiDataModel(
    name="torchserve-mme-genai-" + datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
    model_data_prefix=multi_model_s3uri,
    model=model,
    sagemaker_session=smsess,
)
print(mme)

La función deploy() crea una configuración de punto de conexión y aloja el punto de conexión:

mme.deploy(
    initial_instance_count=1,
    instance_type="ml.g5.2xlarge",
    serializer=sagemaker.serializers.JSONSerializer(),
    deserializer=sagemaker.deserializers.JSONDeserializer(),
)

En el ejemplo que proporcionamos, también mostramos cómo puede enumerar modelos y agregar dinámicamente nuevos modelos usando el SDK. La función add_model() copia sus archivos de modelo local .tar en la ubicación MME S3:

# ¡Solo sam.tar.gz es visible!
list(mme.list_models())

models = ["sd/sd.tar.gz", "lama/lama.tar.gz"]
for model in models:
    mme.add_model(model_data_source=model)

Invocar los modelos

Ahora que tenemos los tres modelos alojados en un MME, podemos invocar cada modelo en secuencia para construir nuestras características de edición asistida por lenguaje. Para invocar cada modelo, proporcione un parámetro target_model en la función predictor.predict(). El nombre del modelo es solo el nombre del archivo .tar del modelo que cargamos. A continuación se muestra un ejemplo de código para el modelo SAM que recibe una coordenada de píxel, una etiqueta de punto y el tamaño del kernel de dilatación, y genera una máscara de segmentación del objeto en la ubicación del píxel:

img_file = "workspace/test_data/sample1.png"
img_bytes = None

with Image.open(img_file) as f:
    img_bytes = encode_image(f)

gen_args = json.dumps(dict(point_coords=[750, 500], point_labels=1, dilate_kernel_size=15))

payload = json.dumps({"image": img_bytes, "gen_args": gen_args}).encode("utf-8")

response = predictor.predict(data=payload, target_model="/sam.tar.gz")
encoded_masks_string = json.loads(response.decode("utf-8"))["generated_image"]
base64_bytes_masks = base64.b64decode(encoded_masks_string)

with Image.open(io.BytesIO(base64_bytes_masks)) as f:
    generated_image_rgb = f.convert("RGB")
    generated_image_rgb.show()

Para eliminar un objeto no deseado de una imagen, tome la máscara de segmentación generada por SAM y aliméntela al modelo LaMa con la imagen original. Las siguientes imágenes muestran un ejemplo.

Imagen de muestra Máscara de segmentación de SAM Borrar el perro usando LaMa

Para modificar o reemplazar cualquier objeto en una imagen con una indicación de texto, tome la máscara de segmentación de SAM y aliméntela al modelo SD junto con la imagen original y la indicación de texto, como se muestra en el siguiente ejemplo.

! !
Imagen de muestra Máscara de segmentación de SAM

Reemplazar usando el modelo SD con indicación de texto

“un hámster en un banco”

Ahorro de costos

Los beneficios de las MME de SageMaker aumentan en función de la consolidación de modelos. La siguiente tabla muestra el uso de memoria de la GPU de los tres modelos en esta publicación. Se implementan en una instancia g5.2xlarge utilizando una MME de SageMaker.

Modelo Memoria de la GPU (MiB)
Modelo Segment Anything 3,362
Difusión Estable en Pintura 3,910
Lama 852

Se pueden observar ahorros de costos al alojar los tres modelos en un solo punto de conexión, y para casos de uso con cientos o miles de modelos, los ahorros son mucho mayores.

Por ejemplo, consideremos 100 modelos de Difusión Estable. Cada uno de los modelos por sí solo podría ser atendido por un punto de conexión ml.g5.2xlarge (4 GiB de memoria), con un costo de $1.52 por hora de instancia en la región del este de EE. UU. (N. Virginia). Proporcionar los 100 modelos utilizando su propio punto de conexión costaría $218,880 al mes. Con una MME de SageMaker, un solo punto de conexión utilizando instancias ml.g5.2xlarge puede alojar cuatro modelos simultáneamente. Esto reduce los costos de inferencia de producción en un 75% a solo $54,720 al mes. La siguiente tabla resume las diferencias entre los puntos de conexión de un solo modelo y los puntos de conexión de múltiples modelos para este ejemplo. Dada una configuración de punto de conexión con memoria suficiente para sus modelos objetivo, la latencia de invocación en estado estable después de que se hayan cargado todos los modelos será similar a la de un punto de conexión de un solo modelo.

. Punto de conexión de un solo modelo Punto de conexión de múltiples modelos
Precio total del punto de conexión por mes $218,880 $54,720
Tipo de instancia del punto de conexión ml.g5.2xlarge ml.g5.2xlarge
Capacidad de memoria de la CPU (GiB) 32 32
Capacidad de memoria de la GPU (GiB) 24 24
Precio por hora del punto de conexión $1.52 $1.52
Número de instancias por punto de conexión 2 2
Puntos de conexión necesarios para 100 modelos 100 25

Limpieza

Después de haber terminado, siga las instrucciones de la sección de limpieza del cuaderno para eliminar los recursos provisionados en esta publicación y evitar cargos innecesarios. Consulte la página de precios de Amazon SageMaker para obtener detalles sobre el costo de las instancias de inferencia.

Conclusión

Esta publicación demuestra las capacidades de edición asistida por lenguaje que son posibles gracias al uso de modelos de IA generativos alojados en MME de SageMaker con TorchServe. El ejemplo que compartimos ilustra cómo podemos utilizar el uso compartido de recursos y la gestión simplificada de modelos con MME de SageMaker, al mismo tiempo que utilizamos TorchServe como nuestra pila de servicios de modelos. Utilizamos tres modelos fundamentales de aprendizaje profundo: SAM, SD 2 Inpainting y LaMa. Estos modelos nos permiten crear capacidades poderosas, como borrar cualquier objeto no deseado de una imagen y modificar o reemplazar cualquier objeto en una imagen proporcionando una instrucción de texto. Estas características pueden ayudar a los artistas y creadores de contenido a trabajar de manera más eficiente y satisfacer sus demandas de contenido automatizando tareas repetitivas, optimizando campañas y brindando una experiencia hiperpersonalizada. Lo invitamos a explorar el ejemplo proporcionado en esta publicación y crear su propia experiencia de interfaz de usuario utilizando TorchServe en una MME de SageMaker.

Para comenzar, consulte los algoritmos, frameworks e instancias admitidos para puntos finales de múltiples modelos que utilizan instancias respaldadas por GPU.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Noticias de Inteligencia Artificial

Enfoque de OpenAI hacia la seguridad en la inteligencia artificial.

¿Qué pasará con los enfoques de seguridad en los sistemas de IA después de que el CEO de OpenAI, Sam Altman, testific...

Inteligencia Artificial

Los Juegos Asiáticos, un hito para los eSports que alimenta los sueños olímpicos

En los Juegos Asiáticos de Hangzhou, China, los jugadores de eSports tendrán la oportunidad de ganar medallas por pri...

Inteligencia Artificial

Una revisión exhaustiva de los modelos de difusión de video en el Contenido Generado por Inteligencia Artificial (CGIA)

La Inteligencia Artificial está en auge, al igual que su subcampo, es decir, el dominio de la Visión por Computadora....

Inteligencia Artificial

OpenAI presenta DALL·E 3 Un salto revolucionario en la generación de texto a imagen

En un salto tecnológico significativo, OpenAI ha anunciado el lanzamiento de DALL·E 3, la última iteración en su revo...