Diffusers documentation
DiffusionGemma
DiffusionGemma
DiffusionGemma هو نموذج لغة مُرمِّز-مُفكِّك يعتمد على الانتشار على مستوى الكتل. يقرأ المُرمِّز السببي الموجه النظيف (وأي كتل تم توليدها سابقًا) إلى ذاكرة KV، بينما يُزيل المُفكِّك الاتجاهي الضوضاء من «لوحة» بحجم ثابت تتكون من canvas_length رمزًا من خلال الانتباه المتقاطع إلى تلك الذاكرة. يتناوب التوليد بين حلقة خارجية ذاتية التراجع على مستوى اللوحات وحلقة داخلية لإزالة الضوضاء، حيث يقوم كل خطوة فيها بسحب رموز مرشحة، والتأكيد على الأكثر ثقة منها عبر BlockRefinementScheduler في وضع التلطيخ المنتظم، وإعادة إضافة الضوضاء إلى البقية. يقع النموذج نفسه في transformers على شكل DiffusionGemmaForBlockDiffusion؛ والنقطة الفاحصة المُصدَّرة هي google/diffusiongemma-26B-A4B-it.
الاستخدام
import torch
from transformers import AutoProcessor, DiffusionGemmaForBlockDiffusion
from diffusers import BlockRefinementScheduler, DiffusionGemmaPipeline
model_id = "google/diffusiongemma-26B-A4B-it"
model = DiffusionGemmaForBlockDiffusion.from_pretrained(model_id, dtype=torch.bfloat16, device_map="auto")
processor = AutoProcessor.from_pretrained(model_id)
scheduler = BlockRefinementScheduler()
pipe = DiffusionGemmaPipeline(model=model, scheduler=scheduler, processor=processor)
pipe.model.model.decoder = torch.compile(pipe.model.model.decoder, mode="reduce-overhead", fullgraph=True)
output = pipe(
prompt="Why is the sky blue?",
gen_length=256,
num_inference_steps=48,
cache_implementation="static",
)
print(output.texts[0])num_inference_steps هو عدد خطوات إزالة الضوضاء لكل لوحة (48 يتطابق مع نقطة التفتيش المنشورة)؛ فعدد خطوات أقل يكون أسرع لكن بجودة أدنى. يتيح cache_implementation="static" أن يكون المُفكِّك قابلاً للتجميع باستخدام torch.compile مع cudagraphs (انظر التخزين المؤقت الثابت والتجميع)؛ احذف كليهما للحصول على تشغيل أبسط بتخزين مؤقت ديناميكي.
للإدخالات متعددة الأدوار أو متعددة الوسائط، مرّر محادثة خام messages بدلاً من prompt. وهو قائمة من قواميس {"role", "content"} بالصيغة المعتادة للمحادثات، يمرّ المعالج بها عبر قالب المحادثة الخاص به:
messages = [
{"role": "user", "content": "Why is the sky blue?"},
]
# or with an image:
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": image},
{"type": "text", "text": "Describe this image."},
],
},
]
output = pipe(messages=messages, gen_length=256)في حالة دور مستخدم واحد، يمكنك تجاوز messages وتقديم image إلى جانب prompt؛ حيث يقوم المعالج بتحويلها تلقائيًا إلى مدخلات الصورة الخاصة بالنموذج.
المجدولون
المجدول هو المُعيّن الذي يُزيل الضوضاء من كل لوحة، وهو قابل للاستبدال: استبدله لتغيير استراتيجية العينة دون المساس بأي شيء آخر. يتوفر ثلاثة مجدول
- BlockRefinementScheduler (الافتراضي): يثبّت الرموز الأكثر ثقة في كل خطوة (تلك التي تتجاوز
threshold، بالإضافة إلى حصة متساوية لكل خطوة) ويعيد إضافة الضوضاء إلى البقية. كما يتيحediting_thresholdإعادة تحرير الرموز المثبتة مسبقًا. - DiscreteDDIMScheduler: يعيّن كل موضع من التوزيع الخلفي المنفصل الدقيق لعملية التلوث المنتظمة (D3PM). وهو خالٍ من المعلمات، والخطوة النهائية تلتزم بشكل حتمي بالرموز المتوقعة.
- EntropyBoundScheduler: يُثبّت المواضع ذات الإنتروبيا الأدنى التي تبقى إنتروبياها المشتركة دون
entropy_bound، بحيث تُقبل الرموز شبه المستقلة معًا. وهو يُبرّد درجة حرارة العينة منt_max(0.8) في الخطوة الأولى إلىt_min(0.4) في الخطوة الأخيرة، بما يتوافق مع مُعيّن نقاط التفتيش المُصدر.
from diffusers import DiscreteDDIMScheduler, EntropyBoundScheduler
pipe.scheduler = DiscreteDDIMScheduler()
# or: pipe.scheduler = EntropyBoundScheduler(entropy_bound=0.1)
output = pipe(prompt="Why is the sky blue?", gen_length=256, num_inference_steps=48)
print(output.texts[0])تُضبط خيارات العينة الخاصة بالجدول الزمني (مثل threshold/top_k لتحسين الكتلة، وحد الإنتروبيا، ...) على إعدادات الجدول الزمني:
from diffusers import BlockRefinementScheduler
pipe.scheduler = BlockRefinementScheduler.from_config(pipe.scheduler.config, threshold=0.9)يُخفّض EntropyBoundScheduler درجة حرارة العينة (t_max/t_min) داخلياً على مدى خطوات إزالة الضوضاء؛ بينما يستخدم DiscreteDDIMScheduler وBlockRefinementScheduler قيمة temperature الثابتة المُمرَّرة إلى خط الأنابيب (0.0 للاستخدام الجشع).
عينة التنبؤ والتصحيح
DiscreteDDIMScheduler يدعم مُصحِّح التنبؤ-التصحيح مع استبعاد عنصر واحد (leave-one-out predictor-corrector) في Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation. فهو يُحسّن اللوحة عبر corrector_steps من عمليات مسح غيبس (Gibbs sweeps) تعيد أخذ عينات من المواضع الأقل ثقة من الشرطي أحادي الإحداثي (one-coordinate conditional) للتوزيع الحدي الضوضائي (noisy marginal)، مما يُبقي ذلك التوزيع الحدي دون تغيير ويحسّن التوليد دون أي تكلفة تدريب إضافية. ويعمل مباشرة على نقطة التفتيش (checkpoint) المنشورة: ففي الانتشار المنتظم (uniform diffusion) يمكن استبدال مُزيل الضوضاء (denoiser) والخلفي (posterior) الخاص باستبعاد عنصر واحد بشكل مكافئ بصيغة مغلقة، لذا يستعيد المُصحِّح كميات استبعاد عنصر واحد التي يحتاجها دون أي إعادة تدريب.
تُدمج عمليات المسح المُصحِّحة ضمن ميزانية num_inference_steps بدلاً من إضافتها فوقها: حيث يُنفّذ خط الأنابيب عدداً أقل من خطوات المُتنبّئ ويخصص التقدّمات المحرَّرة للمُصحِّحات، وبالتالي يبقى إجمالي عدد تقدّمات النموذج num_inference_steps وتكون تكلفة المُتنبّئ-المُصحِّح مماثلة لتكلفة العيّنات الأصلية البسيطة.
from diffusers import DiscreteDDIMScheduler
pipe.scheduler = DiscreteDDIMScheduler(corrector_steps=2, corrector_k=12)
output = pipe(prompt="Why is the sky blue?", gen_length=256, num_inference_steps=48)
print(output.texts[0])مُكيّفات PEFT
يعتمد المُزيل للضوضاء على نموذج 🤗 Transformers، لذا يتم تحميل المُكيّفات (adapters) عبر تكامل PEFT الأصلي الخاص به بدلاً من واجهة load_lora_weights في مكتبة diffusers. وبما أن هذا التكامل لا يعتمد على نوع المُكيّف، فإن نفس الاستدعاءات تُحمّل LoRA أو DoRA أو أي مُكيّف PEFT آخر (مثل ناتج SFTTrainer من TRL). قم بإدارة المُكيّفات مباشرة على مكوّن النموذج:
pipe.model.load_adapter("path/to/adapter", adapter_name="sft") # LoRA, DoRA, ...
pipe.model.set_adapter("sft")
output = pipe(prompt="Why is the sky blue?", gen_length=256)
pipe.model.disable_adapters() # run the base model
pipe.model.delete_adapter("sft")تبقى المُكيّفات نشطة وغير مدمجة: يربط DiffusionGemma أوزان الأساس للمُشفِّر والمُفكِّك، لذا فإن دمج المُكيّف فيهما سيُفسد كلا الفرعين.
التخزين المؤقت الثابت والتجميع
يُعبّئ خطّ الأنابيب المُشفِّر مرة واحدة لكل كتلة في ذاكرة مؤقتة قابلة لإعادة الاستخدام (من نوع DynamicCache افتراضيًا). عند تمرير cache_implementation="static"، يتم استخدام StaticCache ذو شكل ثابت بدلاً من ذلك، مما يتيح لك torch.compile المُفكِّك باستخدام cudagraphs لتحقيق تسريع إضافي (حيث يحدد خطّ الأنابيب كل خطوة وينسخ logits حتى لا يتم تجاوز ذاكرة cudagraph)؛ وهذا هو الإعداد المعروض في الاستخدام. احذف كلا من استدعاء torch.compile وcache_implementation="static" للحصول على تشغيل أبسط بذاكرة مؤقتة ديناميكية.
الإيقاف التكيفي
عادةً ما يتقارب الكتل قبل استنفاد جميع num_inference_steps، لذا يقوم خط الأنابيب افتراضيًا بتجميد كل مثال في الدفعة بمجرد أن يصبح تنبؤ argmax الخاص به مستقرًا لعدد stability_threshold من الخطوات وأن ينخفض متوسط إنتروبيا كل رمز إلى ما دون confidence_threshold (0.005، القيمة المستخدمة في نقطة التفتيش المنشورة). ينتهي حلقة إزالة الضوضاء بمجرد تجميد جميع الأمثلة. يقلل هذا تقريبًا من عدد عمليات تمرير المُفكِّك إلى النصف عند جودة مطابقة، وهو أكبر رافعة منفردة لتحسين الإنتاجية. مرر confidence_threshold=None لتشغيل num_inference_steps الكاملة دائمًا:
output = pipe(prompt="Why is the sky blue?", gen_length=256, confidence_threshold=None) # disable adaptive stoppingالمكالمات العكسية
تُنفَّذ استدعاءات المراجعة (Callbacks) بعد كل خطوة إزالة ضوضاء. مرّر callback_on_step_end_tensor_inputs لاختيار المصفوفات (tensors) التي تُدرَج في callback_kwargs؛ حيث يتوفر canvas (رموز الكتل الحالية) وlogits. أعد {"canvas": ...} من استدعاء المراجعة لاستبدال الـ canvas.
def on_step_end(pipe, step, timestep, callback_kwargs):
canvas = callback_kwargs["canvas"]
# Inspect or modify `canvas` here.
return {"canvas": canvas}
out = pipe(
prompt="Why is the sky blue?",
callback_on_step_end=on_step_end,
callback_on_step_end_tensor_inputs=["canvas"],
)DiffusionGemmaPipeline
فئة diffusers.DiffusionGemmaPipeline
< source >( model: Anyscheduler: BlockRefinementScheduler | DiscreteDDIMScheduler | EntropyBoundSchedulerprocessor: Any )
المعاملات
- model (DiffusionGemmaForBlockDiffusion) — مزيل الضوضاء الخاص بالانتشار الكتلوي (مُشفِّر سببي + مُفكِّك ثنائي الاتجاه بأوزان مرتبطة).
- scheduler (BlockRefinementScheduler أو DiscreteDDIMScheduler أو EntropyBoundScheduler) — المُعيّن الذي يُثبّت رموز اللوحة ويُعيد إدخال الضوضاء إليها في كل خطوة إزالة ضوضاء.
- processor (ProcessorMixin) — المعالج المستخدم لتطبيق قالب المحادثة وفك ترميز الرموز المولّدة.
خط أنابيب لتوليد النص بالانتشار على مستوى الكتل في DiffusionGemma.
DiffusionGemma هو نموذج مُشفِّر-مُفكِّك يعتمد على الانتشار على مستوى الكتل: يقرأ المُشفِّر السببي الموجه النظيف (وأي كتل تم توليدها سابقًا) إلى ذاكرة KV، بينما يُزيل المُفكِّك الاتجاهي الضوضاء من «لوحة» بحجم ثابت يتكون من canvas_length رمزًا من خلال الانتباه المتقاطع إلى تلك الذاكرة. يتناوب التوليد بين حلقة خارجية ذاتية التراجع على مستوى اللوحات وحلقة داخلية لإزالة الضوضاء، حيث يقوم كل خطوة فيها بسحب رموز مرشحة، وتثبيت الأكثر ثقة عبر BlockRefinementScheduler (وضع إتلاف منتظم، mask_token_id=None)، وإعادة إضافة الضوضاء إلى البقية.
من المتوقع أن يكون النموذج مثيلًا من DiffusionGemmaForBlockDiffusion يعرّف forward(input_ids, decoder_input_ids=..., self_conditioning_logits=..., ...) ويعيد قيم logits بأبعاد [batch, canvas_length, vocab_size] على اللوحة. راجع بطاقة النموذج في https://huggingface.co/google/diffusiongemma-26B-A4B-it.
__call__
< source >( prompt: str | list[str] | None = Nonemessages: list[dict] | None = Noneimage: Any | list[Any] | None = Noneadd_generation_prompt: bool = Truegen_length: int = 256num_inference_steps: int = 48temperature: float = 0.0cache_implementation: str | None = Noneeos_early_stop: bool = Trueeos_token_id: int | None = Nonestability_threshold: int = 1confidence_threshold: float | None = 0.005generator: torch.Generator | None = Noneoutput_type: str = 'text'return_dict: bool = Truecallback_on_step_end: Callable[[Any, int, int, dict], dict] | PipelineCallback | MultiPipelineCallbacks | None = Nonecallback_on_step_end_tensor_inputs: list[str] | None = None ) → DiffusionGemmaPipelineOutput or tuple
المعاملات
- prompt (
strأوList[str]، اختياري) — نص الموجه، مُغلَّف بقالب المحادثة ومُرمَّز بواسطة المعالج. قدّم هذا أوmessages. - messages (
List[Dict]، اختياري) — محادثة خام للتشفير، مثل[{"role": "user", "content": "Hello"}]أو محادثة متعددة الأدوار / الوسائط. استخدم هذا بدلاً منpromptلأي شيء يتجاوز دور مستخدم واحد. - image (
PIL.Image.ImageأوList، اختياري) — الصورة أو الصور التي تُقرَن معpromptللتوليد متعدد الوسائط؛ يقوم المعالج بتحويلها إلى مدخلات الصورة للنموذج. للحصول على تخطيطات أغنى، ضع محتوى الصورة مباشرةً فيmessages. - add_generation_prompt (
bool، القيمة الافتراضيةTrue) — ما إذا كان يجب إضافة موجه التوليد عند تطبيق قالب المحادثة. - gen_length (
int، القيمة الافتراضية256) — عدد الرموز التي سيتم توليدها، مع تقريبها لأعلى إلى مضاعف لـcanvas_lengthالخاص بالنموذج. - num_inference_steps (
int، القيمة الافتراضية48) — عدد خطوات إزالة الضوضاء لكل لوحة. - temperature (
float، القيمة الافتراضية0.0) — درجة حرارة العينة لـDiscreteDDIMScheduler/BlockRefinementScheduler(حيث أن0.0تعني أخذ القيمة القصوى greedily)؛ يتجاهلEntropyBoundSchedulerهذه القيمة ويضبط درجة حرارته الخاصة. أما إعدادات العينة الأخرى (مثلtop_k،threshold،t_min/t_max) فهي إعدادات للمجدول (scheduler)؛ اضبطها على المجدول، على سبيل المثالpipe.scheduler = BlockRefinementScheduler.from_config(pipe.scheduler.config, top_k=...). - cache_implementation (
str, اختياري) — اضبطه على"static"لملء المُشفِّر مسبقًا مرة واحدة لكل كتلة فيStaticCacheدائم، وتشغيل المُفكِّك ضده بأشكال ثابتة، بدلاً من إعادة ترميز التسلسل الكامل في كل خطوة. كما تتيح لك الأشكال الثابتة تجميع المُفكِّك، على سبيل المثالpipe.model.model.decoder = torch.compile(pipe.model.model.decoder, fullgraph=True). - eos_early_stop (
bool، القيمة الافتراضيةTrue) — ما إذا كان يجب التوقف عن توليد المزيد من اللوحات بمجرد أن تُصدر كل تسلسل رمز EOS. - eos_token_id (
int, اختياري) — معرّف رمز EOS للإيقاف المبكر. في حال عدم توفره، يُرجع إلى مُجزّئ المُعالِج. - stability_threshold (
int، القيمة الافتراضية1) — عدد الخطوات المتتالية التي يجب أن تبقى فيها التنبؤ الأقصى (argmax) لعينة دون تغيير حتى تُحتسب تلك العينة مستقرة. يُستخدم فقط عند تعيينconfidence_threshold. - confidence_threshold (
float، اختياري، القيمة الافتراضية0.005) — تجميد كل مثال بمجرد أن يصبح مستقرًا (انظرstability_threshold) وأن متوسط إنتروبيا الرمز الواحد لنتائج التنبؤ المُشكَّلة بواسطة المُجدول الخاص به أقل من هذه القيمة. ينتهي حلقة إزالة الضوضاء في الكتلة بمجرد تجميد جميع الأمثلة. يُسرّع عملية التوليد مع الحفاظ على الجودة نفسها؛ القيمة الافتراضية تتطابق مع نقطة الفحص المُصدَّرة. اضبطها علىNoneلتشغيل جميعnum_inference_stepsدائمًا. - generator (
torch.Generator، اختياري) — مولّد الأرقام العشوائية (RNG) للعينات. - output_type (
str)، القيمة الافتراضية"text"—"text"يرمز التسلسلات إلى نصوص (يتطلب معالجًا)؛"seq"يعيد معرّفات الرموز فقط. - return_dict (
bool، القيمة الافتراضيةTrue) — ما إذا كان يجب إرجاع DiffusionGemmaPipelineOutput بدلاً من tuple. - callback_on_step_end (
CallableأوPipelineCallback، اختياري) — دالة استجابة تُنفَّذ بعد كل خطوة إزالة ضوضاء، وتوقيعهاcallback_on_step_end(self, step, timestep, callback_kwargs). مفاتيح المصفوفات المسموح بها:canvas،logits. - callback_on_step_end_tensor_inputs (
List[str]، اختياري) — مفاتيح المصفوفات التي يجب تمريرها إلى الاستدعاء العكسي.
يعيد
DiffusionGemmaPipelineOutput أو tuple
معرّفات الرموز المولّدة (sequences) و، في حالة output_type="text"، texts المُفكّكة.
توليد النص باستخدام الانتشار الكتلوي.
أمثلة:
>>> import torch
>>> from transformers import AutoProcessor, DiffusionGemmaForBlockDiffusion
>>> from diffusers import BlockRefinementScheduler, DiffusionGemmaPipeline
>>> model_id = "google/diffusiongemma-26B-A4B-it"
>>> model = DiffusionGemmaForBlockDiffusion.from_pretrained(model_id, dtype=torch.bfloat16, device_map="auto")
>>> processor = AutoProcessor.from_pretrained(model_id)
>>> scheduler = BlockRefinementScheduler()
>>> pipe = DiffusionGemmaPipeline(model=model, scheduler=scheduler, processor=processor)
>>> output = pipe(prompt="Why is the sky blue?", gen_length=256)
>>> print(output.texts[0])DiffusionGemmaPipelineOutput
فئة diffusers.DiffusionGemmaPipelineOutput
< source >( sequences: torch.LongTensortexts: list[str] | None = None )
فئة الإخراج لتوليد الانتشار على مستوى الكتل في DiffusionGemma.