Ajuste los modelos de difusión estable de texto a imagen con Amazon SageMaker JumpStart

Ajuste los modelos de difusión estable de texto a imagen con Amazon SageMaker JumpStart

Nodo de origen: 1968900

En noviembre de 2022, nosotros anunció que los clientes de AWS pueden generar imágenes a partir de texto con Difusión estable modelos en JumpStart de Amazon SageMaker. Stable Diffusion es un modelo de aprendizaje profundo que le permite generar imágenes realistas de alta calidad y arte impresionante en solo unos segundos. Aunque la creación de imágenes impresionantes puede encontrar uso en industrias que van desde el arte hasta las NFT y más allá, hoy también esperamos que la IA sea personalizable. Hoy, anunciamos que puede personalizar el modelo de generación de imágenes para su caso de uso ajustándolo en su conjunto de datos personalizado en JumpStart de Amazon SageMaker. Esto puede ser útil al crear arte, logotipos, diseños personalizados, NFT, etc., o cosas divertidas como generar imágenes de IA personalizadas de sus mascotas o avatares de usted mismo.

En esta publicación, brindamos una descripción general de cómo ajustar el modelo de difusión estable de dos maneras: programáticamente a través de API JumpStart disponible en el SDK de SageMaker Pythony la interfaz de usuario (UI) de JumpStart en Estudio Amazon SageMaker. También discutimos cómo tomar decisiones de diseño, incluida la calidad del conjunto de datos, el tamaño del conjunto de datos de entrenamiento, la elección de valores de hiperparámetros y la aplicabilidad a múltiples conjuntos de datos. Finalmente, analizamos los más de 80 modelos ajustados disponibles públicamente con diferentes idiomas de entrada y estilos agregados recientemente en JumpStart.

Difusión estable y transferencia de aprendizaje.

Stable Diffusion es un modelo de texto a imagen que le permite crear imágenes fotorrealistas desde solo un mensaje de texto. Un modelo de difusión entrena aprendiendo a eliminar el ruido que se agregó a una imagen real. Este proceso de eliminación de ruido genera una imagen realista. Estos modelos también pueden generar imágenes solo a partir de texto condicionando el proceso de generación al texto. Por ejemplo, Stable Diffusion es una difusión latente donde el modelo aprende a reconocer formas en una imagen de ruido puro y gradualmente enfoca estas formas si las formas coinciden con las palabras en el texto de entrada. El texto primero debe estar incrustado en un espacio latente usando un modelo de lenguaje. Luego, se realizan una serie de operaciones de adición y eliminación de ruido en el espacio latente con una arquitectura U-Net. Finalmente, la salida sin ruido se decodifica en el espacio de píxeles.

En el aprendizaje automático (ML), la capacidad de transferir el conocimiento aprendido en un dominio a otro se denomina transferencia de aprendizaje. Puede usar el aprendizaje por transferencia para producir modelos precisos en sus conjuntos de datos más pequeños, con costos de capacitación mucho más bajos que los involucrados en la capacitación del modelo original. Con el aprendizaje por transferencia, puede ajustar el modelo de difusión estable en su propio conjunto de datos con tan solo cinco imágenes. Por ejemplo, a la izquierda hay imágenes de entrenamiento de un perro llamado Doppler que se usa para ajustar el modelo, en el centro y a la derecha hay imágenes generadas por el modelo ajustado cuando se le pide que prediga la imagen de Doppler en la playa y un dibujo a lápiz.

A la izquierda hay imágenes de una silla blanca utilizada para ajustar el modelo y una imagen de la silla en rojo generada por el modelo ajustado. A la derecha hay imágenes de una otomana utilizada para ajustar el modelo y una imagen de un gato sentado en una otomana.

El ajuste fino de modelos grandes como Stable Diffusion generalmente requiere que proporcione scripts de entrenamiento. Hay una serie de problemas, incluidos problemas de falta de memoria, problemas de tamaño de la carga útil y más. Además, debe ejecutar pruebas de extremo a extremo para asegurarse de que el script, el modelo y la instancia deseada funcionen juntos de manera eficiente. JumpStart simplifica este proceso al proporcionar secuencias de comandos listas para usar que se han probado de forma exhaustiva. La secuencia de comandos de ajuste fino de JumpStart para modelos de difusión estable se basa en la secuencia de comandos de ajuste fino de cabina de ensueño. Puede acceder a estos scripts con un solo clic a través de la interfaz de usuario de Studio o con muy pocas líneas de código a través de la API JumpStart.

