يمكن لنماذج الانتشار الكبيرة مثل Flux (نموذج إنشاء تحويل النص إلى صورة القائم على التدفق) إنشاء صور مذهلة، لكن حجمها يمكن أن يمثل عقبة، ويتطلب ذاكرة كبيرة وموارد حاسوبية. يوفر التكميم حلاً قويًا، حيث يعمل على تقليص هذه النماذج لتسهيل الوصول إليها دون المساس بالأداء بشكل كبير. لكن السؤال الكبير دائمًا هو: هل يمكنك بالفعل معرفة الفرق في الصورة النهائية؟

قبل أن نتعمق في التفاصيل الفنية لكيفية عمل الخلفيات الكمية المختلفة في Hugging Face Diffusers، لماذا لا تختبر إدراكك الخاص؟

حدد النموذج الكمي

لقد أنشأنا إعدادًا يمكنك من خلاله تقديم مطالبة، ونقوم بإنشاء النتائج باستخدام كل من النموذج الأصلي عالي الدقة (على سبيل المثال، Flux-dev في BF16) والعديد من الإصدارات الكمية (BnB 4-bit، BnB 8-bit). يتم بعد ذلك تقديم الصور التي تم إنشاؤها إليك والتحدي الذي يواجهك هو تحديد الصور التي جاءت من النماذج الكمية.

جربه هنا أو أدناه!

في كثير من الأحيان، خاصة مع تكميم 8 بت، تكون الاختلافات دقيقة وقد لا تكون ملحوظة دون فحص دقيق. قد يكون التكميم الأكثر قوة مثل 4 بت أو أقل أكثر وضوحًا، ولكن النتائج يمكن أن تظل جيدة، خاصة بالنظر إلى التوفير الهائل في الذاكرة. غالبًا ما يقدم NF4 أفضل مقايضة.

الآن، دعونا نتعمق أكثر.

الواجهات الخلفية للتكميم في الناشرون

بناءً على منشورنا السابق، “محولات الانتشار ذات الكفاءة في الذاكرة باستخدام Quanto وDiffusers”، يستكشف هذا المنشور الواجهات الخلفية المتنوعة للتكميم المدمجة مباشرة في Hugging Face Diffusers. سنفحص كيف أن دعم وحدات bitsandbytes وGGUF وtorchao وQuanto وFP8 الأصلية يجعل الوصول إلى النماذج الكبيرة والقوية أكثر سهولة، مع توضيح استخدامها مع Flux.

قبل الغوص في الواجهات الخلفية للتكميم، دعنا نقدم FluxPipeline (باستخدام نقطة تفتيش black-forest-labs/FLUX.1-dev) ومكوناته، والتي سنقوم بتقديرها كميًا. تحميل كامل FLUX.1-dev يتطلب الطراز بدقة BF16 ما يقرب من 31.447 جيجابايت من الذاكرة. المكونات الرئيسية هي:

  • برامج ترميز النص (CLIP وT5):
    • وظيفة: معالجة مطالبات نص الإدخال. يستخدم FLUX-dev CLIP للفهم الأولي وT5 أكبر للفهم الدقيق وعرض النص بشكل أفضل.
    • ذاكرة: T5 – 9.52 جيجابايت؛ مقطع – 246 ميجابايت (في BF16)
  • المحول (النموذج الرئيسي – MMDiT):
    • وظيفة: الجزء التوليدي الأساسي (محول الانتشار المتعدد الوسائط). يولد الصور في المساحة الكامنة من تضمينات النص.
    • ذاكرة: 23.8 جيجابايت (في BF16)
  • التشفير التلقائي المتغير (VAE):
    • وظيفة: يترجم الصور بين البكسل والمساحة الكامنة. تم إنشاء فك التشفير للتمثيل الكامن لصورة تعتمد على البكسل.
    • ذاكرة: 168 ميجابايت (في BF16)
  • التركيز على التكميم: سوف تركز الأمثلة في المقام الأول على transformer و text_encoder_2 (T5) لتوفير أكبر قدر ممكن من الذاكرة.
prompts = [
    "Baroque style, a lavish palace interior with ornate gilded ceilings, intricate tapestries, and dramatic lighting over a grand staircase.",
    "Futurist style, a dynamic spaceport with sleek silver starships docked at angular platforms, surrounded by distant planets and glowing energy lines.",
    "Noir style, a shadowy alleyway with flickering street lamps and a solitary trench-coated figure, framed by rain-soaked cobblestones and darkened storefronts.",
]

البت ساند بايت (BnB)

