42 puntos por xguru 2025-02-03 | 5 comentarios | Compartir por WhatsApp
  • Probé un proyecto para entrenar durante unas horas mi propio modelo de imágenes con IA y generar fotos que parecieran tomadas directamente de mí
    • Ej.: generar una foto mía disfrazado de "Superman"
  • Razones para intentarlo: parecía divertido, era bueno para jugar con mis hijos y me permitía aprender más sobre modelos personalizados y la parte más avanzada de la IA
  • Hace 12 a 18 meses, este trabajo era bastante complejo, pero ahora se ha vuelto muy simple
  • En menos de 2 horas creé el modelo y obtuve las imágenes que quería; la clave fue identificar rápido las herramientas correctas

Elegir el patrón de modelo/entrenamiento

  • Elementos necesarios
    • modelo base (base model)
    • técnica de entrenamiento/ajuste fino
    • dataset de entrenamiento (unas cuantas fotos propias, etc.)
  • Muchas IAs recomiendan Stable Diffusion, pero elegí el modelo Flux porque Pieter Levels dijo que ofrecía mejor rendimiento
    • No es exactamente el modelo SOTA más reciente, pero es más que suficiente
  • Como técnica de entrenamiento usé LoRA (Low-Rank Adaptation)
    • En vez de reentrenar todo el modelo, solo se entrena la parte asociada a una "palabra mágica" específica
    • Ej.: enseñar al modelo una palabra poco común como "czue", para que cuando se use en el prompt refleje las características de ese dataset

Crear el set de entrenamiento

  • Hay que preparar varias fotos del sujeto a aprender (unas 10 a 15)
    • Cuanta más variedad haya en expresiones, fondo, iluminación y ángulos, mejor
    • Idealmente, debería haber una sola persona por foto
  • Durante el entrenamiento se necesita una descripción en texto, y ahí debe incluirse la palabra mágica
    • Ej.: "a photo of czue on the beach, wearing a blue shirt"
  • Pero las herramientas recientes generan captions de imagen automáticamente, así que no hace falta escribir las descripciones a mano

Entrenar el modelo

  • Al principio pensé en entrenarlo localmente, pero fue difícil por falta de GPU y RAM
  • También se puede ejecutar el código directamente en un servidor cloud con GPU, pero al final usé Replicate
    • Es un servicio de alquiler de GPU donde se pueden usar recetas ya preparadas de inmediato
  • En este caso usé la receta ostris/flux-dev-lora-trainer
    • Después de crear una cuenta en Replicate, hay que configurar la información de cobro
  • Parámetros principales
    • input_images: fotos de entrenamiento (zip)
    • trigger_word: palabra mágica, por ejemplo "czue"
    • hf_repo_id, hf_token: repositorio/token de Hugging Face
    • autocaption_prefix: texto que se antepone a los captions generados automáticamente (ej.: "A photo of czue,")

Guardar el modelo en Hugging Face

  • Hugging Face es una plataforma para almacenar y compartir modelos
  • Replicate también guarda el modelo entrenado en algún lugar, pero subirlo a Hugging Face facilita integrarlo con otras herramientas
  • Tras crear la cuenta y el modelo, se pasa hf_repo_id
  • Cuando termina el entrenamiento, se sube a Hugging Face un archivo grande llamado lora.safetensors (aprox. 180MB)

Generar imágenes con el modelo

  • Una vez terminado el entrenamiento, sigue el proceso de inferencia: introducir texto en el modelo para crear imágenes
  • Se puede probar localmente, pero otra vez recurrí a Replicate
    • En lucataco/flux-dev-lora solo hay que configurar el campo hf_lora
      • ID de un repositorio público de Hugging Face o enlace al modelo entrenado subido a Replicate
  • Ej.: si introduces "a photo of czue surfing", obtienes una imagen tuya surfeando como la siguiente

Ejecutar el modelo de forma programática

  • Si quieres probar distintos prompts y guardar los resultados automáticamente, es más práctico hacerlo vía API
  • Preparé el siguiente script en Python como ejemplo (el código completo está en Github)
    # /// script  
    # requires-python = ">=3.12"  
    # dependencies = [  
    #     "replicate",  
    # ]  
    # ///  
    import argparse  
    import os  
    import re  
    import replicate  
    import uuid  
    
    DEFAULT_MODEL = "czue/me-v1"  
    DEFAULT_COUNT = 1  
    
    def get_input(prompt, model=DEFAULT_MODEL, count=DEFAULT_COUNT):  
        return {  
            "prompt": prompt,  
            "hf_lora": model,  
            "num_outputs": count  
        }  
    
    def main():  
        parser = argparse.ArgumentParser()  
        parser.add_argument("prompt", help="Prompt for the photo")  
        parser.add_argument("--model", default=DEFAULT_MODEL,  
                          help="Model to use (default: %(default)s)")  
        parser.add_argument("--count", default=DEFAULT_COUNT,  
                          help="Number of photos to generate (default: %(default)s)", type=int)  
        args = parser.parse_args()  
    
        input = get_input(args.prompt, args.model, args.count)  
        output = replicate.run(  
            "lucataco/flux-dev-lora:091495765fa5ef2725a175a57b276ec30dc9d39c22d30410f2ede68a3eab66b3",  
            input=input  
        )  
    
        output_dir = "output"  
        os.makedirs(output_dir, exist_ok=True)  
    
        prompt_slug = "-".join(args.prompt.split(" ")[-3:])  
        prompt_slug = re.sub(r'[^a-zA-Z0-9\-]', '', prompt_slug).lower()  
    
        for index, item in enumerate(output):  
            file_id = uuid.uuid4().hex[:5]  
            output_path = os.path.join(output_dir, f"{prompt_slug}-{file_id}.webp")  
            with open(output_path, "wb") as file:  
                file.write(item.read())  
                print(f"Saved photo {output_path}")  
    
    if __name__ == "__main__":  
        main()  
    
  • Ejemplo de uso
    uv run main.py "a photo of czue, a 40 year old man, writing a blog post" \  
     --model="czue/me-v1" \  
     --count=4  
    

