Cómo usar Flux Schnell localmente en un MacBook Pro M3 Max

¿Quieres probar FLUX en línea sin complicaciones adicionales? ¡Puedes ejecutar FLUX.1 Pro, Schnell y Dev en Anakin AI ahora! Flux Schnell es un robusto modelo de generación de texto a imagen capaz de producir imágenes de alta calidad a partir de indicaciones textuales. En este tutorial, te guiaremos a

Build APIs Faster & Together in Apidog

Cómo usar Flux Schnell localmente en un MacBook Pro M3 Max

Start for free
Inhalte
¿Quieres probar FLUX en línea sin complicaciones adicionales?

¡Puedes ejecutar FLUX.1 Pro, Schnell y Dev en Anakin AI ahora!

Flux Schnell es un robusto modelo de generación de texto a imagen capaz de producir imágenes de alta calidad a partir de indicaciones textuales. En este tutorial, te guiaremos a través de los pasos para configurar y ejecutar Flux Schnell localmente en un MacBook Pro M3 Max. Esta configuración permite una generación eficiente de imágenes aprovechando hasta 40 GB de RAM, con cada imagen tardando alrededor de 30 segundos en producirse.

Requisitos para Ejecutar Flux.1 Pro en Mac Localmente

Antes de comenzar, asegúrate de que tu sistema cumpla con los siguientes requisitos:

  • MacBook Pro con chip M3 Max
  • macOS (se recomienda la última versión)
  • Al menos 40 GB de RAM disponible
  • Anaconda o Miniconda instalado
  • Conexión a Internet para descargar dependencias

Tutorial Paso a Paso para Ejecutar Flux.1 Pro en Mac Localmente

Tutorial Paso a Paso para Ejecutar Flux.1 Pro en Mac Localmente

Paso 1: Configurar el Entorno

Primero, crearemos un nuevo entorno de Conda y lo activaremos:

conda create -n flux python=3.11
conda activate flux

Paso 2: Instalar Dependencias

Ahora, instalaremos los paquetes requeridos:

pip install torch==2.3.1
pip install git+https://github.com/huggingface/diffusers.git
pip install transformers==4.43.3 sentencepiece==0.2.0 accelerate==0.33.0 protobuf==5.27.3

Paso 3: Preparar el Script de Python

Crea un nuevo archivo de Python llamado flux_schnell.py y agrega el siguiente código:

import torch
from diffusers import FluxPipeline
import diffusers# Modificar la función rope para manejar el dispositivo MPS
_flux_rope = diffusers.models.transformers.transformer_flux.rope
def new_flux_rope(pos: torch.Tensor, dim: int, theta: int) -> torch.Tensor:
   assert dim % 2 == 0, "La dimensión debe ser par."
   if pos.device.type == "mps":
       return _flux_rope(pos.to("cpu"), dim, theta).to(device=pos.device)
   else:
       return _flux_rope(pos, dim, theta)
diffusers.models.transformers.transformer_flux.rope = new_flux_rope
# Cargar el modelo Flux Schnell
pipe = FluxPipeline.from_pretrained(
   "black-forest-labs/FLUX.1-schnell",
   revision='refs/pr/1',
   torch_dtype=torch.bfloat16
).to("mps")
# Definir el aviso
prompt = "Un gato sosteniendo un cartel que dice hola mundo"
# Generar la imagen
out = pipe(
   prompt=prompt,
   guidance_scale=0.,
   height=1024,
   width=1024,
   num_inference_steps=4,
   max_sequence_length=256,
).images[0]
# Guardar la imagen generada
out.save("flux_image.png")

Paso 4: Ejecutar el Script

Ejecuta el script de Python:

python flux_schnell.py

Esto generará una imagen basada en el aviso “Un gato sosteniendo un cartel que dice hola mundo” y la guardará como “flux_image.png” en el mismo directorio.

Entendiendo el Código

Vamos a desglosar los componentes clave del script:

Importando Dependencias

import torch
from diffusers import FluxPipeline
import diffusers

Estas líneas importan los módulos necesarios: PyTorch para operaciones con tensores, FluxPipeline de la biblioteca diffusers para usar el modelo Flux Schnell y el módulo diffusers para utilidades adicionales.

Modificando la Función Rope

_flux_rope = diffusers.models.transformers.transformer_flux.rope
def new_flux_rope(pos: torch.Tensor, dim: int, theta: int) -> torch.Tensor:
   assert dim % 2 == 0, "La dimensión debe ser par."
   if pos.device.type == "mps":
       return _flux_rope(pos.to("cpu"), dim, theta).to(device=pos.device)
   else:
       return _flux_rope(pos, dim, theta)diffusers.models.transformers.transformer_flux.rope = new_flux_rope