bitsandbytes هي مكتبة شائعة وسهلة الاستخدام لتكميم 8 بت و4 بت، وتستخدم على نطاق واسع في LLMs وQLoRA للضبط الدقيق. يمكننا استخدامه لنماذج الانتشار والتدفق القائمة على المحولات أيضًا.

BF16

بي ان بي 4 بت

بي ان بي 8 بت

مقارنة مرئية لمخرجات نموذج Flux-dev باستخدام التكميم BF16 (يسار)، وBnB 4 بت (وسط)، وBnB 8 بت (يمين). (انقر على الصورة للتكبير)
دقة الذاكرة بعد التحميل ذروة الذاكرة وقت الاستدلال
BF16 ~31.447 جيجابايت 36.166 جيجابايت 12 ثانية
4 بت 12.584 جيجابايت 17.281 جيجابايت 12 ثانية
8 بت 19.273 جيجابايت 24.432 جيجابايت 27 ثانية

تم تنفيذ جميع المعايير على 1x NVIDIA H100 80GB GPU

مثال (Flux-dev مع BnB 4 بت):
import torch
from diffusers import FluxPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

model_id = "black-forest-labs/FLUX.1-dev"

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
        "text_encoder_2": TransformersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
    }
)

pipe = FluxPipeline.from_pretrained(
    model_id,
    quantization_config=pipeline_quant_config,
    torch_dtype=torch.bfloat16
)
pipe.to("cuda")

prompt = "Baroque style, a lavish palace interior with ornate gilded ceilings, intricate tapestries, and dramatic lighting over a grand staircase."
pipe_kwargs = {
    "prompt": prompt,
    "height": 1024,
    "width": 1024,
    "guidance_scale": 3.5,
    "num_inference_steps": 50,
    "max_sequence_length": 512,
}


print(f"Pipeline memory usage: {torch.cuda.max_memory_reserved() / 1024**3:.3f} GB")

image = pipe(
    **pipe_kwargs, generator=torch.manual_seed(0),
).images[0]

print(f"Pipeline memory usage: {torch.cuda.max_memory_reserved() / 1024**3:.3f} GB")

image.save("flux-dev_bnb_4bit.png")

ملحوظة: عند الاستخدام PipelineQuantizationConfig مع bitsandbytes، تحتاج إلى الاستيراد DiffusersBitsAndBytesConfig من diffusers و TransformersBitsAndBytesConfig من transformers بشكل منفصل. وذلك لأن هذه المكونات تنشأ من مكتبات مختلفة. إذا كنت تفضل إعدادًا أبسط دون إدارة هذه الواردات المميزة، فيمكنك استخدام أسلوب بديل للتكميم على مستوى خط الأنابيب، ويوجد مثال على هذه الطريقة في وثائق Diffusers حول التكميم على مستوى خط الأنابيب.

لمزيد من المعلومات راجع مستندات bitsandbytes.

com.torchao

torchao هي مكتبة أصلية من PyTorch لتحسين البنية، حيث تقدم أنواع البيانات الكمية والتناثرية والمخصصة، والمصممة للتوافق مع torch.compile وFSDP. الناشرون يدعمون مجموعة واسعة من torchaoأنواع البيانات الغريبة، مما يتيح التحكم الدقيق في تحسين النموذج.

int4_weight_only

int8_weight_only

float8_weight_only

مقارنة مرئية لمخرجات نموذج Flux-dev باستخدام torcao int4_weight_only (يسار)، وint8_weight_only (وسط)، وfloat8_weight_only (يمين). (انقر على الصورة للتكبير)
دقة الشعلة الذاكرة بعد التحميل ذروة الذاكرة وقت الاستدلال
int4_weight_only 10.635 جيجابايت 14.654 جيجابايت 109 ثانية
int8_weight_only 17.020 جيجابايت 21.482 جيجابايت 15 ثانية
float8_weight_only 17.016 جيجابايت 21.488 جيجابايت 15 ثانية
مثال (Flux-dev مع torcao INT8 للوزن فقط):
@@
- from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
+ from diffusers import TorchAoConfig as DiffusersTorchAoConfig

- from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig
+ from transformers import TorchAoConfig as TransformersTorchAoConfig
@@
pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
-         "transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
-         "text_encoder_2": TransformersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
+         "transformer": DiffusersTorchAoConfig("int8_weight_only"),
+         "text_encoder_2": TransformersTorchAoConfig("int8_weight_only"),
    }
)
مثال (Flux-dev مع torcao INT4 للوزن فقط):
@@
- from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
+ from diffusers import TorchAoConfig as DiffusersTorchAoConfig