Tenga en cuenta que al utilizar el modelo de difusión estable, acepta las Licencia CreativeML Open RAIL++-M.

Utilice JumpStart mediante programación con el SDK de SageMaker

Esta sección describe cómo entrenar e implementar el modelo con el SDK de SageMaker Python. Elegimos un modelo preentrenado adecuado en JumpStart, entrenamos este modelo con un trabajo de entrenamiento de SageMaker e implementamos el modelo entrenado en un punto final de SageMaker. Además, ejecutamos la inferencia en el punto final implementado, todo usando el SDK de Python de SageMaker. Los siguientes ejemplos contienen fragmentos de código. Para obtener el código completo con todos los pasos de esta demostración, consulte el Introducción a JumpStart: texto a imagen ejemplo de cuaderno.

Entrene y ajuste el modelo de difusión estable

Cada modelo está identificado por un único model_id. El siguiente código muestra cómo ajustar un modelo base Stable Diffusion 2.1 identificado por model_id model-txt2img-stabilityai-stable-diffusion-v2-1-base en un conjunto de datos de entrenamiento personalizado. Para obtener una lista completa de model_id valores y qué modelos se pueden ajustar con precisión, consulte Algoritmos integrados con tabla de modelo preentrenada. Para cada model_id, para iniciar un trabajo de capacitación de SageMaker a través del Estimador clase del SDK de Python de SageMaker, debe obtener el URI de la imagen de Docker, el URI del script de entrenamiento y el URI del modelo previamente entrenado a través de las funciones de utilidad proporcionadas en SageMaker. El URI del script de entrenamiento contiene todo el código necesario para el procesamiento de datos, la carga del modelo previamente entrenado, el entrenamiento del modelo y el almacenamiento del modelo entrenado para la inferencia. El URI del modelo preentrenado contiene la definición de la arquitectura del modelo preentrenado y los parámetros del modelo. El URI del modelo preentrenado es específico para el modelo en particular. Los tarballs de modelos preentrenados se han descargado previamente de Hugging Face y se han guardado con la firma de modelo adecuada en Servicio de almacenamiento simple de Amazon (Amazon S3), de modo que el trabajo de entrenamiento se ejecuta en aislamiento de red. Ver el siguiente código:

from sagemaker import image_uris, model_uris, script_uris # Currently, not all the stable diffusion models in jumpstart support finetuning. Thus, we manually select a model
# which supports finetuning.
train_model_id, train_model_version, train_scope = ( "model-txt2img-stabilityai-stable-diffusion-v2-1-base", "*", "training",
) # Tested with ml.g4dn.2xlarge (16GB GPU memory) and ml.g5.2xlarge (24GB GPU memory) instances. Other instances may work as well.
# If ml.g5.2xlarge instance type is available, please change the following instance type to speed up training.
training_instance_type = "ml.g4dn.2xlarge" # Retrieve the docker image
train_image_uri = image_uris.retrieve(
region=None,
framework=None, # automatically inferred from model_id
model_id=train_model_id,
model_version=train_model_version,
image_scope=train_scope,
instance_type=training_instance_type,
) # Retrieve the training script. This contains all the necessary files including data processing, model training etc.
train_source_uri = script_uris.retrieve(
model_id=train_model_id, model_version=train_model_version, script_scope=train_scope
) # Retrieve the pre-trained model tarball to further fine-tune
train_model_uri = model_uris.retrieve(
model_id=train_model_id, model_version=train_model_version, model_scope=train_scope
)

Con estos artefactos de entrenamiento específicos del modelo, puede construir un objeto del Estimador clase:

# Create SageMaker Estimator instance
sd_estimator = Estimator( role=aws_role, image_uri=train_image_uri, source_dir=train_source_uri, model_uri=train_model_uri, entry_point="transfer_learning.py", # Entry-point file in source_dir and present in train_source_uri. instance_count=1, instance_type=training_instance_type, max_run=360000, hyperparameters=hyperparameters, output_path=s3_output_location, base_job_name=training_job_name,
) # Launch a SageMaker Training job by passing s3 path of the training data
sd_estimator.fit({"training": training_dataset_s3_path}, logs=True)

Conjunto de datos de entrenamiento

