يعد SD Turbo وSDXL Turbo نموذجين سريعين لتحويل النص إلى صورة قادرين على إنشاء صور قابلة للحياة في أقل من خطوة واحدة، وهو تحسن كبير مقارنة بالخطوات الثلاثين+ المطلوبة غالبًا مع نماذج Stable Diffusion السابقة. SD Turbo هو إصدار مقطر من Stable Diffusion 2.1، وSDXL Turbo هو إصدار مقطر من SDXL 1.0. لقد أظهرنا سابقًا كيفية تسريع استنتاج Stable Diffusion باستخدام ONNX Runtime. لا يقتصر الأمر على توفير ONNX Runtime فوائد الأداء عند استخدامها مع SD Turbo وSDXL Turbo، ولكنه يتيح أيضًا الوصول إلى النماذج بلغات أخرى غير Python، مثل C# وJava.

مكاسب الأداء

في هذا المنشور، سنقدم تحسينات في موفري التنفيذ ONNX Runtime CUDA وTensorRT التي تعمل على تسريع استنتاج SD Turbo وSDXL Turbo على وحدات معالجة الرسومات NVIDIA بشكل كبير.

تفوقت ONNX Runtime على PyTorch في جميع المجموعات التي تم اختبارها (حجم الدفعة وعدد الخطوات)، مع مكاسب إنتاجية تصل إلى 229% لنموذج SDXL Turbo و120% لنموذج SD Turbo. يتمتع ONNX Runtime CUDA بأداء جيد بشكل خاص للشكل الديناميكي ولكنه يوضح تحسنًا ملحوظًا مقارنة بـ PyTorch للشكل الثابت أيضًا.

كيفية تشغيل SD Turbo وSDXL Turbo

لتسريع الاستدلال من خلال موفر تنفيذ ONNX Runtime CUDA، يمكنك الوصول إلى إصداراتنا المحسنة من SD Turbo وSDXL Turbo على Hugging Face.

يتم إنشاء النماذج بواسطة Olive، وهي أداة سهلة الاستخدام لتحسين النماذج وتدرك الأجهزة. لاحظ أنه يجب تمكين fp16 VAE من خلال سطر الأوامر للحصول على أفضل أداء، كما هو موضح في الإصدارات المحسنة المشتركة. للحصول على إرشادات حول كيفية تشغيل خطوط أنابيب SD وSDXL مع ملفات ONNX المستضافة على Hugging Face، راجع مثال استخدام SD Turbo ومثال استخدام SDXL Turbo.

لتسريع الاستدلال باستخدام موفر تنفيذ ONNX Runtime TensorRT بدلاً من ذلك، اتبع الإرشادات الموجودة هنا.

فيما يلي مثال على إنشاء الصور باستخدام نموذج SDXL Turbo الذي يسترشد بمطالبة نصية:

python3 demo_txt2img_xl.py \
  --version xl-turbo \
  "little cute gremlin wearing a jacket, cinematic, vivid colors, intricate masterpiece, golden ratio, highly detailed"

تم إنشاء مثال Gremlin
الشكل 1. جريملين صغير لطيف يرتدي صورة سترة تم إنشاؤها باستخدام نص موجه باستخدام SDXL Turbo.

لاحظ أنه تم إنشاء الصورة النموذجية في 4 خطوات، مما يوضح قدرة SD Turbo وSDXL Turbo على إنشاء صور قابلة للحياة في خطوات أقل من نماذج Stable Diffusion السابقة.

للحصول على طريقة سهلة الاستخدام لتجربة نماذج Stable Diffusion، راجع ملحق وقت التشغيل ONNX الخاص بنا لواجهة SD WebUI الخاصة بـ Automatic1111. يتيح هذا الامتداد التنفيذ الأمثل لنموذج Stable Diffusion UNet على وحدات معالجة الرسومات NVIDIA ويستخدم موفر التنفيذ ONNX Runtime CUDA لتشغيل الاستدلال مقابل النماذج المحسنة باستخدام Olive. في الوقت الحالي، تم تحسين الامتداد فقط لـ Stable Diffusion 1.5. يمكن أيضًا استخدام طرازي SD Turbo وSDXL Turbo، لكن تحسينات الأداء لا تزال قيد التقدم.

تطبيقات الانتشار المستقر في C# وJava

من خلال الاستفادة من مزايا الأنظمة الأساسية والأداء وسهولة الاستخدام الخاصة بـ ONNX Runtime، ساهم أعضاء المجتمع أيضًا بعينات وأدوات واجهة مستخدم خاصة بهم باستخدام Stable Diffusion مع ONNX Runtime.

تتضمن مساهمات المجتمع هذه OnnxStack، وهي مكتبة .NET تعتمد على برنامجنا التعليمي السابق لـ C# لتزويد المستخدمين بمجموعة متنوعة من الإمكانات للعديد من نماذج Stable Diffusion المختلفة عند إجراء الاستدلال باستخدام C# وONNX Runtime.