- from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig
+ from transformers import TorchAoConfig as TransformersTorchAoConfig
@@
pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
-         "transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
-         "text_encoder_2": TransformersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
+         "transformer": DiffusersTorchAoConfig("int4_weight_only"),
+         "text_encoder_2": TransformersTorchAoConfig("int4_weight_only"),
    }
)

pipe = FluxPipeline.from_pretrained(
    model_id,
    quantization_config=pipeline_quant_config,
    torch_dtype=torch.bfloat16,
+    device_map="balanced"
)
- pipe.to("cuda")

لمزيد من المعلومات راجع مستندات torchao.

كوانتو

Quanto هي مكتبة تكميمية متكاملة مع النظام البيئي Hugging Face عبر optimum مكتبة.

إنت4

إنت8

FP8

مقارنة مرئية لمخرجات نموذج Flux-dev باستخدام تقنية Quanto INT4 (يسار)، وINT8 (وسط)، وFP8 (يمين). (انقر على الصورة للتكبير)
الدقة الكمية الذاكرة بعد التحميل ذروة الذاكرة وقت الاستدلال
إنت4 12.254 جيجابايت 16.139 جيجابايت 109 ثانية
إنت8 17.330 جيجابايت 21.814 جيجابايت 15 ثانية
FP8 16.395 جيجابايت 20.898 جيجابايت 16 ثانية
مثال (Flux-dev مع وزن quanto INT8 فقط):
@@
- from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
+ from diffusers import QuantoConfig as DiffusersQuantoConfig

- from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig
+ from transformers import QuantoConfig as TransformersQuantoConfig
@@
pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
-         "transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
-         "text_encoder_2": TransformersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
+         "transformer": DiffusersQuantoConfig(weights_dtype="int8"),
+         "text_encoder_2": TransformersQuantoConfig(weights_dtype="int8"),
    }
)

ملحوظة: في وقت كتابة هذا التقرير، ستحتاج إلى دعم float8 مع Quanto optimum-quanto<0.2.5 واستخدام quanto مباشرة. سنعمل على إصلاح هذا.

مثال (Flux-dev مع وزن quanto FP8 فقط)
import torch
from diffusers import AutoModel, FluxPipeline
from transformers import T5EncoderModel
from optimum.quanto import freeze, qfloat8, quantize

model_id = "black-forest-labs/FLUX.1-dev"

text_encoder_2 = T5EncoderModel.from_pretrained(
    model_id,
    subfolder="text_encoder_2",
    torch_dtype=torch.bfloat16,
)

quantize(text_encoder_2, weights=qfloat8)
freeze(text_encoder_2)

transformer = AutoModel.from_pretrained(
      model_id,
      subfolder="transformer",
      torch_dtype=torch.bfloat16,
)

quantize(transformer, weights=qfloat8)
freeze(transformer)

pipe = FluxPipeline.from_pretrained(
    model_id,
    transformer=transformer,
    text_encoder_2=text_encoder_2,
    torch_dtype=torch.bfloat16
).to("cuda")

لمزيد من المعلومات راجع مستندات Quanto.

GGUF

GGUF هو تنسيق ملف شائع في مجتمع llama.cpp لتخزين النماذج الكمية.

س2_ك

س4_1

س8_0

مقارنة مرئية لمخرجات نموذج Flux-dev باستخدام التكميم GGUF Q2_k (يسار)، Q4_1 (وسط)، وQ8_0 (يمين). (انقر على الصورة للتكبير)
دقة GGUF الذاكرة بعد التحميل ذروة الذاكرة وقت الاستدلال
س2_ك 13.264 جيجابايت 17.752 جيجابايت 26 ثانية
س4_1 16.838 جيجابايت 21.326 جيجابايت 23 ثانية
س8_0 21.502 جيجابايت 25.973 جيجابايت 15 ثانية
مثال (Flux-dev مع GGUF Q4_1)
import torch
from diffusers import FluxPipeline, FluxTransformer2DModel, GGUFQuantizationConfig

model_id = "black-forest-labs/FLUX.1-dev"


ckpt_path = "https://huggingface.co/city96/FLUX.1-dev-gguf/resolve/main/flux1-dev-Q4_1.gguf"

transformer = FluxTransformer2DModel.from_single_file(
    ckpt_path,
    quantization_config=GGUFQuantizationConfig(compute_dtype=torch.bfloat16),
    torch_dtype=torch.bfloat16,
)

pipe = FluxPipeline.from_pretrained(
    model_id,
    transformer=transformer,
    torch_dtype=torch.bfloat16,
)
pipe.to("cuda")

لمزيد من المعلومات راجع مستندات GGUF.

FP8 صب الطبقة (enable_layerwise_casting)