Las siguientes son las instrucciones sobre cómo deben formatearse los datos de entrenamiento:

  • Entrada – Un directorio que contiene las imágenes de la instancia, dataset_info.json, con la siguiente configuración:
    • Las imágenes pueden tener formato .png, .jpg o .jpeg
    • El dataset_info.json el archivo debe tener el formato {'instance_prompt':<<instance_prompt>>}
  • Salida – Un modelo entrenado que se puede implementar para la inferencia

La ruta S3 debería verse como s3://bucket_name/input_directory/. Tenga en cuenta el final / se requiere.

El siguiente es un formato de ejemplo de los datos de entrenamiento:

input_directory |---instance_image_1.png |---instance_image_2.png |---instance_image_3.png |---instance_image_4.png |---instance_image_5.png |---dataset_info.json

Para obtener instrucciones sobre cómo formatear los datos mientras usa la preservación previa, consulte la sección Conservación Previa en este post

Proporcionamos un conjunto de datos predeterminado de imágenes de gatos. Consta de ocho imágenes (imágenes de instancia correspondientes al indicador de instancia) de un solo gato sin imágenes de clase. Se puede descargar desde GitHub. Si usa el conjunto de datos predeterminado, intente con el mensaje "una foto de un gato riobugger" mientras hace inferencias en el cuaderno de demostración.

Licencia: MIT.

Hiperparámetros

A continuación, para transferir el aprendizaje en su conjunto de datos personalizado, es posible que deba cambiar los valores predeterminados de los hiperparámetros de entrenamiento. Puede obtener un diccionario de Python de estos hiperparámetros con sus valores predeterminados llamando hyperparameters.retrieve_default, actualícelos según sea necesario y luego páselos a la clase Estimator. Ver el siguiente código:

from sagemaker import hyperparameters
# Retrieve the default hyper-parameters for fine-tuning the model
hyperparameters = hyperparameters.retrieve_default(
model_id=train_model_id, model_version=train_model_version
) # [Optional] Override default hyperparameters with custom values
hyperparameters["max_steps"] = "400"

Los siguientes hiperparámetros son compatibles con el algoritmo de ajuste fino:

  • con_preservación_previa – Marca para añadir pérdida de conservación anterior. La conservación previa es un regularizador que evita el sobreajuste. (Opciones: [“True”,“False”], por defecto: “False”.)
  • num_clase_imagenes – Las imágenes de clase mínima por pérdida de conservación previa. Si with_prior_preservation = True y no hay suficientes imágenes ya presentes en class_data_dir, las imágenes adicionales se muestrearán con class_prompt. (Valores: entero positivo, predeterminado: 100).
  • Épocas – El número de pases que el algoritmo de ajuste fino realiza a través del conjunto de datos de entrenamiento. (Valores: entero positivo, predeterminado: 20).
  • Max_pasos – El número total de pasos de entrenamiento a realizar. Si no None, anula las épocas. (Valores: “None” o una cadena de enteros, por defecto: “None”.)
  • Tamaño del lote –: El número de ejemplos de entrenamiento que se han trabajado antes de que se actualicen los pesos del modelo. Igual que el tamaño del lote durante la generación de imágenes de clase si with_prior_preservation = True. (Valores: entero positivo, predeterminado: 1).
  • tasa de aprendizaje – La velocidad a la que se actualizan los pesos del modelo después de trabajar con cada lote de ejemplos de entrenamiento. (Valores: flotante positivo, predeterminado: 2e-06.)
  • anterior_pérdida_de_peso – El peso de la pérdida de conservación previa. (Valores: flotante positivo, predeterminado: 1.0.)
  • centro_cultivo – Si recortar las imágenes antes de cambiar el tamaño a la resolución deseada. (Opciones: [“True”/“False”], por defecto: “False”.)
  • lr_programador – El tipo de planificador de tasa de aprendizaje. (Opciones: ["linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup"], por defecto: "constant".) Para más información, ver Programadores de tasa de aprendizaje.
  • adam_weight_decay – El decaimiento de peso para aplicar (si no es cero) a todas las capas excepto a todos los sesgos y LayerNorm pesos en AdamW optimizador (Valor: flotante, predeterminado: 1e-2.)
  • adam_beta1 – El hiperparámetro beta1 (tasa de decaimiento exponencial para las estimaciones del primer momento) para el AdamW optimizador (Valor: flotante, predeterminado: 0.9.)
  • adam_beta2 – El hiperparámetro beta2 (tasa de decaimiento exponencial para las estimaciones del primer momento) para el AdamW optimizador (Valor: flotante, predeterminado: 0.999.)
  • adam_epsilon - El epsilon hiperparámetro para el AdamW optimizador Por lo general, se establece en un valor pequeño para evitar la división por 0. (Valor: flotante, predeterminado: 1e-8).
  • pasos_de_acumulación_de_gradientes – El número de pasos de actualización que se acumulan antes de realizar un pase de actualización/retroceso. (Valor: entero, predeterminado: 1.)
  • max_grad_norm – La norma de gradiente máximo (para recorte de gradiente). (Valor: flotante, predeterminado: 1.0.)
  • dispersores – Corrija el estado aleatorio para lograr resultados reproducibles en el entrenamiento. (Valor: entero, predeterminado: 0.)