بالإضافة إلى ذلك، أصدرت Oracle نموذج Stable Diffusion باستخدام Java الذي يقوم بتشغيل الاستدلال أعلى وقت تشغيل ONNX. يعتمد هذا المشروع أيضًا على برنامجنا التعليمي C#.

النتائج المرجعية

قمنا بقياس طرازي SD Turbo وSDXL Turbo باستخدام Standard_ND96amsr_A100_v4 VM باستخدام A100-SXM4-80GB وسطح المكتب Lenovo مع وحدة معالجة الرسومات RTX-4090 (WSL Ubuntu 20.04) لإنشاء صور بدقة 512×512 باستخدام نماذج LCM المجدولة وfp16. ويتم قياس النتائج باستخدام هذه المواصفات:

  • onnxruntime-gpu==1.17.0 (مبني من المصدر)
  • الشعلة==2.1.0a0+32f93b1
  • Tensorrt==8.6.1
  • المحولات==4.36.0
  • الناشرون ==0.24.0
  • أونكس==1.14.1
  • onnx-graphsurgeon==0.3.27
  • جهاز كشف الكذب==0.49.0

لإعادة إنتاج هذه النتائج، نوصي باستخدام الإرشادات المرتبطة بقسم “مثال الاستخدام”.

نظرًا لأن VAE الأصلي لـ SDXL Turbo لا يمكن تشغيله بدقة fp16، فقد استخدمنا sdxl-vae-fp16-fix في اختبار SDXL Turbo. توجد اختلافات طفيفة بين مخرجاتها ومخرجات VAE الأصلية، لكن الصور التي تم فك تشفيرها قريبة بدرجة كافية لمعظم الأغراض.

قام خط أنابيب PyTorch للشكل الثابت بتطبيق تنسيق ذاكرة القناة الأخيرة وtorch.compile مع وضع تقليل الحمل.

توضح المخططات التالية معدل نقل الصور في الثانية مقابل المجموعات المختلفة (حجم الدفعة وعدد الخطوات) لأطر العمل المختلفة. تجدر الإشارة إلى أن الملصق الموجود أعلى كل شريط يشير إلى نسبة التسريع مقابل ترجمة Torch – على سبيل المثال، في المخطط الأول، ORT_TRT (ثابت) أسرع بنسبة 31% من Torch (ترجمة) لمجموعة (الدفعة، الخطوات) (4، 1).

لقد اخترنا استخدام الخطوتين الأولى والأربعة لأن كلاً من SD Turbo وSDXL Turbo يمكنهما إنشاء صور قابلة للحياة في خطوة واحدة فقط ولكنهما عادةً ما ينتجان صورًا بأفضل جودة في 3-5 خطوات.

اس دي اكس ال توربو

توضح الرسوم البيانية أدناه معدل نقل الصور في الثانية لنموذج SDXL Turbo بالشكل الثابت والديناميكي. تم جمع النتائج على وحدة معالجة الرسومات A100-SXM4-80GB لمجموعات مختلفة (حجم الدفعة، عدد الخطوات). بالنسبة للشكل الديناميكي، يدعم محرك TensorRT حجم الدُفعة من 1 إلى 8 وحجم الصورة من 512 × 512 إلى 768 × 768، ولكن تم تحسينه لحجم الدُفعة 1 وحجم الصورة 512 × 512.

الإنتاجية لـ SDXL Turbo على وحدة معالجة الرسومات A100 Tensor Cores (الأشكال الثابتة)
الإنتاجية لـ SDXL Turbo على وحدة معالجة الرسومات A100 Tensor Cores (الأشكال الديناميكية)

اس دي توربو

يوضح الرسمان البيانيان التاليان معدل نقل الصور في الثانية لنموذج SD Turbo بشكل ثابت وديناميكي على وحدة معالجة الرسومات A100-SXM4-80GB.

إنتاجية SD Turbo على وحدة معالجة الرسومات A100 Tensor Cores (الأشكال الثابتة)
إنتاجية SD Turbo على وحدة معالجة الرسومات A100 Tensor Cores (الأشكال الديناميكية)

توضح المجموعة النهائية من الرسوم البيانية معدل نقل الصور في الثانية لنموذج SD Turbo بشكل ثابت وديناميكي على وحدة معالجة الرسومات RTX-4090. في اختبار الشكل الديناميكي هذا، تم تصميم محرك TensorRT لحجم الدُفعة من 1 إلى 8 (المُحسّن لحجم الدُفعة 1) وحجم الصورة الثابت 512 × 512 بسبب محدودية الذاكرة.

إنتاجية SD Turbo على RTX 4090 (الأشكال الثابتة)
إنتاجية SD Turbo على RTX 4090 (الأشكال الديناميكية)

ما مدى سرعة SD Turbo وSDXL Turbo مع ONNX Runtime؟