Esta sección modifica la función rope (Rotary Position Embedding) para manejar el dispositivo MPS (Metal Performance Shaders) utilizado en los chips de Apple Silicon. Asegura la compatibilidad con el chip M3 Max moviendo los tensores a la CPU cuando sea necesario.

Cargando el Modelo

pipe = FluxPipeline.from_pretrained(
   "black-forest-labs/FLUX.1-schnell",
   revision='refs/pr/1',
   torch_dtype=torch.bfloat16
).to("mps")

Este código carga el modelo Flux Schnell desde el repositorio de modelos de Hugging Face. Especifica la versión del modelo, establece el tipo de datos en bfloat16 para eficiencia y mueve el modelo al dispositivo MPS.

Generando la Imagen

prompt = "Un gato sosteniendo un cartel que dice hola mundo"out = pipe(
   prompt=prompt,
   guidance_scale=0.,
   height=1024,
   width=1024,
   num_inference_steps=4,
   max_sequence_length=256,
).images[0]

Aquí, definimos el aviso y usamos el modelo cargado para generar una imagen. Los parámetros controlan varios aspectos del proceso de generación:

  • guidance_scale: Establecido en 0 para generación incondicional.
  • height y width: Establecen las dimensiones de la imagen de salida en 1024x1024 píxeles.
  • num_inference_steps: Controla el número de pasos de denoising (4 en este caso para una generación más rápida).
  • max_sequence_length: Limita la longitud máxima de la secuencia de entrada.

Guardando la Imagen

out.save("flux_image.png")

Finalmente, esta línea guarda la imagen generada como un archivo PNG llamado “flux_image.png” en el directorio actual.

Optimizando el Rendimiento

Para aprovechar al máximo tu MacBook Pro M3 Max y lograr un tiempo de generación de ~30 segundos con hasta 40 GB de uso de RAM, considera los siguientes consejos:

  1. Cierra aplicaciones innecesarias: Asegúrate de que otras aplicaciones que consumen recursos estén cerradas para liberar RAM y recursos de CPU.
  2. Ajusta las dimensiones de la imagen: Si necesitas tiempos de generación más rápidos, puedes reducir los parámetros de height y width. Inversamente, puedes aumentarlos para obtener mayor calidad a costa de tiempos de generación más largos.
  3. Experimenta con num_inference_steps: Aumentar este valor puede llevar a imágenes de mayor calidad pero aumentará el tiempo de generación. Disminuirlo acelerará el proceso pero puede reducir la calidad de la imagen.
  4. Usa precisión bfloat16: Como ya se implementó en el script, usar el tipo de datos torch.bfloat16 ayuda a reducir el uso de memoria y potencialmente aumentar la velocidad sin pérdida significativa de calidad.
  5. Procesamiento por lotes: Si necesitas generar múltiples imágenes, considera implementar procesamiento por lotes para hacer un uso más eficiente de la GPU.

Resolución de Problemas

Si encuentras algún problema al ejecutar Flux Schnell en tu MacBook Pro M3 Max, prueba lo siguiente:

  1. Actualiza las dependencias: Asegúrate de que todos los paquetes estén actualizados, especialmente PyTorch y diffusers.
  2. Verifica la compatibilidad de CUDA: Aunque el M3 Max utiliza MPS, podrían ocurrir algunos errores relacionados con CUDA. Asegúrate de que estás usando las versiones correctas de PyTorch y bibliotecas relacionadas para tu sistema.
  3. Monitorea el uso de recursos: Usa el Monitor de Actividad para estar al tanto del uso de RAM y CPU. Si estás alcanzando constantemente los límites, puede que necesites ajustar los parámetros del modelo o liberar más recursos del sistema.
  4. Limpia la caché: Si encuentras errores relacionados con la memoria, intenta limpiar la caché de PyTorch:

torch.cuda.empty_cache()

5. Reiniciar el núcleo: Si estás usando un cuaderno de Jupyter o un entorno similar, intenta reiniciar el núcleo si encuentras errores persistentes.

Conclusión

Ejecutar Flux Schnell localmente en tu MacBook Pro M3 Max ofrece potentes capacidades de generación de texto a imagen. Con la configuración descrita en este tutorial, puedes crear imágenes de alta calidad a partir de descripciones textuales en aproximadamente 30 segundos, utilizando hasta 40 GB de RAM. Ten en cuenta que el rendimiento puede variar según tu hardware y la complejidad de los avisos.

No dudes en experimentar con diferentes parámetros para lograr el mejor equilibrio entre velocidad y calidad de imagen para tus necesidades. A medida que los modelos de IA y el hardware continúan avanzando, resultados aún más impresionantes están en el horizonte. ¡Feliz generación!