Implementar el modelo bien entrenado

Una vez que finaliza el entrenamiento del modelo, puede implementar directamente el modelo en un punto final persistente en tiempo real. Obtenemos los URI de imagen de Docker y los URI de secuencia de comandos requeridos e implementamos el modelo. Ver el siguiente código:

inference_instance_type = "ml.g4dn.2xlarge" # Retrieve the inference docker container uri
deploy_image_uri = image_uris.retrieve( region=None, framework=None, # automatically inferred from model_id image_scope="inference", model_id=train_model_id, model_version=train_model_version, instance_type=inference_instance_type,
) # Retrieve the inference script uri. This includes scripts for model loading, inference handling etc.
deploy_source_uri = script_uris.retrieve( model_id=train_model_id, model_version=train_model_version, script_scope="inference"
) # Use the estimator from the previous step to deploy to a SageMaker endpoint
finetuned_predictor = sd_estimator.deploy( initial_instance_count=1, instance_type=inference_instance_type, entry_point="inference.py", # entry point file in source_dir and present in deploy_source_uri image_uri=deploy_image_uri, source_dir=deploy_source_uri, endpoint_name=endpoint_name,
)

A la izquierda están las imágenes de entrenamiento de un gato llamado riobugger usado para ajustar el modelo (parámetros predeterminados excepto max_steps = 400). En el centro y a la derecha están las imágenes generadas por el modelo ajustado cuando se le pidió que predijera la imagen de riobugger en la playa y un dibujo a lápiz.

Para obtener más detalles sobre la inferencia, incluidos los parámetros admitidos, el formato de respuesta, etc., consulte Genere imágenes a partir de texto con el modelo de difusión estable en Amazon SageMaker JumpStart.

Acceda a JumpStart a través de la interfaz de usuario de Studio

En esta sección, demostramos cómo entrenar e implementar modelos JumpStart a través de la interfaz de usuario de Studio. El siguiente video muestra cómo encontrar el modelo Stable Diffusion entrenado previamente en JumpStart, entrenarlo y luego implementarlo. La página del modelo contiene información valiosa sobre el modelo y cómo usarlo. Después de configurar la instancia de capacitación de SageMaker, elija Entrenar. Después de entrenar el modelo, puede implementar el modelo entrenado eligiendo Despliegue. Una vez que el punto final está en la etapa "en servicio", está listo para responder a las solicitudes de inferencia.

Para acelerar el tiempo de inferencia, JumpStart proporciona un cuaderno de muestra que muestra cómo ejecutar la inferencia en el punto final recién creado. Para acceder al cuaderno en Studio, seleccione cuaderno abierto existentes Usar Endpoint desde Studio sección de la página de punto final del modelo.

JumpStart también proporciona un cuaderno simple que puede usar para ajustar el modelo de difusión estable e implementar el modelo ajustado resultante. Puedes usarlo para generar imágenes divertidas de tu perro. Para acceder al cuaderno, busque "Generar imágenes divertidas de su perro" en la barra de búsqueda de JumpStart. Para ejecutar el cuaderno, puede usar tan solo cinco imágenes de entrenamiento y cargarlas en la carpeta de estudio local. Si tiene más de cinco imágenes, también puede cargarlas. Notebook carga las imágenes de entrenamiento en S3, entrena el modelo en su conjunto de datos e implementa el modelo resultante. El entrenamiento puede tardar 20 minutos en finalizar. Puede cambiar el número de pasos para acelerar el entrenamiento. Notebook proporciona algunas indicaciones de muestra para probar con el modelo implementado, pero puede probar cualquier indicación que desee. También puede adaptar el cuaderno para crear avatares de usted o sus mascotas. Por ejemplo, en lugar de su perro, puede cargar imágenes de su gato en el primer paso y luego cambiar las indicaciones de perros a gatos y el modelo generará imágenes de su gato.

