1 년의 지연 후, 나는 ComfyUI 로 실행되는 모든 모델에 가장 빠른 추론 속도를 제공하기 위해 새로운 프로젝트 Comfy-Wavespeed를 구축 할 계획을 발표하게되어 기쁩니다. 방금 시작되었고 훌륭한 프로젝트가되기를 바랍니다. .. 계속 집중하고 나에게 피드백을 주시겠습니까?!
메모
stable-fast 에 대한 적극적인 개발이 일시 중지되었습니다. 나는 현재 새로운 torch._dynamo 연구하고 있습니다 ._dynamo 기반 프로젝트는 stable-cascade , SD3 및 MMODELS와 같은 Sora 와 같은 새로운 모델을 대상으로합니다. 더 빠르고 유연하며 CUDA 보다는 더 많은 하드웨어 백엔드를 지원할 수 있습니다.
연락처가 환영됩니다.
불화 채널
stable-fast 최신 StableVideoDiffusionPipeline 에서도 모든 종류의 디퓨저 모델에서 SOTA 추론 성능을 달성합니다. 또한 모델을 컴파일하는 데 수십 분이 걸리는 TensorRT 또는 AITemplate 달리 stable-fast 모델을 컴파일하는 데 몇 초 밖에 걸리지 않습니다. stable-fast 또한 dynamic shape , LoRA 및 ControlNet 상자 밖으로 지원합니다.
| 모델 | 토치 | Torch.compile | ait | 원 흐름 | Tensorrt | 안정된 빠른 |
|---|---|---|---|---|---|---|
| SD 1.5 (MS) | 1897 | 1510 | 1158 | 1003 | 991 | 995 |
| SVD-XT (S) | 83 | 70 | 47 |
참고 : 벤치마킹 중에 TensorRT static batch size 로 테스트되고 CUDA Graph enabled stable-fast 빠른 형태로 실행됩니다.
stable-fast 은 NVIDIA GPU 의 포옹 페이스 디퓨저를 위한 초경량 추론 최적화 프레임 워크입니다. stable-fast 몇 가지 주요 기술과 기능을 활용하여 매우 빠른 추론 최적화를 제공합니다.
stable-fast Conv + Bias + Add + Act 계산 패턴의 모든 종류의 조합에 대해 일련의 완전 기능적이고 완전한 호환 Cudnn Convolution Fusion 연산자를 구현합니다.stable-fast fp16 정밀도로 계산하는 일련의 퓨즈 GEMM 연산자를 구현합니다. 이는 Pytorch의 기본값보다 빠릅니다 ( fp16 읽고 쓰기 및 쓰기 fp32 로 작성).stable-fast 는 GEGLU(x, W, V, b, c) = GELU(xW + b) ⊗ (xV + c) 하나의 cuda 커널에 융합 할 수 있습니다.stable-fast OpenAI의 Triton 사용하여 고도로 최적화 된 퓨즈 NHWC GroupNorm + Silu 연산자를 구현하여 메모리 형식 순열 연산자의 필요성을 제거합니다.stable-fast torch.jit.trace 개선하여 복잡한 모델을 추적하는 데 더 적합합니다. StableDiffusionPipeline/StableVideoDiffusionPipeline 의 거의 모든 부분을 추적하여 Torchscript 로 변환 할 수 있습니다. torch.compile 보다 안정적이며 torch.compile 보다 CPU 오버 헤드가 상당히 낮으며 Controlnet 및 Lora를 지원합니다.stable-fast UNet , VAE 및 TextEncoder CUDA 그래프 형식으로 캡처 할 수 있으며, 이는 배치 크기가 작을 때 CPU 오버 헤드를 줄일 수 있습니다. 이 구현은 또한 동적 모양을 지원합니다.stable-fast 는 xformers를 사용하여 Torchscript 와 호환됩니다. 다음 목표는 diffusers 위한 가장 빠른 추론 최적화 프레임 워크 중 하나로 stable-fast 유지하고 transformers 에 대한 속도 업 및 VRAM 감소를 모두 제공하는 것입니다. 사실, 나는 이미 stable-fast 사용을 사용하여 LLM을 최적화하고 상당한 속도를 달성합니다. 그러나 나는 그것을보다 안정적이고 사용하기 쉽고 안정적인 사용자 인터페이스를 제공하기 위해 여전히 약간의 작업을 수행해야합니다.
stable-fast 포옹 페이스 디퓨저 에 대해 특정 최적화됩니다. 많은 라이브러리에서 고성능을 달성합니다. 그리고 몇 초 안에 매우 빠른 컴파일 속도를 제공합니다. 편집 시간에 torch.compile , TensorRT 및 AITemplate 보다 훨씬 빠릅니다.stable-fast PyTorch 의 플러그인 프레임 워크 역할을합니다. 기존의 PyTorch 기능 및 인프라를 활용하며 인기있는 미세 조정 기술 및 배포 솔루션뿐만 아니라 다른 가속 기술과 호환됩니다.stable-fast 모든 종류의 HuggingFace Diffusers 및 PyTorch 버전과 호환됩니다. 또한 ControlNet 및 LoRA 와 호환됩니다. 그리고 그것은 심지어 최신 StableVideoDiffusionPipeline 상자에서 지원합니다! 참고 : stable-fast 는 현재 Windows에서 Linux 및 WSL2 in Windows 에서만 테스트됩니다. 처음에는 CUDA 지원으로 Pytorch를 설치해야합니다 (1.12에서 2.1의 버전이 제안됩니다).
CUDA 12.1 및 Python 3.10 에서 torch>=2.1.0 , xformers>=0.0.22 및 triton>=2.1.0 으로 stable-fast 만 테스트합니다. 다른 버전은 성공적으로 구축 및 실행될 수 있지만 보장되지는 않습니다.
릴리스 페이지에서 시스템에 해당하는 휠을 다운로드하고 pip3 install <wheel file> 으로 설치하십시오.
현재 Linux 와 Windows 휠이 모두 제공됩니다.
# 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) 참고 : sfast.compilers 외부의 모든 사용은 후진 호환성을 보장하지 않습니다.
참고 : 최고의 성능을 얻으려면 xformers 와 OpenAi의 triton>=2.1.0 설치하고 활성화해야합니다. PyTorch 와 호환되도록 소스에서 xformers 구축해야 할 수도 있습니다.
stable-fast StableDiffusionPipeline 및 StableDiffusionPipelineXL 직접 최적화 할 수 있습니다.
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 )자세한 내용은 examples/optimize_stable_diffusion_pipeline.py를 참조하십시오.
이 colab을 확인하여 T4 GPU에서 어떻게 작동하는지 확인할 수 있습니다.
stable-fast 최신 latent consistency model 파이프 라인을 최적화하고 상당한 속도를 달성 할 수 있습니다.
LCM LORA를 사용하여 일반 SD 모델을 최적화하는 방법에 대한 자세한 내용은 예제/최적화 _lcm_pipeline.py를 참조하십시오. 독립형 LCM 모델을 최적화하는 방법에 대한 자세한 내용은 예제/최적화 _lcm_pipeline.py를 참조하십시오.
stable-fast 최신 StableVideoDiffusionPipeline 최적화하고 2x 속도를 달성 할 수 있습니다.
자세한 내용은 examples/optimize_stable_video_diffusion_pipeline.py를 참조하십시오
LORA를 동적으로 전환하는 것이 지원되지만 추가 작업을 수행해야합니다. 컴파일 된 그래프 및 CUDA Graph 원래 UNET 모델과 동일한 하층 데이터 (포인터)를 공유하기 때문에 가능합니다. 따라서 원래 UNET 모델의 매개 변수를 업데이트하기 만하면됩니다.
다음 코드는 이미 LORA를로드하고 모델을 컴파일했다고 가정하고 다른 LORA로 전환하려고합니다.
Cuda 그래프를 활성화하지 않고 preserve_parameters = True 유지하면 상황이 훨씬 쉬울 수 있습니다. 다음 코드도 필요하지 않을 수 있습니다.
# 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 Pytorch의 quantize_dynamic 기능을 확장하고 Cuda 백엔드에서 동적으로 양자화 된 선형 연산자를 제공합니다. 이를 활성화하면 diffusers 에 대한 약간의 VRAM 감소와 transformers 에 대한 상당한 VRAM 감소를 얻을 수 있으며 Cound는 잠재적 인 속도를 얻을 수 있습니다 (항상 그런 것은 아닙니다).
SD XL 의 경우 이미지 크기가 1024x1024 인 VRAM 감소가 2GB 의 감소를 볼 것으로 예상됩니다.
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 )자세한 내용은 examples/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 성능은 다른 하드웨어/소프트웨어/플랫폼/드라이버 구성에 따라 크게 다릅니다. 정확하게 벤치마킹하는 것은 매우 어렵습니다. 벤치마킹 환경을 준비하는 것도 어려운 일입니다. 이전에 일부 플랫폼에서 테스트했지만 결과는 여전히 부정확 할 수 있습니다. 벤치마킹시, tqdm 에 의해 보여준 진행률 표시 줄은 CUDA의 비동기 특성으로 인해 부정확 할 수 있습니다. 이 문제를 해결하기 위해 CUDA Event 사용하여 초당 반복 속도를 정확하게 측정합니다.
stable-fast 새로운 GPU 및 새로운 CUDA 버전에서 더 잘 작동 할 것으로 예상됩니다. 구형 GPU에서는 성능 증가가 제한 될 수 있습니다. 벤치마킹 중에 CUDA의 비동기 특성으로 인해 진행률 표시 줄이 잘못 작동 할 수 있습니다.
이것은 내 개인 게임 PC입니까?. 클라우드 서버 제공 업체보다 강력한 CPU가 있습니다.
| 뼈대 | SD 1.5 | SD XL (1024x1024) | SD 1.5 Controlnet |
|---|---|---|---|
| 바닐라 파이토치 (2.1.0) | 29.5 IT/s | 4.6 IT/s | 19.7 그것은/s |
| Torch.compile (2.1.0, Max-Autotune) | 40.0 It/s | 6.1 IT/s | 21.8 It/s |
| aitemplate | 44.2 It/s | ||
| 원 흐름 | 53.6 그것은/s | ||
| auto1111 webui | 17.2 It/s | 3.6 IT/s | |
| Auto1111 Webui (SDPA 포함) | 24.5 It/s | 4.3 IT/s | |
| Tensorrt (auto1111 webui) | 40.8 It/s | ||
| Tensorrt 공식 데모 | 52.6 It/s | ||
| 안정된 빠른 (Xformers & Triton 포함) | 51.6 It/s | 9.1 It/s | 36.7 It/s |
@consceleratus 와 @harishp 의 도움에 감사드립니다. H100에서 속도를 테스트했습니다.
| 뼈대 | SD 1.5 | SD XL (1024x1024) | SD 1.5 Controlnet |
|---|---|---|---|
| 바닐라 파이토치 (2.1.0) | 54.5 IT/s | 14.9 It/s | 35.8 It/s |
| Torch.compile (2.1.0, Max-Autotune) | 66.0 IT/s | 18.5 It/s | |
| 안정된 빠른 (Xformers & Triton 포함) | 104.6 It/s | 21.6 It/s | 72.6 It/s |
@SupersecureHuman 과 @Jon-Chuang 의 도움에 감사드립니다. A100의 벤치마킹이 가능합니다.
| 뼈대 | SD 1.5 | SD XL (1024x1024) | SD 1.5 Controlnet |
|---|---|---|---|
| 바닐라 파이토치 (2.1.0) | 35.6 그것은/s | 8.7 IT/s | 25.1 It/s |
| Torch.compile (2.1.0, Max-Autotune) | 41.9 It/s | 10.0 IT/s | |
| 안정된 빠른 (Xformers & Triton 포함) | 61.8 IT/s | 11.9 It/s | 41.1 It/s |
| 모델 | 지원 |
|---|---|
| 포옹 얼굴 확산기 (1.5/2.1/xl) | 예 |
| Controlnet과 함께 | 예 |
| 로라와 함께 | 예 |
| 잠재적 인 일관성 모델 | 예 |
| SDXL 터보 | 예 |
| 안정적인 비디오 확산 | 예 |
| 기능 | 지원 |
|---|---|
| 동적 모양 | 예 |
| 이미지에 텍스트 | 예 |
| 이미지에서 이미지 | 예 |
| 이미지가 inpainting | 예 |
| UI 프레임 워크 | 지원 | 링크 |
|---|---|---|
| Automatic1111 | 물티 | |
| 다음 SD 다음 | 예 | SD Next |
| Comfyui | 예 | ComfyUI_stable_fast |
| 운영 체제 | 지원 |
|---|---|
| 리눅스 | 예 |
| 창 | 예 |
| Windows WSL | 예 |
자세한 내용은 Doc/Truskuting.md를 참조하십시오.
그리고 당신은 불화 채널에 가입하여 도움을 요청할 수 있습니다.