Stable_Diffusion_GPU_vs_CPU#
Stable Diffusion usando una GPU en Google Colaboratory con CUDA#
Basado en Exploring Stable Diffusion in Google Colab using CUDA: A Step-by-Step Tutorial
Se utilizará la GPU, esta aceleración de GPU accesible a través de Google Colab mejorará significativamente la velocidad del proceso. Sin una GPU, ejecutar el modelo en una CPU podría tomar aproximadamente de 100 veces más tiempo que si se usa una GPU.
Recuerda activar un Entorno de ejecución con GPU.#
Instalación de librerías#
!pip install pycuda
!pip install diffusers
!pip install transformers
!pip install accelerate
Collecting pycuda
Downloading pycuda-2023.1.tar.gz (1.7 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 11.5 MB/s eta 0:00:00
?25h Installing build dependencies ... ?25l?25hdone
Getting requirements to build wheel ... ?25l?25hdone
Preparing metadata (pyproject.toml) ... ?25l?25hdone
Collecting pytools>=2011.2 (from pycuda)
Downloading pytools-2023.1.1-py2.py3-none-any.whl (70 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 70.6/70.6 kB 10.4 MB/s eta 0:00:00
?25hRequirement already satisfied: appdirs>=1.4.0 in /usr/local/lib/python3.10/dist-packages (from pycuda) (1.4.4)
Collecting mako (from pycuda)
Downloading Mako-1.3.0-py3-none-any.whl (78 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 78.6/78.6 kB 12.2 MB/s eta 0:00:00
?25hRequirement already satisfied: platformdirs>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from pytools>=2011.2->pycuda) (4.0.0)
Requirement already satisfied: typing-extensions>=4.0 in /usr/local/lib/python3.10/dist-packages (from pytools>=2011.2->pycuda) (4.5.0)
Requirement already satisfied: MarkupSafe>=0.9.2 in /usr/local/lib/python3.10/dist-packages (from mako->pycuda) (2.1.3)
Building wheels for collected packages: pycuda
Building wheel for pycuda (pyproject.toml) ... ?25l?25hdone
Created wheel for pycuda: filename=pycuda-2023.1-cp310-cp310-linux_x86_64.whl size=661263 sha256=d03ef529b620b8b683cca7a5ab98c71ab2bacdb1ad183632eafd120a2913770f
Stored in directory: /root/.cache/pip/wheels/46/65/06/b997165edd2fd9690c3497ca54ea4485b571d7bd959c21c6c4
Successfully built pycuda
Installing collected packages: pytools, mako, pycuda
Successfully installed mako-1.3.0 pycuda-2023.1 pytools-2023.1.1
Collecting diffusers
Downloading diffusers-0.23.1-py3-none-any.whl (1.7 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 13.4 MB/s eta 0:00:00
?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.10/dist-packages (from diffusers) (9.4.0)
Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from diffusers) (3.13.1)
Requirement already satisfied: huggingface-hub>=0.13.2 in /usr/local/lib/python3.10/dist-packages (from diffusers) (0.19.3)
Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.10/dist-packages (from diffusers) (6.8.0)
Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from diffusers) (1.23.5)
Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from diffusers) (2023.6.3)
Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from diffusers) (2.31.0)
Requirement already satisfied: safetensors>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from diffusers) (0.4.0)
Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.13.2->diffusers) (2023.6.0)
Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.13.2->diffusers) (4.66.1)
Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.13.2->diffusers) (6.0.1)
Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.13.2->diffusers) (4.5.0)
Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.13.2->diffusers) (23.2)
Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata->diffusers) (3.17.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers) (3.4)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers) (2.0.7)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->diffusers) (2023.7.22)
Installing collected packages: diffusers
Successfully installed diffusers-0.23.1
Requirement already satisfied: transformers in /usr/local/lib/python3.10/dist-packages (4.35.2)
Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.13.1)
Requirement already satisfied: huggingface-hub<1.0,>=0.16.4 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.19.3)
Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.23.5)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.2)
Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0.1)
Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2023.6.3)
Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.31.0)
Requirement already satisfied: tokenizers<0.19,>=0.14 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.15.0)
Requirement already satisfied: safetensors>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.4.0)
Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.66.1)
Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.16.4->transformers) (2023.6.0)
Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.16.4->transformers) (4.5.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.7)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2023.7.22)
Collecting accelerate
Downloading accelerate-0.24.1-py3-none-any.whl (261 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 261.4/261.4 kB 5.6 MB/s eta 0:00:00
?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from accelerate) (1.23.5)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from accelerate) (23.2)
Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from accelerate) (5.9.5)
Requirement already satisfied: pyyaml in /usr/local/lib/python3.10/dist-packages (from accelerate) (6.0.1)
Requirement already satisfied: torch>=1.10.0 in /usr/local/lib/python3.10/dist-packages (from accelerate) (2.1.0+cu118)
Requirement already satisfied: huggingface-hub in /usr/local/lib/python3.10/dist-packages (from accelerate) (0.19.3)
Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (3.13.1)
Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (4.5.0)
Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (1.12)
Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (3.2.1)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (3.1.2)
Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (2023.6.0)
Requirement already satisfied: triton==2.1.0 in /usr/local/lib/python3.10/dist-packages (from torch>=1.10.0->accelerate) (2.1.0)
Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface-hub->accelerate) (2.31.0)
Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub->accelerate) (4.66.1)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch>=1.10.0->accelerate) (2.1.3)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (3.4)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (2.0.7)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub->accelerate) (2023.7.22)
Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch>=1.10.0->accelerate) (1.3.0)
Installing collected packages: accelerate
Successfully installed accelerate-0.24.1
Carga de librerías#
# Importando la biblioteca PyTorch para construir y entrenar redes neuronales
import torch
# Importando StableDiffusionPipeline para utilizar modelos preentrenados de Stable Diffusion
from diffusers import StableDiffusionPipeline
# Image es una clase del módulo PIL para visualizar imágenes en un cuaderno de Python
from PIL import Image
# Para medir tiempos
import time
# Mostrar imágenes
import matplotlib.pyplot as plt
The cache for model files in Transformers v4.22.0 has been updated. Migrating your old cache. This is a one-time only operation. You can interrupt this and resume the migration later on by calling `transformers.utils.move_cache()`.
Verificación de GPU y CUDA#
import pycuda.driver as drv
import pycuda.autoinit
drv.init()
print("%d device(s) found." % drv.Device.count())
for i in range(drv.Device.count()):
dev = drv.Device(i)
print(" Device #%d: %s" % (i, dev.name()))
print(" Compute Capability: %d.%d" % dev.compute_capability())
print(" Total Memory: %s GB" % (dev.total_memory() // (1024 * 1024 * 1024)))
1 device(s) found.
Device #0: Tesla T4
Compute Capability: 7.5
Total Memory: 14 GB
Stable Diffusion funciones#
def generate_image_grid(text_prompt, n_images=4, rows=2, cols=2, output_size=(200, 200)):
prompt = [text_prompt] * n_images
images = pipeline(prompt).images
# Verifica si la cuadrícula tiene un solo elemento
if n_images == 1:
return images[0]
# Muestra las imágenes por separado con matplotlib
fig, axs = plt.subplots(rows, cols, figsize=(8, 8))
for i, ax in enumerate(axs.flat):
# Si hay menos imágenes que elementos en la cuadrícula, oculta los ejes sobrantes
if i < len(images):
ax.imshow(images[i])
ax.axis('off')
else:
ax.axis('off')
plt.show()
Stable Diffusion en GPU#
# Creating the pipeline for GPU
pipeline = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4",torch_dtype=torch.float16)
# Moving pipeline to GPU
pipeline = pipeline.to('cuda')
`text_config_dict` is provided which will be used to initialize `CLIPTextConfig`. The value `text_config["id2label"]` will be overriden.
`text_config_dict` is provided which will be used to initialize `CLIPTextConfig`. The value `text_config["bos_token_id"]` will be overriden.
`text_config_dict` is provided which will be used to initialize `CLIPTextConfig`. The value `text_config["eos_token_id"]` will be overriden.
prompt = 'a cute magical flying german shepherd puppy wearing a superman cape, \
fantasy art drawn by disney concept artists, golden colour, high quality, \
highly detailed, elegant, sharp focus, concept art, character concepts, \
digital painting, mystery, adventure'
start_time = time.time()
generate_image_grid(text_prompt=prompt, n_images=2, rows=1, cols=2, output_size=(512, 512))
end_time = time.time()
elapsed_timeGPU = end_time - start_time
print(f"Tiempo transcurrido: {round(elapsed_timeGPU, 2)} segundos")
print(f"Tiempo transcurrido: {round(elapsed_timeGPU / 60, 2)} minutos")
Tiempo transcurrido: 21.2 segundos
Tiempo transcurrido: 0.35 minutos
Stable Diffusion en CPU#
# Creating the pipeline for CPU
pipeline = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
`text_config_dict` is provided which will be used to initialize `CLIPTextConfig`. The value `text_config["id2label"]` will be overriden.
`text_config_dict` is provided which will be used to initialize `CLIPTextConfig`. The value `text_config["bos_token_id"]` will be overriden.
`text_config_dict` is provided which will be used to initialize `CLIPTextConfig`. The value `text_config["eos_token_id"]` will be overriden.
prompt = 'a cute magical flying german shepherd puppy wearing a superman cape, \
fantasy art drawn by disney concept artists, golden colour, high quality, \
highly detailed, elegant, sharp focus, concept art, character concepts, \
digital painting, mystery, adventure'
start_time = time.time()
generate_image_grid(text_prompt=prompt, n_images = 2, rows=1, cols = 2, output_size=(512, 512))
end_time = time.time()
elapsed_timeCPU = end_time - start_time
print(f"Tiempo transcurrido: {round(elapsed_timeCPU, 2)} segundos")
print(f"Tiempo transcurrido: {round(elapsed_timeCPU / 60, 2)} minutos")
Tiempo transcurrido: 2182.16 segundos
Tiempo transcurrido: 36.37 minutos
Comparemos la GPU con la CPU#
speedup_factor = elapsed_timeCPU / elapsed_timeGPU
print(f"La ejecución en GPU fue aproximadamente {speedup_factor:.2f} veces más rápida que en CPU.")
La ejecución en GPU fue aproximadamente 102.91 veces más rápida que en CPU.