Consideraciones de ajuste fino

Los modelos de Difusión Estable de Entrenamiento tienden a sobreajustarse rápidamente. Para obtener imágenes de buena calidad, debemos encontrar un buen equilibrio entre los hiperparámetros de entrenamiento disponibles, como el número de pasos de entrenamiento y la tasa de aprendizaje. En esta sección, mostramos algunos resultados experimentales y brindamos orientación sobre cómo configurar estos parámetros.

Recomendaciones

Considere las siguientes recomendaciones:

  • Comience con imágenes de entrenamiento de buena calidad (4–20). Si entrena con rostros humanos, es posible que necesite más imágenes.
  • Entrene de 200 a 400 pasos cuando entrene a perros o gatos y otros sujetos no humanos. Si entrena en rostros humanos, es posible que necesite más pasos. Si ocurre un sobreajuste, reduzca el número de pasos. Si ocurre un ajuste insuficiente (el modelo ajustado no puede generar la imagen del sujeto de destino), aumente el número de pasos.
  • Si entrena en rostros no humanos, puede establecer with_prior_preservation = False porque no afecta significativamente el rendimiento. En rostros humanos, es posible que deba configurar with_prior_preservation=True.
  • Si configura with_prior_preservation=True, use el tipo de instancia ml.g5.2xlarge.
  • Cuando se entrena en varios sujetos secuencialmente, si los sujetos son muy similares (por ejemplo, todos los perros), el modelo retiene el último sujeto y olvida los sujetos anteriores. Si los sujetos son diferentes (por ejemplo, primero un gato y luego un perro), el modelo conserva ambos sujetos.
  • Recomendamos utilizar una tasa de aprendizaje baja y aumentar progresivamente el número de pasos hasta que los resultados sean satisfactorios.

Conjunto de datos de entrenamiento

La calidad del modelo ajustado se ve directamente afectada por la calidad de las imágenes de entrenamiento. Por lo tanto, debe recopilar imágenes de alta calidad para obtener buenos resultados. Las imágenes borrosas o de baja resolución afectarán la calidad del modelo ajustado. Tenga en cuenta los siguientes parámetros adicionales:

  • Número de imágenes de entrenamiento – Puede ajustar el modelo con tan solo cuatro imágenes de entrenamiento. Experimentamos con conjuntos de datos de entrenamiento de tan solo 4 imágenes y hasta 16 imágenes. En ambos casos, el ajuste fino fue capaz de adaptar el modelo al tema.
  • Formatos de conjuntos de datos – Probamos el algoritmo de ajuste fino en imágenes de formato .png, .jpg y .jpeg. También pueden funcionar otros formatos.
  • Resolucion de imagen – Las imágenes de entrenamiento pueden ser de cualquier resolución. El algoritmo de ajuste fino cambiará el tamaño de todas las imágenes de entrenamiento antes de comenzar el ajuste fino. Dicho esto, si desea tener más control sobre el recorte y el cambio de tamaño de las imágenes de entrenamiento, le recomendamos que cambie el tamaño de las imágenes usted mismo a la resolución base del modelo (en este ejemplo, 512 × 512 píxeles).

Configuración del experimento

En el experimento de esta publicación, durante el ajuste fino usamos los valores predeterminados de los hiperparámetros, a menos que se especifique lo contrario. Además, utilizamos uno de los cuatro conjuntos de datos:

  • Perro1-8 – Perro 1 con 8 imágenes
  • Perro1-16 – Perro 1 con 16 imágenes
  • Perro2-4 – Perro 2 con cuatro imágenes
  • Gato-8 – Gato con 8 imágenes

Para reducir el desorden, solo mostramos una imagen representativa del conjunto de datos en cada sección junto con el nombre del conjunto de datos. Puede encontrar el conjunto de entrenamiento completo en la sección Conjuntos de datos de experimentación en este post

Sobreajuste

Los modelos de difusión estable tienden a sobreajustarse cuando se realizan ajustes finos en unas pocas imágenes. Por lo tanto, debe seleccionar parámetros como epochs, max_epochs, y tasa de aprendizaje cuidadosamente. En esta sección, usamos el conjunto de datos Dog1-16.

