Diffusers documentation

Quanto

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Quanto

تم إيقاف استخدام وحدة الخلفية Quanto وسيتم إزالتها في الإصدار 1.0.0. يُنصح بالتبديل إلى إحدى وحدات الخلفية للتكميم المدعومة الأخرى، مثل bitsandbytes أو torchao.

Quanto هو واجهة خلفية لتكميم PyTorch مخصصة لـ Optimum. وقد صُمم مع مراعاة التنوع والبساطة:

  • جميع الميزات متاحة في الوضع العاجل (يعمل مع النماذج غير القابلة للتتبع)
  • يدعم التدريب الواعي بالكمّ
  • النماذج المُكمّمة متوافقة مع torch.compile
  • النماذج المُكمّمة مستقلة عن الجهاز (مثل CUDA وXPU وMPS وCPU)

للاستفادة من وحدة الخلفية Quanto، ستحتاج أولاً إلى تثبيت optimum-quanto>=0.2.6 وaccelerate

pip install optimum-quanto accelerate

الآن يمكنك تكميم نموذج عن طريق تمرير كائن QuantoConfig إلى طريقة from_pretrained(). على الرغم من أن مكتبة Quanto تسمح بتكميم وحدات nn.Conv2d وnn.LayerNorm، إلا أن Diffusers يدعم حاليًا تكميم الأوزان في طبقات nn.Linear في النموذج فقط. يوضح المقطع التالي كيفية تطبيق تكميم float8 باستخدام Quanto.

import torch
from diffusers import FluxTransformer2DModel, QuantoConfig

model_id = "black-forest-labs/FLUX.1-dev"
quantization_config = QuantoConfig(weights_dtype="float8")
transformer = FluxTransformer2DModel.from_pretrained(
      model_id,
      subfolder="transformer",
      quantization_config=quantization_config,
      dtype=torch.bfloat16,
)

pipe = FluxPipeline.from_pretrained(model_id, transformer=transformer, dtype=dtype)
pipe.to("cuda")  # or "mps", "xpu", "cpu"

prompt = "A cat holding a sign that says hello world"
image = pipe(
    prompt, num_inference_steps=50, guidance_scale=4.5, max_sequence_length=512
).images[0]
image.save("output.png")

تخطي التكميم على وحدات محددة

من الممكن تجاوز تطبيق التكميم على وحدات معينة باستخدام الحجة modules_to_not_convert في QuantoConfig. يرجى التأكد من أن الوحدات المُمررة إلى هذه الحجة تطابق مفاتيح الوحدات في state_dict

import torch
from diffusers import FluxTransformer2DModel, QuantoConfig

model_id = "black-forest-labs/FLUX.1-dev"
quantization_config = QuantoConfig(weights_dtype="float8", modules_to_not_convert=["proj_out"])
transformer = FluxTransformer2DModel.from_pretrained(
      model_id,
      subfolder="transformer",
      quantization_config=quantization_config,
      dtype=torch.bfloat16,
)

استخدام from_single_file مع وحدة الخلفية Quanto

يتوافق QuantoConfig مع ~FromOriginalModelMixin.from_single_file.

import torch
from diffusers import FluxTransformer2DModel, QuantoConfig

ckpt_path = "https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/flux1-dev.safetensors"
quantization_config = QuantoConfig(weights_dtype="float8")
transformer = FluxTransformer2DModel.from_single_file(ckpt_path, quantization_config=quantization_config, dtype=torch.bfloat16)

حفظ النماذج المُكمّاة

يدعم Diffusers تسلسل نماذج Quanto باستخدام الطريقة ~ModelMixin.save_pretrained.

تختلف متطلبات التسلسل والتحميل بين النماذج المُكمّاة مباشرةً باستخدام مكتبة Quanto والنماذج المُكمّاة باستخدام Diffusers مع اعتماد Quanto كخلفية. ولا يزال من غير الممكن حاليًا تحميل النماذج المُكمّاة مباشرةً باستخدام Quanto داخل Diffusers باستخدام ~ModelMixin.from_pretrained

import torch
from diffusers import FluxTransformer2DModel, QuantoConfig

model_id = "black-forest-labs/FLUX.1-dev"
quantization_config = QuantoConfig(weights_dtype="float8")
transformer = FluxTransformer2DModel.from_pretrained(
      model_id,
      subfolder="transformer",
      quantization_config=quantization_config,
      dtype=torch.bfloat16,
)
# save quantized model to reuse
transformer.save_pretrained("<your quantized model save path>")

# you can reload your quantized model with
model = FluxTransformer2DModel.from_pretrained("<your quantized model save path>")

استخدام torch.compile مع Quanto

يدعم إطار عمل Quanto حاليًا torch.compile لأنواع التكميم التالية:

  • أوزان int8
import torch
from diffusers import FluxPipeline, FluxTransformer2DModel, QuantoConfig

model_id = "black-forest-labs/FLUX.1-dev"
quantization_config = QuantoConfig(weights_dtype="int8")
transformer = FluxTransformer2DModel.from_pretrained(
    model_id,
    subfolder="transformer",
    quantization_config=quantization_config,
    dtype=torch.bfloat16,
)
transformer = torch.compile(transformer, mode="max-autotune", fullgraph=True)

pipe = FluxPipeline.from_pretrained(
    model_id, transformer=transformer, dtype=dtype
)
pipe.to("cuda")  # or "mps", "xpu", "cpu"
images = pipe("A cat holding a sign that says hello").images[0]
images.save("flux-quanto-compile.png")

أنواع التكميم المدعومة

الأوزان

  • float8
  • int8
  • int4
  • int2
Update on GitHub