Nach einem Jahr der Verzögerung freue ich mich, Ihnen mitteilen zu können, dass ich ein neues Projekt erstellen möchte, um alle Modelle mit ComfyUI die schnellste Inferenzgeschwindigkeit zu bieten. Es hat gerade begonnen und ich hoffe, es wird ein großartiges Projekt? .. Bitte konzentrieren Sie sich weiter darauf und geben Sie mir Feedbacks?!
NOTIZ
Die aktive Entwicklung am stable-fast wurde inne. Ich SD3 derzeit an Sora neuen torch._dynamo stable-cascade Es wäre schneller und flexibler und unterstützt mehr Hardware -Backends als CUDA .
Der Kontakt ist begrüßt.
Discord -Kanal
stable-fast erzielt die SOTA-Inferenzleistung bei allen Arten von Diffusor-Modellen auch mit der neuesten StableVideoDiffusionPipeline . Und im Gegensatz zu TensorRT oder AITemplate , das Dutzende von Minuten dauert, um ein Modell zu erstellen, dauert stable-fast nur einige Sekunden, um ein Modell zu erstellen. stable-fast unterstützt auch dynamic shape , LoRA und ControlNet nicht in der Box.
| Modell | Fackel | Torch.comPile | Ait | Einfluss | Tensorrt | Stallschnitzel |
|---|---|---|---|---|---|---|
| SD 1.5 (MS) | 1897 | 1510 | 1158 | 1003 | 991 | 995 |
| SVD-X (s) | 83 | 70 | 47 |
Hinweis : Während des Benchmarking wird TensorRT mit static batch size und CUDA Graph enabled getestet, während stable-fast mit dynamischer Form ausgeführt wird.
stable-fast ist ein ultra-leichtes Inferenzoptimierungsrahmen zum Umarmungsfaktor-Diffusoren auf NVIDIA-GPUs . stable-fast bietet eine superschnelle Inferenzoptimierung, indem einige Schlüsseltechniken und -funktionen verwendet werden:
stable-fast implementiert eine Reihe voll funktionsfähiger und vollständig kompatibler Cudnn-Faltungsfusion-Operatoren für alle Arten von Kombinationen von Conv + Bias + Add + Act Rechenmuster.stable-fast Implementierung einer Reihe von fusionierten Gemmm-Operatoren, die mit fp16 Präzision berechnen, was schnell ist als die Standardeinstellungen von Pytorch (lesen und schreiben Sie mit fp16 während Sie mit fp32 berechnen).stable-fast kann GEGLU(x, W, V, b, c) = GELU(xW + b) ⊗ (xV + c) in einen Cuda-Kernel verschmelzen.stable-fast Implementierung eines hoch optimierten fusionierten NHWC GroupNorm + Silu Operators mit OpenAIs Triton , das die Notwendigkeit des Speicherformatpermutationsbetreibers beseitigt.stable-fast verbessert die Schnittstelle torch.jit.trace , um sie für die Verfolgung komplexer Modelle besser zu machen. Fast jeder Teil der StableDiffusionPipeline/StableVideoDiffusionPipeline kann nachverfolgt und in Torchscript umgewandelt werden. Es ist stabiler als torch.compile und hat einen deutlich niedrigeren CPU -Overhead als torch.compile und unterstützt ControlNet und Lora .stable-fast kann das UNet , VAE und TextEncoder in das CUDA-Diagrammformat erfassen, das den CPU-Overhead bei geringem Stapelgröße reduzieren kann. Dieses Implemention unterstützt auch dynamische Form.stable-fast verwendet nur Xformers und macht es mit Torchscript kompatibel. Mein nächstes Ziel ist es, stable-fast als eines der schnellsten Inferenzoptimierungsrahmen für diffusers zu bleiben und sowohl eine Geschwindigkeits- als auch die VRAM-Reduktion für transformers zu liefern. Tatsächlich verwende ich bereits stable-fast um LLMs zu optimieren und eine signifikante Beschleunigung zu erreichen. Aber ich muss noch einige Arbeiten erledigen, um es stabiler und einfacher zu verwenden und eine stabile Benutzeroberfläche bereitzustellen.
stable-fast ist speziell optimiert für Umarmungsdiffusoren . Es erzielt eine hohe Leistung in vielen Bibliotheken. Und es bietet eine sehr schnelle Kompilierungsgeschwindigkeit innerhalb von nur wenigen Sekunden. Es ist erheblich schneller als torch.compile , TensorRT und AITemplate in der Kompilierungszeit.stable-fast funktioniert als Plugin-Framework für PyTorch . Es wird vorhandene PyTorch Funktionalität und -infrastrukturen verwendet und ist mit anderen Beschleunigertechniken sowie beliebten Feinabstimmentechniken und Bereitstellungslösungen kompatibel.stable-fast ist mit allen Arten von HuggingFace Diffusers und PyTorch -Versionen kompatibel. Es ist auch mit ControlNet und LoRA kompatibel. Und es unterstützt sogar die neueste StableVideoDiffusionPipeline aus der Schachtel! HINWEIS : stable-fast wird derzeit nur unter Linux und WSL2 in Windows getestet. Sie müssen Pytorch zunächst mit CUDA -Unterstützung installieren (Versionen von 1,12 bis 2.1 werden vorgeschlagen).
Ich teste nur stable-fast mit torch>=2.1.0 , xformers>=0.0.22 und triton>=2.1.0 auf CUDA 12.1 und Python 3.10 . Andere Versionen können erfolgreich aufbauen und ausgeführt werden, aber das ist nicht garantiert.
Laden Sie das Rad herunter, das Ihrem System entsprechend der Releases -Seite entspricht, und installieren Sie es mit pip3 install <wheel file> .
Derzeit sind sowohl Linux- als auch Windows -Räder verfügbar.
# Change cu121 to your CUDA version and <wheel file> to the path of the wheel file.
# And make sure the wheel file is compatible with your PyTorch version.
pip3 install --index-url https://download.pytorch.org/whl/cu121
' torch>=2.1.0 ' ' xformers>=0.0.22 ' ' triton>=2.1.0 ' ' diffusers>=0.19.3 '
' <wheel file> ' # Make sure you have CUDNN/CUBLAS installed.
# https://developer.nvidia.com/cudnn
# https://developer.nvidia.com/cublas
# Install PyTorch with CUDA and other packages at first.
# Windows user: Triton might be not available, you could skip it.
# NOTE: 'wheel' is required or you will meet `No module named 'torch'` error when building.
pip3 install wheel ' torch>=2.1.0 ' ' xformers>=0.0.22 ' ' triton>=2.1.0 ' ' diffusers>=0.19.3 '
# (Optional) Makes the build much faster.
pip3 install ninja
# Set TORCH_CUDA_ARCH_LIST if running and building on different GPU types.
# You can also install the latest stable release from PyPI.
# pip3 install -v -U stable-fast
pip3 install -v -U git+https://github.com/chengzeyi/stable-fast.git@main#egg=stable-fast
# (this can take dozens of minutes) Hinweis : Jede Verwendung außerhalb sfast.compilers ist nicht garantiert rückwärtskompatibel.
Hinweis : Um die beste Leistung zu erzielen, müssen xformers und OpenAIs triton>=2.1.0 installiert und aktiviert werden. Möglicherweise müssen Sie xformers aus der Quelle erstellen, um sie mit Ihrem PyTorch kompatibel zu machen.
stable-fast ist in der Lage, StableDiffusionPipeline und StableDiffusionPipelineXL direkt zu optimieren.
import time
import torch
from diffusers import ( StableDiffusionPipeline ,
EulerAncestralDiscreteScheduler )
from sfast . compilers . diffusion_pipeline_compiler import ( compile ,
CompilationConfig )
def load_model ():
model = StableDiffusionPipeline . from_pretrained (
'runwayml/stable-diffusion-v1-5' ,
torch_dtype = torch . float16 )
model . scheduler = EulerAncestralDiscreteScheduler . from_config (
model . scheduler . config )
model . safety_checker = None
model . to ( torch . device ( 'cuda' ))
return model
model = load_model ()
config = CompilationConfig . Default ()
# xformers and Triton are suggested for achieving best performance.
try :
import xformers
config . enable_xformers = True
except ImportError :
print ( 'xformers not installed, skip' )
try :
import triton
config . enable_triton = True
except ImportError :
print ( 'Triton not installed, skip' )
# CUDA Graph is suggested for small batch sizes and small resolutions to reduce CPU overhead.
# But it can increase the amount of GPU memory used.
# For StableVideoDiffusionPipeline it is not needed.
config . enable_cuda_graph = True
model = compile ( model , config )
kwarg_inputs = dict (
prompt =
'(masterpiece:1,2), best quality, masterpiece, best detailed face, a beautiful girl' ,
height = 512 ,
width = 512 ,
num_inference_steps = 30 ,
num_images_per_prompt = 1 ,
)
# NOTE: Warm it up.
# The initial calls will trigger compilation and might be very slow.
# After that, it should be very fast.
for _ in range ( 3 ):
output_image = model ( ** kwarg_inputs ). images [ 0 ]
# Let's see it!
# Note: Progress bar might work incorrectly due to the async nature of CUDA.
begin = time . time ()
output_image = model ( ** kwarg_inputs ). images [ 0 ]
print ( f'Inference time: { time . time () - begin :.3f } s' )
# Let's view it in terminal!
from sfast . utils . term_image import print_image
print_image ( output_image , max_width = 80 )Weitere Informationen finden Sie unter Beispiele/optimize_stable_diffusion_pipeline.py.
Sie können dieses Colab überprüfen, um zu sehen, wie es bei T4 GPU funktioniert:
stable-fast ist in der Lage, die neueste latent consistency model zu optimieren und eine signifikante Beschleunigung zu erreichen.
Weitere Informationen zum Optimieren des normalen SD -Modells mit LCM LORA finden Sie unter Beispiele/optimize_lcm_pipeline.py. Weitere Informationen zum Optimieren des eigenständigen LCM -Modells finden Sie unter Beispiele/optimize_lcm_pipeline.py.
StableVideoDiffusionPipeline stable-fast 2x
Weitere Informationen finden Sie unter Beispiele/optimize_stable_video_diffusion_pipeline.py
Das Dynamiker des Lora wird unterstützt, aber Sie müssen zusätzliche Arbeiten erledigen. Es ist möglich, weil der kompilierte Diagramm und CUDA Graph mit dem ursprünglichen UNET -Modell die gleichen Unterlagendaten (Zeiger) haben. Sie müssen also lediglich die Parameter des ursprünglichen UNET -Modells in der Stelle aktualisieren.
Der folgende Code geht davon aus, dass Sie bereits eine Lora geladen und das Modell kompiliert haben und zu einer anderen Lora wechseln möchten.
Wenn Sie das CUDA -Diagramm nicht aktivieren und preserve_parameters = True halten, könnten die Dinge viel einfacher sein. Der folgende Code ist möglicherweise nicht einmal erforderlich.
# load_state_dict with assign=True requires torch >= 2.1.0
def update_state_dict ( dst , src ):
for key , value in src . items ():
# Do inplace copy.
# As the traced forward function shares the same underlaying data (pointers),
# this modification will be reflected in the traced forward function.
dst [ key ]. copy_ ( value )
# Switch "another" LoRA into UNet
def switch_lora ( unet , lora ):
# Store the original UNet parameters
state_dict = unet . state_dict ()
# Load another LoRA into unet
unet . load_attn_procs ( lora )
# Inplace copy current UNet parameters to the original unet parameters
update_state_dict ( state_dict , unet . state_dict ())
# Load the original UNet parameters back.
# We use assign=True because we still want to hold the references
# of the original UNet parameters
unet . load_state_dict ( state_dict , assign = True )
switch_lora ( compiled_model . unet , lora_b_path ) stable-fast erweitert die quantize_dynamic Funktionalität von Pytorch und bietet einen dynamisch quantisierten linearen Operator im CUDA-Backend. Durch die Aktivierung können Sie eine leichte VRAM -Reduktion für diffusers und eine signifikante VRAM -Reduktion für transformers erhalten und eine potenzielle Beschleunigung (nicht immer) erhalten.
Für SD XL wird erwartet, dass die VRAM -Reduktion von 2GB mit einer Bildgröße von 1024x1024 feststellt.
def quantize_unet ( m ):
from diffusers . utils import USE_PEFT_BACKEND
assert USE_PEFT_BACKEND
m = torch . quantization . quantize_dynamic ( m , { torch . nn . Linear },
dtype = torch . qint8 ,
inplace = True )
return m
model . unet = quantize_unet ( model . unet )
if hasattr ( model , 'controlnet' ):
model . controlnet = quantize_unet ( model . controlnet )Weitere Informationen finden Sie unter Beispiele/optimize_stable_diffusion_pipeline.py.
# TCMalloc is highly suggested to reduce CPU overhead
# https://github.com/google/tcmalloc
LD_PRELOAD=/path/to/libtcmalloc.so python3 ... import packaging . version
import torch
if packaging . version . parse ( torch . __version__ ) >= packaging . version . parse ( '1.12.0' ):
torch . backends . cuda . matmul . allow_tf32 = True Die Leistung variiert sehr stark in verschiedenen Hardware-/Software-/Plattform-/Treiberkonfigurationen. Es ist sehr schwer, genau zu kontrollieren. Die Vorbereitung der Umgebung für das Benchmarking ist ebenfalls schwierig. Ich habe zuvor auf einigen Plattformen getestet, aber die Ergebnisse können immer noch ungenau sein. Beachten Sie, dass beim Benchmarking die durch tqdm gezeigte Fortschrittsleiste aufgrund der asynchronen Natur von CUDA ungenau sein kann. Um dieses Problem zu lösen, verwende ich CUDA Event um die Geschwindigkeit der Iterationen pro Sekunde genau zu messen.
Es wird erwartet, dass stable-fast bei neueren GPUs und neueren CUDA-Versionen besser funktioniert. Bei älteren GPUs kann die Leistungssteigerung begrenzt sein. Während des Benchmarking kann die Fortschrittsbalken aufgrund der asynchronen Natur von CUDA falsch funktionieren.
Dies ist mein persönlicher Gaming -PC?. Es hat eine leistungsstärkere CPU als die von Cloud -Server -Anbietern.
| Rahmen | SD 1.5 | SD XL (1024x1024) | SD 1.5 ControlNet |
|---|---|---|---|
| Vanille -Pytorch (2.1.0) | 29.5 es/s | 4.6 es/s | 19.7 IT/s |
| Torch.comPile (2.1.0, Max-Autotune) | 40.0 es/s | 6.1 es/s | 21.8 it/s |
| Aitemplate | 44.2 es/s | ||
| Einfluss | 53.6 it/s | ||
| Auto1111 Webui | 17.2 es/s | 3.6 es/s | |
| Auto1111 Webui (mit SDPA) | 24.5 es/s | 4.3 es/s | |
| Tensorrt (Auto1111 Webui) | 40.8 it/s | ||
| Tensorrt Offizielle Demo | 52.6 it/s | ||
| stabiler Schnitt (mit Xformers & Triton) | 51.6 IT/s | 9.1 es/s | 36.7 es/s |
Danke für @ConSceleratus und @Harishps Hilfe, ich habe die Geschwindigkeit auf H100 getestet.
| Rahmen | SD 1.5 | SD XL (1024x1024) | SD 1.5 ControlNet |
|---|---|---|---|
| Vanille -Pytorch (2.1.0) | 54.5 es/s | 14.9 es/s | 35.8 es/s |
| Torch.comPile (2.1.0, Max-Autotune) | 66.0 It/s | 18.5 es/s | |
| stabiler Schnitt (mit Xformers & Triton) | 104.6 es/s | 21.6 it/s | 72.6 it/s |
Vielen Dank für die Hilfe von @SuperSecurehuman und @Jon-Chuang , das Benchmarking auf A100 ist ab sofort erhältlich.
| Rahmen | SD 1.5 | SD XL (1024x1024) | SD 1.5 ControlNet |
|---|---|---|---|
| Vanille -Pytorch (2.1.0) | 35.6 it/s | 8.7 es/s | 25.1 es/s |
| Torch.comPile (2.1.0, Max-Autotune) | 41.9 It/s | 10.0 es/s | |
| stabiler Schnitt (mit Xformers & Triton) | 61.8 it/s | 11.9 es/s | 41.1 it/s |
| Modell | Unterstützt |
|---|---|
| Umarmende Gesichtsdiffusoren (1,5/2,1/xl) | Ja |
| Mit ControlNet | Ja |
| Mit Lora | Ja |
| Latente Konsistenzmodell | Ja |
| SDXL Turbo | Ja |
| Stabile Videodiffusion | Ja |
| Funktionalität | Unterstützt |
|---|---|
| Dynamische Form | Ja |
| Text zum Bild | Ja |
| Bild zu Bild | Ja |
| Bildinstrument | Ja |
| UI -Framework | Unterstützt | Link |
|---|---|---|
| Automatic1111 | Wip | |
| SD als nächstes | Ja | SD Next |
| Bequem | Ja | ComfyUI_stable_fast |
| Betriebssystem | Unterstützt |
|---|---|
| Linux | Ja |
| Fenster | Ja |
| Windows WSL | Ja |
Weitere Informationen finden Sie unter Doc/Fehlerbehebung.md.
Und Sie können sich dem Discord -Kanal anschließen, um um Hilfe zu bitten.