Para evaluar el rendimiento del modelo, evaluamos el modelo ajustado para cuatro tareas:

  • ¿Puede el modelo ajustado generar imágenes del sujeto (perro Doppler) en el mismo entorno en el que fue entrenado?
    • Observación - Sí puede. Vale la pena señalar que el rendimiento del modelo aumenta con la cantidad de pasos de entrenamiento.
  • ¿Puede el modelo ajustado generar imágenes del sujeto en un entorno diferente al que se entrenó? Por ejemplo, ¿puede generar imágenes de Doppler en una playa?
    • Observación - Sí puede. Vale la pena señalar que el rendimiento del modelo aumenta con la cantidad de pasos de entrenamiento hasta cierto punto. Sin embargo, si el modelo se entrena durante demasiado tiempo, el rendimiento del modelo se degrada ya que el modelo tiende a sobreajustarse.
  • ¿Puede el modelo ajustado generar imágenes de una clase a la que pertenece el sujeto de entrenamiento? Por ejemplo, ¿puede generar una imagen de un perro genérico?
    • Observación – A medida que aumentamos el número de pasos de entrenamiento, el modelo comienza a sobreajustarse. Como resultado, olvida la clase genérica de un perro y solo producirá imágenes relacionadas con el tema.
  • ¿Puede el modelo ajustado generar imágenes de una clase o tema que no esté en el conjunto de datos de entrenamiento? Por ejemplo, ¿puede generar una imagen de un gato?
    • Observación – A medida que aumentamos el número de pasos de entrenamiento, el modelo comienza a sobreajustarse. Como resultado, solo producirá imágenes relacionadas con el tema, independientemente de la clase especificada.