FP8 Layerwise Casting هي تقنية لتحسين الذاكرة. وهو يعمل عن طريق تخزين أوزان النموذج بتنسيق FP8 المدمج (نقطة عائمة 8 بت)، والذي يستخدم تقريبًا نصف ذاكرة الدقة القياسية FP16 أو BF16. قبل أن تقوم الطبقة بإجراء حساباتها مباشرة، يتم تحويل أوزانها ديناميكيًا إلى دقة حسابية أعلى (مثل FP16/BF16). بعد ذلك مباشرة، يتم إعادة الأوزان إلى FP8 للتخزين الفعال. ينجح هذا النهج لأن الحسابات الأساسية تحتفظ بدقة عالية، وعادةً ما يتم تخطي الطبقات الحساسة بشكل خاص للتكميم (مثل التطبيع). يمكن أيضًا دمج هذه التقنية مع التفريغ الجماعي لتوفير المزيد من الذاكرة.

FP8 (e4m3)

الإخراج المرئي لنموذج Flux-dev باستخدام تكميم FP8 Layerwise Casting (e4m3).
دقة الذاكرة بعد التحميل ذروة الذاكرة وقت الاستدلال
FP8 (e4m3) 23.682 جيجابايت 28.451 جيجابايت 13 ثانية
import torch
from diffusers import AutoModel, FluxPipeline

model_id = "black-forest-labs/FLUX.1-dev"

transformer = AutoModel.from_pretrained(
    model_id,
    subfolder="transformer",
    torch_dtype=torch.bfloat16
)
transformer.enable_layerwise_casting(storage_dtype=torch.float8_e4m3fn, compute_dtype=torch.bfloat16)

pipe = FluxPipeline.from_pretrained(model_id, transformer=transformer, torch_dtype=torch.bfloat16)
pipe.to("cuda")

لمزيد من المعلومات، راجع مستندات صب Layerwise.

الجمع مع المزيد من تحسينات الذاكرة وtorch.compile

يمكن دمج معظم هذه الواجهات الخلفية للتكميم مع تقنيات تحسين الذاكرة المتوفرة في Diffusers. دعونا نستكشف تفريغ وحدة المعالجة المركزية، وتفريغ المجموعة، و torch.compile. يمكنك معرفة المزيد حول هذه التقنيات في وثائق Diffusers.

ملحوظة: في وقت كتابة هذا التقرير، bnb + torch.compile يعمل أيضًا إذا تم تثبيت bnb من المصدر واستخدام pytorch ليلاً أو مع fullgraph=False.

مثال (Flux-dev مع BnB 4-bit +enable_model_cpu_offload):
import torch
from diffusers import FluxPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

model_id = "black-forest-labs/FLUX.1-dev"

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
        "text_encoder_2": TransformersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16),
    }
)

pipe = FluxPipeline.from_pretrained(
    model_id,
    quantization_config=pipeline_quant_config,
    torch_dtype=torch.bfloat16
)
- pipe.to("cuda")
+ pipe.enable_model_cpu_offload()

تفريغ وحدة المعالجة المركزية النموذجية (enable_model_cpu_offload): تقوم هذه الطريقة بنقل مكونات النموذج بالكامل (مثل UNet أو برامج تشفير النص أو VAE) بين وحدة المعالجة المركزية ووحدة معالجة الرسومات أثناء مسار الاستدلال. فهو يوفر توفيرًا كبيرًا في VRAM وهو بشكل عام أسرع من التفريغ الأكثر تفصيلاً لأنه يتضمن عمليات نقل بيانات أقل وأكبر.

بي ان بي + enable_model_cpu_offload:

دقة الذاكرة بعد التحميل ذروة الذاكرة وقت الاستدلال
4 بت 12.383 جيجابايت 12.383 جيجابايت 17 ثانية
8 بت 19.182 جيجابايت 23.428 جيجابايت 27 ثانية
مثال (Flux-dev مع صب طبقة fp8 + تفريغ المجموعة):
import torch
from diffusers import FluxPipeline, AutoModel

model_id = "black-forest-labs/FLUX.1-dev"

transformer = AutoModel.from_pretrained(
    model_id,
    subfolder="transformer",
    torch_dtype=torch.bfloat16,
    # device_map="cuda"
)
transformer.enable_layerwise_casting(storage_dtype=torch.float8_e4m3fn, compute_dtype=torch.bfloat16)
+ transformer.enable_group_offload(onload_device=torch.device("cuda"), offload_device=torch.device("cpu"), offload_type="leaf_level", use_stream=True)

