Skip to content

Instantly share code, notes, and snippets.

@sssemil
Created March 5, 2024 16:13
Show Gist options
  • Save sssemil/1d7026261312e40dcd5379eb130a7db6 to your computer and use it in GitHub Desktop.
Save sssemil/1d7026261312e40dcd5379eb130a7db6 to your computer and use it in GitHub Desktop.
Difference in inference speed for SDXL on a 4090 with 4 vs 16 PCIe 4.0 lanes

Summary

txt2img sdxl 1024x1024

65.417351÷65.623950=0.996851774

img2img sdxl 1024x1024 (input 1024x1024 image)

54.623950÷55.738662=0.980001099

4090 16xPCIe4.0

$ python main.py
~/miniconda3/envs/torch_cuda_jup/lib/python3.11/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.
  torch.utils._pytree._register_pytree_node(
~/miniconda3/envs/torch_cuda_jup/lib/python3.11/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.
  torch.utils._pytree._register_pytree_node(
Loading pipeline components...: 100%|█████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 21.89it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  7.95it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.09it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.09it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.09it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.08it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.07it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.06it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.05it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.04it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.04it/s]
Text-to-Image Benchmark: 10 iterations took 0:01:05.417351.
$ python main.py
~/miniconda3/envs/torch_cuda_jup/lib/python3.11/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.
  torch.utils._pytree._register_pytree_node(
~/miniconda3/envs/torch_cuda_jup/lib/python3.11/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.
  torch.utils._pytree._register_pytree_node(
Loading pipeline components...: 100%|█████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 21.22it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.02it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.11it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.11it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.10it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.10it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.11it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.10it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.11it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.11it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.11it/s]
Image-to-Image Benchmark: 10 iterations took 0:00:54.623950.

4090 4xPCIe4.0

$ python main.py
~/miniconda3/envs/torch_cuda_jup/lib/python3.11/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.
  torch.utils._pytree._register_pytree_node(
~/miniconda3/envs/torch_cuda_jup/lib/python3.11/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.
  torch.utils._pytree._register_pytree_node(
Loading pipeline components...: 100%|█████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 21.68it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  7.87it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.01it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.01it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.01it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.00it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.00it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.00it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.00it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  7.99it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:06<00:00,  8.00it/s]
Text-to-Image Benchmark: 10 iterations took 0:01:05.950096.
$ python main.py
~/miniconda3/envs/torch_cuda_jup/lib/python3.11/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.
  torch.utils._pytree._register_pytree_node(
~/miniconda3/envs/torch_cuda_jup/lib/python3.11/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead.
  torch.utils._pytree._register_pytree_node(
Loading pipeline components...: 100%|█████████████████████████████████████████████████████████████████████| 7/7 [00:04<00:00,  1.71it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:05<00:00,  7.81it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.01it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.03it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.02it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:05<00:00,  7.99it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.01it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.01it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:05<00:00,  7.99it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.01it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:04<00:00,  8.00it/s]
Image-to-Image Benchmark: 10 iterations took 0:00:55.738662.

Code

import torch
from diffusers import AutoPipelineForText2Image, AutoPipelineForImage2Image, utils
from datetime import datetime
import numpy as np

def benchmark_text_to_image(N=10, height=1024, width=1024):
    pipeline = AutoPipelineForText2Image.from_pretrained(
        "stabilityai/stable-diffusion-xl-base-1.0",
        torch_dtype=torch.float16,
        variant="fp16",
        use_safetensors=True
    ).to("cuda")

    prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
    start_time = datetime.now()

    for i in range(N):
        torch.manual_seed(i)
        image = pipeline(prompt=prompt, height=height, width=width, generator=torch.Generator("cuda").manual_seed(i)).images[0]

    end_time = datetime.now()
    print(f"Text-to-Image Benchmark: {N} iterations took {end_time - start_time}.")

def benchmark_image_to_image(N=10, height=1024, width=1024):
    text_to_image_pipeline = AutoPipelineForText2Image.from_pretrained(
        "stabilityai/stable-diffusion-xl-base-1.0",
        torch_dtype=torch.float16,
        variant="fp16",
        use_safetensors=True
    ).to("cuda")

    pipeline = AutoPipelineForImage2Image.from_pipe(text_to_image_pipeline).to("cuda")
    url = "https://esnx.xyz/imgs/sosig.png"
    init_image = utils.load_image(url)

    prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
    start_time = datetime.now()

    for i in range(N):
        torch.manual_seed(i)
        modified_image = pipeline(prompt=prompt, image=init_image, strength=0.8, guidance_scale=10.5, height=height, width=width, generator=torch.Generator("cuda").manual_seed(i)).images[0]

    end_time = datetime.now()
    print(f"Image-to-Image Benchmark: {N} iterations took {end_time - start_time}.")

Versions

$ nvidia-smi
Tue Mar  5 17:02:51 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14              Driver Version: 550.54.14      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 4090        Off |   00000000:0A:00.0 Off |                  Off |
|  0%   24C    P8             10W /  450W |       1MiB /  24564MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+
$ pip freeze | grep -P "torch|diffusers|transformers"
diffusers==0.26.3
torch==2.2.1
torchaudio==2.2.1
torchvision==0.17.1
transformers==4.38.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment