После одного года задержки я рад сообщить, что планирую создать новый проект, удобный, чтобы обеспечить самую быструю скорость вывода для всех моделей, работающих с ComfyUI . Это только началось, и я надеюсь, что это будет отличный проект? ... пожалуйста, продолжайте сосредотачиваться на нем и дайте мне отзывы?!
ПРИМЕЧАНИЕ
Активное развитие на stable-fast было приостановлено. В настоящее время я работаю над новым проектом на основе torch._dynamo , нацеленном на новые модели, такие как stable-cascade , SD3 и Sora , такие как Mmodels. Это было бы быстрее и более гибким, а также поддержать больше аппаратных бэкэндов, а не CUDA .
Контакт приветствуется.
Канал раздора
stable-fast обеспечивает производительность вывода SOTA на всех видах моделей диффузора, даже с новейшими StableVideoDiffusionPipeline . И в отличие от TensorRT или AITemplate , который занимает десятки минут, чтобы скомпилировать модель, stable-fast требуется всего несколько секунд, чтобы составить модель. stable-fast также поддерживает dynamic shape , LoRA и ControlNet из коробки.
| Модель | факел | torch.compile | Айт | Oneflow | Тенсорт | стабильный |
|---|---|---|---|---|---|---|
| SD 1,5 (MS) | 1897 | 1510 | 1158 | 1003 | 991 | 995 |
| SVD-ST (S) | 83 | 70 | 47 |
ПРИМЕЧАНИЕ . Во время сравнительного анализа TensorRT тестируется со static batch size , а CUDA Graph enabled в то время как stable-fast работает с динамической формой.
stable-fast -это ультра легкая структура оптимизации выводов для диффузоров HuggingFace на графических процессорах NVIDIA . stable-fast обеспечивает очень быструю оптимизацию вывода, используя некоторые ключевые методы и функции:
stable-fast реализует серию полностью функциональных и полностью совместимых операторов слияния слияния Cudnn Convolution для всех видов комбинаций Conv + Bias + Add + Act Расчеты.stable-fast реализует серию плавных операторов GEMM, которые вычисляют с точностью fp16 , который быстр, чем по умолчанию Pytorch (читай и напишите с fp16 во время вычисления с fp32 ).stable-fast способен сливать GEGLU(x, W, V, b, c) = GELU(xW + b) ⊗ (xV + c) в одно ядро Cuda.stable-fast реализует высоко оптимизированный платечный оператор NHWC GroupNorm + Silu с Triton OpenAI, который устраняет необходимость операторов перестановки формата памяти.stable-fast улучшает интерфейс torch.jit.trace , чтобы сделать его более подходящим для отслеживания сложных моделей. Почти каждая часть StableDiffusionPipeline/StableVideoDiffusionPipeline может быть прослежена и преобразована в TorchScript . Он более стабилен, чем torch.compile , и имеет значительно более низкие накладные расходы на ЦП, чем torch.compile и поддерживает Controlnet и Lora .stable-fast может запечатлеть UNet , VAE и TextEncoder в формат графика CUDA, который может уменьшить накладные расходы на процессор, когда размер партии невелик. Это реализация также поддерживает динамическую форму.stable-fast используется Xformers и делает его совместимым с TorchScript . Моя следующая цель состоит в том, чтобы сохранить stable-fast в качестве одной из самых быстрых рамках оптимизации выводов для diffusers , а также обеспечивает как ускорение, так и сокращение VRAM для transformers . На самом деле, я уже использую stable-fast для оптимизации LLMS и достижения значительного ускорения. Но мне все еще нужно сделать некоторую работу, чтобы сделать его более стабильным и простых в использовании и предоставить стабильный пользовательский интерфейс.
stable-fast оптимизирован для диффузоров для объятий . Это достигает высокой производительности во многих библиотеках. И это обеспечивает очень быструю скорость компиляции всего за несколько секунд. Это значительно быстрее, чем torch.compile , TensorRT и AITemplate во время компиляции.stable-fast работа в качестве плагина для PyTorch . Он использует существующую функциональность и инфраструктуру PyTorch и совместим с другими методами ускорения, а также популярными методами точной настройки и решениями развертывания.stable-fast совместима со всеми видами HuggingFace Diffusers и версий PyTorch . Он также совместим с ControlNet и LoRA . И это даже поддерживает последнюю StableVideoDiffusionPipeline из коробки! Примечание : в настоящее время stable-fast тестируется только на Linux и WSL2 in Windows . Сначала вам нужно установить Pytorch с поддержкой CUDA (предлагаются версии от 1,12 до 2.1).
Я тестирую только stable-fast с torch>=2.1.0 , xformers>=0.0.22 и triton>=2.1.0 на CUDA 12.1 и Python 3.10 . Другие версии могут успешно строить и работать, но это не гарантировано.
Загрузите колесо, соответствующее вашей системе со страницы релизов, и установите его с помощью 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's triton>=2.1.0 . Возможно, вам придется построить xformers из источника, чтобы сделать его совместимым с вашим PyTorch .
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 )См. Примеры/Optimize_stable_diffusion_pipeline.py для получения более подробной информации.
Вы можете проверить эту колаб, чтобы увидеть, как это работает на графическом процессоре T4:
stable-fast может оптимизировать новейший трубопровод latent consistency model и достичь значительного ускорения.
См. Примеры/Optimize_lcm_pipeline.py для получения более подробной информации о том, как оптимизировать нормальную модель SD с LCM Lora. См. Примеры/Optimize_lcm_pipeline.py для получения более подробной информации о том, как оптимизировать автономную модель LCM.
stable-fast может оптимизировать новейшую StableVideoDiffusionPipeline и достичь 2x ускорения
См. Примеры/Optimize_stable_video_diffusion_pipeline.py для получения более подробной информации
Динамическое переключение LORA поддерживается, но вам нужно выполнить дополнительную работу. Это возможно, потому что скомпилированный график и CUDA Graph совместно используется одни и те же данные (указатели) с исходной моделью UNET. Таким образом, все, что вам нужно сделать, это обновить исходные параметры Unet Model на месте.
В следующем коде предполагается, что вы уже загрузили 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. Обеспечивая это, вы можете получить небольшое снижение VRAM для diffusers и значительного сокращения VRAM для transformers , а Cound получит потенциальное ускорение (не всегда).
Для SD XL ожидается, что VRAM будет сокращение VRAM на 2GB с размером изображения 1024x1024 .
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 )См. Примеры/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 будет лучше работать на новых графических процессорах и новых версиях CUDA. На более старых графических процессорах повышение производительности может быть ограничено. Во время сравнительного анализа администратор прогресса может работать неправильно из -за асинхронной природы CUDA.
Это мой личный игровой компьютер? Он имеет более мощный процессор, чем у поставщиков облачных серверов.
| Рамки | SD 1,5 | SD XL (1024x1024) | SD 1.5 ControlNet |
|---|---|---|---|
| Vanilla Pytorch (2.1.0) | 29,5 Это/с | 4.6 Это/с | 19.7 Это/с |
| Torch.compile (2.1.0, Max-Autotune) | 40.0 это/с | 6.1 Это/с | 21.8 это/с |
| Aitemplate | 44.2 Это/с | ||
| Oneflow | 53,6 Это/с | ||
| Auto1111 Webui | 17.2 Это/с | 3.6 Это/с | |
| Auto1111 Webui (с SDPA) | 24.5 Это/с | 4.3 Это/с | |
| Tensorrt (auto1111 webui) | 40.8 Это/с | ||
| Тенсорт официальный демо | 52,6 Это/с | ||
| стабильный (с xformers & triton) | 51.6 Это/с | 9.1 Это/с | 36.7 Это/с |
Спасибо за помощь @consceleratus и @harishp , я проверил скорость на H100.
| Рамки | SD 1,5 | SD XL (1024x1024) | SD 1.5 ControlNet |
|---|---|---|---|
| Vanilla Pytorch (2.1.0) | 54.5 Это/с | 14.9 Это/с | 35,8 Это/с |
| Torch.compile (2.1.0, Max-Autotune) | 66.0 это/с | 18.5 Это/с | |
| стабильный (с xformers & triton) | 104.6 Это/с | 21.6 Это/с | 72.6 Это/с |
Спасибо за помощь @supersecurehuman и @Jon-Chuang , бенчмаркинг на A100 теперь доступен сейчас.
| Рамки | SD 1,5 | SD XL (1024x1024) | SD 1.5 ControlNet |
|---|---|---|---|
| Vanilla Pytorch (2.1.0) | 35.6 Это/с | 8.7 Это/с | 25.1 Это/с |
| Torch.compile (2.1.0, Max-Autotune) | 41.9 Это/с | 10.0 Это/с | |
| стабильный (с xformers & triton) | 61.8 это/с | 11.9 Это/с | 41.1 Это/с |
| Модель | Поддерживается |
|---|---|
| Обнимающиеся диффузоры лица (1,5/2,1/XL) | Да |
| С ControlNet | Да |
| С Лорой | Да |
| Скрытая модель согласованности | Да |
| SDXL Turbo | Да |
| Стабильная диффузия видео | Да |
| Функциональность | Поддерживается |
|---|---|
| Динамическая форма | Да |
| Текст на изображение | Да |
| Изображение на изображение | Да |
| Изображение внедорожника | Да |
| Framework | Поддерживается | Связь |
|---|---|---|
| Automatic1111 | Пари | |
| SD Далее | Да | SD Next |
| Comfyui | Да | ComfyUI_stable_fast |
| Операционная система | Поддерживается |
|---|---|
| Linux | Да |
| Окна | Да |
| Windows WSL | Да |
Обратитесь к doc/reatroshooting.md для получения более подробной информации.
И вы можете присоединиться к каналу Discord, чтобы попросить о помощи.