بعد عام واحد من التأخير ، يسعدني أن أعلن أنني أخطط لبناء مشروع جديد مريح لتوفير سرعة الاستدلال الأسرع لجميع الطرز التي تعمل مع ComfyUI . لقد بدأ للتو وآمل أن يكون مشروعًا رائعًا؟ .. يرجى الاستمرار في التركيز عليه وتعطيني ملاحظات؟!
ملحوظة
لقد تم إيقاف التنمية النشطة على stable-fast . أنا أعمل حاليًا على مشروع torch._dynamo الذي يستند إلى نماذج جديدة مثل stable-cascade و SD3 و Sora مثل Mmodels. سيكون أسرع وأكثر مرونة ، وكذلك دعم المزيد من الأجهزة الخلفية بدلاً من CUDA .
الاتصال موضع ترحيب.
قناة Discord
يحقق stable-fast أداء الاستدلال SOTA على جميع أنواع نماذج الناشر ، حتى مع أحدث أحدث StableVideoDiffusionPipeline . وعلى عكس TensorRT أو AITemplate ، الذي يستغرق عشرات الدقائق لتجميع نموذج ، stable-fast يستغرق الأمر سوى بضع ثوان لتجميع النموذج. يدعم stable-fast أيضًا dynamic shape ، LoRA و ControlNet خارج الصندوق.
| نموذج | الشعلة | torch.compile | ait | Oneflow | Tensorrt | مستقر بسرعة |
|---|---|---|---|---|---|---|
| SD 1.5 (MS) | 1897 | 1510 | 1158 | 1003 | 991 | 995 |
| SVD -X (S) | 83 | 70 | 47 |
ملاحظة : أثناء القياس ، يتم اختبار TensorRT static batch size CUDA Graph enabled أثناء تشغيل stable-fast مع شكل ديناميكي.
stable-fast هو إطار تحسين الاستدلال خفيفة الوزن للغاية لنشرات Huggingface على وحدات معالجة الرسومات NVIDIA . يوفر stable-fast تحسينًا سريعًا للغاية للاستدلال من خلال استخدام بعض التقنيات والميزات الرئيسية:
stable-fast سلسلة من مشغلي الانصهار CUDNN الوظيفي ومتوافق بالكامل ومتوافق بالكامل لجميع أنواع مجموعات Conv + Bias + Add + Act .stable-fast سلسلة من مشغلي GEMM المنصهر التي تحسب بدقة fp16 ، وهي سريعة من الافتراضيات Pytorch (اقرأ وكتابة مع fp16 أثناء حسابها مع fp32 ).stable-fast قادر على دمج GEGLU(x, W, V, b, c) = GELU(xW + b) ⊗ (xV + c) في kernel 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 و VAE و TextEncoder في تنسيق رسم بياني CUDA ، والذي يمكن أن يقلل من وحدة المعالجة المركزية العامة عندما يكون حجم الدفعة صغيرًا. هذا التنفيذ يدعم أيضا الشكل الديناميكي.stable-fast فقط يستخدم Xformers ويجعله متوافقًا مع Torchscript . هدفي التالي هو الحفاظ على stable-fast كواحدة من أسرع أطر عمل الاستدلال للاستدلال diffusers وأيضًا توفير كل من انخفاض السرعة و VRAM transformers . في الواقع ، لقد استخدمت بالفعل stable-fast لتحسين LLMs وتحقيق تسريع كبير. لكنني ما زلت بحاجة إلى القيام ببعض الأعمال لجعلها أكثر استقرارًا وسهلة الاستخدام وتوفير واجهة مستخدم ثابتة.
stable-fast بشكل خاص لنشرات Luggingface . إنه يحقق أداءً عاليًا عبر العديد من المكتبات. ويوفر سرعة تجميع سريعة للغاية في غضون بضع ثوانٍ فقط. إنه أسرع بكثير من 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 Wheels.
# 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 لمزيد من التفاصيل.
يمكنك التحقق من هذا Colab لمعرفة كيف يعمل على GPU 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 الأصلي في مكانه.
يفترض الرمز التالي أنك قمت بالفعل بتحميل 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 ، والحصول على تسريع محتمل (ليس دائمًا).
بالنسبة إلى SD XL ، من المتوقع أن يرى تخفيض 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 (1024 × 1024) | SD 1.5 Controlnet |
|---|---|---|---|
| الفانيليا بيتورش (2.1.0) | 29.5 IT/S. | 4.6 IT/S. | 19.7 IT/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. | ||
| Oneflow | 53.6 IT/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 (1024 × 1024) | 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 (1024 × 1024) | SD 1.5 Controlnet |
|---|---|---|---|
| الفانيليا بيتورش (2.1.0) | 35.6 IT/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 Turbo | نعم |
| انتشار فيديو مستقر | نعم |
| الوظيفة | مدعوم |
|---|---|
| شكل ديناميكي | نعم |
| نص على الصورة | نعم |
| صورة إلى الصورة | نعم |
| صورة inpainting | نعم |
| إطار واجهة المستخدم | مدعوم | وصلة |
|---|---|---|
| Automatic1111 | WIP | |
| SD التالي | نعم | SD Next |
| comfyui | نعم | ComfyUI_stable_fast |
| نظام التشغيل | مدعوم |
|---|---|
| Linux | نعم |
| النوافذ | نعم |
| Windows WSL | نعم |
ارجع إلى DOC/استكشاف الأخطاء وإصلاحها. md لمزيد من التفاصيل.
ويمكنك الانضمام إلى قناة Discord لطلب المساعدة.