Resultados

  • El rendimiento del modelo es inconsistente
    • A veces capta bastante bien los rasgos de la persona, pero otras genera a alguien distinto
    • Si se especifican en el prompt detalles como edad o género, la precisión mejora un poco
  • Por ejemplo, "a photo of czue, a 40 year old man, writing a blog post" genera imágenes relativamente consistentes
  • En cambio, "a photo of czue writing a blog post" arrojó resultados mucho más variables
  • Si se incluye a otra persona, aparecen problemas como mezclar rostros
    • Intenté hacer una foto junto a Barack Obama, pero algunas partes de mi cara se reflejaban en Obama y viceversa
  • Aun así, fue lo bastante divertido y útil como para probar varias cosas con mis hijos

Costo

  • No es gratis, pero tampoco tan caro
  • Entrené 3 modelos entre los míos y los de mis hijos, y cada uno costó alrededor de ~$2.50
  • Generar imágenes cuesta unos $0.03 por imagen, así que incluso 30 imágenes salen en torno a $1
  • En todo el experimento gasté menos de $10 y quedé satisfecho porque el costo fue menor de lo esperado
  • Si te interesa entrenar modelos de IA y generar imágenes, vale la pena intentarlo porque es mucho más accesible de lo que parece

5 comentarios

 
cladio 2025-02-04

Lo probé por curiosidad y de verdad es muy fácil.
(https://www.youtube.com/watch?v=sNpQ9ULDMoo)
Me la pasé riéndome un buen rato mientras probaba hacer de todo...

 
botplaysdice 2025-02-04

¿Al final no intentaremos subir a la red, antes de morir, un modelo entrenado para ser como yo y luego morir? Como un instinto de supervivencia... Aunque eso no sea "yo".

 
sollscherr 2025-02-03

Al ver esta tecnología, me acordé de una novela y quería compartirla. Es el cuento corto llamado "Cronos", incluido en Bisutbangul Pong, una colección de relatos publicada por la escritora Lee Yu-ri. Trata sobre una IA que almacena y aprende de los datos de una persona, es decir, de uno mismo. Como el gato de ese comentario. La usa una mamá con demencia antes de que sus síntomas empeoren más. Y luego sus hijos entran en conflicto. A veces les da consuelo y a la vez les provoca culpa. Si te interesa esta tecnología, o también la historia de ese gato, te recomiendo leerlo.

 
xguru 2025-02-03

Un comentario de Hacker News llama la atención

  • Hice algo así por mi gato fallecido, al que quería mucho. Me gustó el resultado, pero en algún momento de repente me dio escalofríos pensar en lo que estaba haciendo
    • Parece que podría convertirse en un gran negocio. Probablemente envié cientos de miles de correos, mensajes de texto y chats, así que es totalmente posible entrenar con el corpus de comunicación de un ser querido para poder chatear con “esa persona” después de que haya fallecido
    • Después de que murió mi padre, hice esto con su voz y configuré una función para poder hablar con un asistente compatible con LLM, de modo que respondiera con la voz y la forma de hablar de mi padre. Fue una época de duelo y de procesarlo todo de una manera muy extraña, y al final pensé que lo que estaba haciendo era realmente raro
    • Esto se parece al episodio "Be Right Back" de Black Mirror

También hay un comentario informativo

  • En el caso de Flux, el codificador de texto tiene muchas más capacidades, y se le puede dar prompts con oraciones mucho más significativas y completas
    • Por eso, se puede reducir el uso de las frases breves separadas por comas que solían verse en Stable Diffusion
  • También hay que hacer lo mismo con las imágenes de entrenamiento. Conviene poner captions a todo lo que no quieras que el modelo recuerde como “yo” (lo que estás haciendo, la ropa que llevas, las personas que te acompañan, los accesorios, etc.)
 
humblebee 2025-02-03

"Cualquier tecnología suficientemente avanzada es indistinguible de la magia - Arthur C. Clarke"

Hasta hace apenas 2 años, esto parecía algo que solo veríamos en una película de ciencia ficción, y ahora de verdad estamos presenciando en tiempo real el momento en que la magia se vuelve realidad 😳