Ajustamos el modelo para un número diferente de pasos (configurando max_steps hiperparámetros) y para cada modelo ajustado, generamos imágenes en cada una de las siguientes cuatro indicaciones (que se muestran en los siguientes ejemplos de izquierda a derecha:

  • “Una foto de un perro Doppler”
  • “Una foto de un perro Doppler en una playa”
  • “Una foto de un perro”
  • “Una foto de un gato”

Las siguientes imágenes son del modelo entrenado con 50 pasos.

El siguiente modelo fue entrenado con 100 pasos.

Entrenamos el siguiente modelo con 200 pasos.

Las siguientes imágenes son de un modelo entrenado con 400 pasos.

Por último, las siguientes imágenes son el resultado de 800 pasos.

Entrene en múltiples conjuntos de datos

Mientras realiza el ajuste fino, es posible que desee realizar el ajuste fino en varios sujetos y hacer que el modelo ajustado sea capaz de generar imágenes de todos los sujetos. Desafortunadamente, JumpStart actualmente se limita a la capacitación en un solo tema. No puede ajustar el modelo en varios temas al mismo tiempo. Además, el ajuste fino del modelo para diferentes sujetos secuencialmente da como resultado que el modelo olvide el primer sujeto si los sujetos son similares.

Consideramos la siguiente experimentación en esta sección:

  1. Ajuste el modelo para el Sujeto A.
  2. Ajuste el modelo resultante del Paso 1 para el Sujeto B.
  3. Genere imágenes del Sujeto A y el Sujeto B usando el modelo de salida del Paso 2.

En los siguientes experimentos, observamos que:

  • Si A es el perro 1 y B es el perro 2, entonces todas las imágenes generadas en el Paso 3 se parecen al perro 2
  • Si A es el perro 2 y B es el perro 1, entonces todas las imágenes generadas en el Paso 3 se parecen al perro 1
  • Si A es el perro 1 y B es el gato, entonces las imágenes generadas con las indicaciones del perro se parecen al perro 1 y las imágenes generadas con las indicaciones del gato se parecen al gato.

Entrenar al perro 1 y luego al perro 2

En el Paso 1, ajustamos el modelo en 200 pasos en ocho imágenes del perro 1. En el Paso 2, ajustamos el modelo aún más en 200 pasos en cuatro imágenes del perro 2.

Las siguientes son las imágenes generadas por el modelo ajustado al final del Paso 2 para diferentes indicaciones.

Entrenar al perro 2 y luego al perro 1

En el Paso 1, ajustamos el modelo en 200 pasos en cuatro imágenes del perro 2. En el Paso 2, ajustamos el modelo aún más en 200 pasos en ocho imágenes del perro 1.

Las siguientes son las imágenes generadas por el modelo ajustado al final del Paso 2 con diferentes indicaciones.

Capacitar a perros y gatos

En el Paso 1, ajustamos el modelo en 200 pasos en ocho imágenes de un gato. Luego ajustamos el modelo aún más para 200 pasos en ocho imágenes del perro 1.

Las siguientes son las imágenes generadas por el modelo ajustado al final del Paso 2. Las imágenes con mensajes relacionados con gatos se ven como el gato en el Paso 1 del ajuste fino, y las imágenes con mensajes relacionados con perros se ven como el perro en Paso 2 del ajuste fino.

Conservación previa

La preservación previa es una técnica que utiliza imágenes adicionales de la misma clase que estamos tratando de entrenar. Por ejemplo, si los datos de entrenamiento consisten en imágenes de un perro en particular, con preservación previa, incorporamos imágenes de clase de perros genéricos. Intenta evitar el sobreajuste mostrando imágenes de diferentes perros mientras se entrena para un perro en particular. Falta una etiqueta que indica el perro específico presente en el aviso de la instancia en el aviso de la clase. Por ejemplo, el mensaje de la instancia puede ser "una foto de un gato riobugger" y el mensaje de la clase puede ser "una foto de un gato". Puede habilitar la conservación previa configurando el hiperparámetro with_prior_preservation = True. Si el ajuste with_prior_preservation = True, debes incluir class_prompt in dataset_info.json y puede incluir cualquier imagen de clase disponible para usted. El siguiente es el formato del conjunto de datos de entrenamiento al configurar with_prior_preservation = True:

  • Entrada – Un directorio que contiene las imágenes de la instancia, dataset_info.json y directorio (opcional) class_data_dir. Tenga en cuenta lo siguiente:
    • Las imágenes pueden tener formato .png, .jpg, .jpeg.
    • El dataset_info.json el archivo debe tener el formato {'instance_prompt':<<instance_prompt>>,'class_prompt':<<class_prompt>>}.
    • El class_data_dir El directorio debe tener imágenes de clase. Si class_data_dir no está presente o no hay suficientes imágenes ya presentes en class_data_dir, las imágenes adicionales se muestrearán con class_prompt.

Para conjuntos de datos como gatos y perros, la conservación previa no afecta significativamente el rendimiento del modelo ajustado y, por lo tanto, se puede evitar. Sin embargo, cuando se entrena en caras, esto es necesario. Para obtener más información, consulte Entrenamiento de difusión estable con Dreambooth usando difusores.

Tipos de instancia

El ajuste fino de los modelos de difusión estable requiere un cálculo acelerado proporcionado por instancias compatibles con GPU. Experimentamos nuestro ajuste fino con instancias ml.g4dn.2xlarge (memoria CUDA de 16 GB, 1 GPU) y ml.g5.2xlarge (memoria CUDA de 24 GB, 1 GPU). El requisito de memoria es mayor cuando se generan imágenes de clase. Por lo tanto, si se establece with_prior_preservation=True, use el tipo de instancia ml.g5.2xlarge, porque el entrenamiento se encuentra con el problema de falta de memoria de CUDA en la instancia ml.g4dn.2xlarge. El script de ajuste fino de JumpStart actualmente utiliza una sola GPU y, por lo tanto, el ajuste fino en instancias de múltiples GPU no producirá una ganancia de rendimiento. Para obtener más información sobre los diferentes tipos de instancias, consulte Tipos de instancias de Amazon EC2.

Limitaciones y sesgos

Aunque Stable Diffusion tiene un rendimiento impresionante en la generación de imágenes, adolece de varias limitaciones y sesgos. Estos incluyen pero no se limitan a:

  • Es posible que el modelo no genere caras o extremidades precisas porque los datos de entrenamiento no incluyen suficientes imágenes con estas características.
  • El modelo fue entrenado en el Conjunto de datos LAION-5B, que tiene contenido para adultos y puede no ser apto para el uso del producto sin más consideraciones
  • Es posible que el modelo no funcione bien con idiomas que no sean inglés porque el modelo se entrenó en texto en inglés
  • El modelo no puede generar un buen texto dentro de las imágenes.

Para obtener más información sobre limitaciones y sesgos, consulte Tarjeta modelo Stable Diffusion v2-1-base. Estas limitaciones para el modelo preentrenado también pueden trasladarse a los modelos ajustados.

Limpiar

Una vez que haya terminado de ejecutar el cuaderno, asegúrese de eliminar todos los recursos creados en el proceso para garantizar que se detenga la facturación. El código para limpiar el punto final se proporciona en el asociado Introducción a JumpStart: texto a imagen ejemplo de cuaderno.

Modelos ajustados disponibles públicamente en JumpStart

Aunque los modelos Stable Diffusion lanzados por EstabilidadAI tienen un rendimiento impresionante, tienen limitaciones en cuanto al idioma o dominio en el que se entrenó. Por ejemplo, los modelos Stable Diffusion se entrenaron con texto en inglés, pero es posible que deba generar imágenes a partir de texto que no esté en inglés. Alternativamente, los modelos Stable Diffusion fueron entrenados para generar imágenes fotorrealistas, pero es posible que necesite generar imágenes animadas o artísticas.

JumpStart proporciona más de 80 modelos disponibles públicamente con varios idiomas y temas. Estos modelos suelen ser versiones mejoradas de los modelos Stable Diffusion publicados por StabilityAI. Si su caso de uso coincide con uno de los modelos ajustados, no necesita recopilar su propio conjunto de datos y ajustarlo. Simplemente puede implementar uno de estos modelos a través de la interfaz de usuario de Studio o utilizando las API de JumpStart fáciles de usar. Para implementar un modelo de difusión estable preentrenado en JumpStart, consulte Genere imágenes a partir de texto con el modelo de difusión estable en Amazon SageMaker JumpStart.

Los siguientes son algunos de los ejemplos de imágenes generadas por los diferentes modelos disponibles en JumpStart.

Tenga en cuenta que estos modelos no se ajustan con los scripts de JumpStart o los scripts de DreamBooth. Puede descargar la lista completa de modelos ajustados disponibles públicamente con indicaciones de ejemplo de esta página.

Para obtener más imágenes de ejemplo generadas a partir de estos modelos, consulte la sección Modelos ajustados de código abierto en el Apéndice.

Conclusión

En esta publicación, mostramos cómo ajustar el modelo de difusión estable para texto a imagen y luego implementarlo usando JumpStart. Además, discutimos algunas de las consideraciones que debe tener al ajustar el modelo y cómo puede afectar el rendimiento del modelo ajustado. También discutimos los más de 80 modelos ajustados listos para usar disponibles en JumpStart. Mostramos fragmentos de código en esta publicación; para obtener el código completo con todos los pasos de esta demostración, consulte la Introducción a JumpStart: texto a imagen cuaderno de ejemplo. Pruebe la solución usted mismo y envíenos sus comentarios.

Para obtener más información sobre el modelo y el ajuste fino de DreamBooth, consulte los siguientes recursos:

Para obtener más información sobre JumpStart, consulte las siguientes publicaciones de blog:


Acerca de los autores

Dr. Vivek Madan es un científico aplicado del equipo JumpStart de Amazon SageMaker. Obtuvo su doctorado en la Universidad de Illinois en Urbana-Champaign y fue investigador posdoctoral en Georgia Tech. Es un investigador activo en aprendizaje automático y diseño de algoritmos y ha publicado artículos en conferencias EMNLP, ICLR, COLT, FOCS y SODA.

Heiko Hotz es arquitecto sénior de soluciones para inteligencia artificial y aprendizaje automático con un enfoque especial en procesamiento de lenguaje natural (NLP), modelos de lenguaje extenso (LLM) e inteligencia artificial generativa. Antes de ocupar este puesto, fue director de ciencia de datos del servicio de atención al cliente de la UE de Amazon. Heiko ayuda a nuestros clientes a tener éxito en su viaje de IA/ML en AWS y ha trabajado con organizaciones en muchas industrias, incluidas las de seguros, servicios financieros, medios y entretenimiento, atención médica, servicios públicos y fabricación. En su tiempo libre, Heiko viaja tanto como puede.


Apéndice: Conjuntos de datos de experimentos

Esta sección contiene los conjuntos de datos utilizados en los experimentos de esta publicación.

Perro1-8

Perro1-16

Perro2-4

Perro3-8

Apéndice: Modelos ajustados de código abierto

Los siguientes son algunos de los ejemplos de imágenes generadas por los diferentes modelos disponibles en JumpStart. Cada imagen está subtitulada con un model_id comenzando con un prefijo huggingface-txt2img- seguido por el indicador utilizado para generar la imagen en la siguiente línea.

Sello de tiempo:

Mas de Aprendizaje automático de AWS