pipe = FluxPipeline.from_pretrained(model_id, transformer=transformer, torch_dtype=torch.bfloat16)
- pipe.to("cuda")

تفريغ المجموعة (enable_group_offload ل diffusers المكونات أو apply_group_offloading لعامة torch.nn.Moduleق): يقوم بنقل مجموعات من طبقات النموذج الداخلية (مثل torch.nn.ModuleList أو torch.nn.Sequential مثيلات) إلى وحدة المعالجة المركزية. عادةً ما يكون هذا الأسلوب أكثر كفاءة في الذاكرة من التفريغ الكامل للنموذج وأسرع من التفريغ المتسلسل.

FP8 صب الطبقات + تفريغ المجموعة:

دقة الذاكرة بعد التحميل ذروة الذاكرة وقت الاستدلال
FP8 (e4m3) 9.264 جيجابايت 14.232 جيجابايت 58 ثانية
مثال (Flux-dev مع torcao 4-bit + torch.compile):
import torch
from diffusers import FluxPipeline
from diffusers import TorchAoConfig as DiffusersTorchAoConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import TorchAoConfig as TransformersTorchAoConfig

from torchao.quantization import Float8WeightOnlyConfig

model_id = "black-forest-labs/FLUX.1-dev"
dtype = torch.bfloat16

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer":DiffusersTorchAoConfig("int4_weight_only"),
        "text_encoder_2": TransformersTorchAoConfig("int4_weight_only"),
    }
)

pipe = FluxPipeline.from_pretrained(
    model_id,
    quantization_config=pipeline_quant_config,
    torch_dtype=torch.bfloat16,
    device_map="balanced"
)

+ pipe.transformer = torch.compile(pipe.transformer, mode="max-autotune", fullgraph=True)

ملحوظة: torch.compile يمكن أن يقدم اختلافات رقمية دقيقة، مما يؤدي إلى تغييرات في إخراج الصورة

torch.compile: أسلوب تكميلي آخر هو تسريع تنفيذ النموذج الخاص بك باستخدام ميزة torch.compile() الخاصة بـ PyTorch 2.x. لا يؤدي تجميع النموذج إلى خفض الذاكرة بشكل مباشر، ولكنه يمكن أن يؤدي إلى تسريع الاستدلال بشكل كبير. تعمل مجموعة PyTorch 2.0 (Torch Dynamo) عن طريق تتبع الرسم البياني النموذجي وتحسينه مسبقًا.

تورشاو + torch.compile:

دقة الشعلة الذاكرة بعد التحميل ذروة الذاكرة وقت الاستدلال تجميع الوقت
int4_weight_only 10.635 جيجابايت 15.238 جيجابايت 6 ثواني ~285 ثانية
int8_weight_only 17.020 جيجابايت 22.473 جيجابايت 8 ثواني ~851 ثانية
float8_weight_only 17.016 جيجابايت 22.115 جيجابايت 8 ثواني ~545 ثانية

استكشف بعض نتائج المقارنة المرجعية هنا:

على استعداد لاستخدام نقاط التفتيش الكمية

يمكنك أن تجد bitsandbytes و torchao نماذج كمية من منشور المدونة هذا في مجموعة Hugging Face: رابط المجموعة.

خاتمة

فيما يلي دليل سريع لاختيار الواجهة الخلفية للتكميم:

  • أسهل توفير للذاكرة (NVIDIA): ابدأ بـ bitsandbytes 4/8 بت. ويمكن أيضًا دمج هذا مع torch.compile() للاستدلال بشكل أسرع.
  • إعطاء الأولوية لسرعة الاستدلال: torchao, GGUF، و bitsandbytes يمكن استخدامها جميعا مع torch.compile() لتعزيز سرعة الاستدلال.
  • لمرونة الأجهزة (CPU/MPS)، دقة FP8: Quanto يمكن أن يكون خيارا جيدا.
  • البساطة (هوبر/آدا): استكشاف FP8 Layerwise Casting (enable_layerwise_casting).
  • لاستخدام نماذج GGUF الموجودة: استخدم تحميل GGUF (from_single_file).
  • غريبة عن التدريب مع التكميم؟ ترقبوا مشاركة مدونة للمتابعة حول هذا الموضوع! التحديث (19 يونيو 2025): لقد وصل!

يؤدي التكميم إلى تقليل حاجز الدخول بشكل كبير لاستخدام نماذج الانتشار الكبيرة. قم بتجربة هذه الواجهات الخلفية للعثور على أفضل توازن بين الذاكرة والسرعة والجودة لتلبية احتياجاتك.

شكر وتقدير: شكرًا لـ Chunte على تقديم الصورة المصغرة لهذا المنشور.

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