توضح هذه النتائج أن ONNX Runtime يتفوق بشكل كبير على PyTorch مع كل من موفري التنفيذ CUDA وTensorRT في شكل ثابت وديناميكي لجميع المجموعات (الدفعة والخطوات) الموضحة. ينطبق هذا الاستنتاج على أحجام الطرازين (SD Turbo وSDXL Turbo)، بالإضافة إلى كل من وحدات معالجة الرسومات التي تم اختبارها. والجدير بالذكر أن وقت تشغيل ONNX مع CUDA (الشكل الديناميكي) تبين أنه أسرع بنسبة 229% من Torch Eager لمجموعة (الدفعة، الخطوات) (1، 4).

بالإضافة إلى ذلك، يعمل وقت تشغيل ONNX مع موفر تنفيذ TensorRT بشكل أفضل قليلاً بالنسبة للشكل الثابت نظرًا لأن إنتاجية ORT_TRT أعلى من إنتاجية ORT_CUDA المقابلة لمعظم المجموعات (الدُفعات والخطوات). يتم تفضيل الشكل الثابت عادةً عندما يعرف المستخدم حجم الدُفعة وحجم الصورة في وقت تعريف الرسم البياني (على سبيل المثال، يخطط المستخدم فقط لإنشاء صور بحجم الدُفعة 1 وحجم الصورة 512 × 512). في هذه الحالات، يكون للشكل الثابت أداء أسرع. ومع ذلك، إذا قرر المستخدم التبديل إلى دفعة و/أو حجم صورة مختلف، فيجب على TensorRT إنشاء محرك جديد (أي مضاعفة ملفات المحرك الموجودة في القرص) وتبديل المحركات (أي قضاء وقت إضافي في تحميل المحرك الجديد).

من ناحية أخرى، غالبًا ما يكون ONNX Runtime مع موفر تنفيذ CUDA خيارًا أفضل للشكل الديناميكي لنماذج SD Turbo وSDXL Turbo عند استخدام وحدة معالجة الرسومات A100-SXM4-80GB، ولكن أداء ONNX Runtime مع موفر تنفيذ TensorRT أفضل قليلاً على الشكل الديناميكي لمعظم المجموعات (الدفعة والخطوات) عند استخدام وحدة معالجة الرسومات RTX-4090. تتمثل فائدة استخدام الشكل الديناميكي في أنه يمكن للمستخدمين تشغيل الاستدلال بسرعة أكبر عندما لا تكون أحجام الدُفعات والصور معروفة حتى وقت تنفيذ الرسم البياني (على سبيل المثال، تشغيل حجم الدُفعة 1 وحجم الصورة 512 × 512 لصورة واحدة وحجم الدُفعة 4 وحجم الصورة 512 × 768 لصورة أخرى). عند استخدام الشكل الديناميكي في هذه الحالات، يحتاج المستخدمون فقط إلى إنشاء محرك واحد وحفظه، بدلاً من تبديل المحركات أثناء الاستدلال.

تحسينات GPU

إلى جانب التقنيات المقدمة في مدونة Stable Diffusion السابقة، تم تطبيق التحسينات التالية بواسطة ONNX Runtime للحصول على نتائج SD Turbo وSDXL Turbo الموضحة في هذا المنشور:

  • تمكين الرسم البياني CUDA لمدخلات الشكل الثابت.
  • إضافة فلاش الانتباه V2.
  • قم بإزالة المخرجات الإضافية في برنامج تشفير النص (احتفظ بمخرجات الحالة المخفية المحددة بواسطة معلمة clip_skip).
  • قم بإضافة دمج SkipGroupNorm لدمج تسوية المجموعة مع إضافة العقد التي تسبقها.

بالإضافة إلى ذلك، أضفنا دعمًا للميزات الجديدة، بما في ذلك أوزان LoRA لنماذج الاتساق الكامنة (LCMs).

الخطوات التالية

في المستقبل، نخطط لمواصلة تحسين عملنا في Stable Diffusion من خلال تحديث العرض التوضيحي لدعم الميزات الجديدة، مثل IP Adaptor وStable Video Diffusion. سيكون دعم ControlNet متاحًا أيضًا قريبًا.

نحن نعمل أيضًا على تحسين أداء SD Turbo وSDXL Turbo من خلال ملحق واجهة مستخدم الويب Stable Diffusion الحالي ونخطط للمساعدة في إضافة دعم لكلا الطرازين إلى واجهة مستخدم Windows التي تم تطويرها بواسطة أحد أعضاء مجتمع ONNX Runtime.

بالإضافة إلى ذلك، سيتوفر قريبًا برنامج تعليمي لكيفية تشغيل SD Turbo وSDXL Turbo باستخدام C# وONNX Runtime. في هذه الأثناء، راجع برنامجنا التعليمي السابق حول الانتشار المستقر.

موارد

تحقق من بعض الموارد التي تمت مناقشتها في هذا المنشور:

شاركها.
اترك تعليقاً