Buckets:

mishig's picture
download
raw
37 kB
<meta charset="utf-8" /><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;إجراءات الاستدعاء (Callbacks) في خط الأنابيب&quot;,&quot;local&quot;:&quot;pipeline-callbacks&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;الإيقاف المبكر&quot;,&quot;local&quot;:&quot;early-stopping&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;عرض الصور الوسيطة&quot;,&quot;local&quot;:&quot;display-intermediate-images&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;خطوط أنابيب معيارية&quot;,&quot;local&quot;:&quot;modular-pipelines&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2}],&quot;depth&quot;:1}"/>
<link href="/docs/diffusers/main/en/_app/immutable/entry/start.D3LnKZ4R.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/chunks/BF9UNEM9.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/chunks/DPnyVmXs.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/entry/app.C0rBoMxR.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/chunks/DSGUT_OW.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/chunks/C045MWWx.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/chunks/DnVIJfC5.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/chunks/DsnmJJEf.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/nodes/0.DTZsP_3B.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/chunks/IaDvMxLQ.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/nodes/321.BrfVDjiZ.js" rel="modulepreload">
<link href="/docs/diffusers/main/en/_app/immutable/chunks/bKdwVYpU.js" rel="modulepreload">
<!--apt59n--><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;Pipeline callbacks&quot;,&quot;local&quot;:&quot;pipeline-callbacks&quot;,&quot;sections&quot;:[{&quot;title&quot;:&quot;Early stopping&quot;,&quot;local&quot;:&quot;early-stopping&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Display intermediate images&quot;,&quot;local&quot;:&quot;display-intermediate-images&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2},{&quot;title&quot;:&quot;Modular pipelines&quot;,&quot;local&quot;:&quot;modular-pipelines&quot;,&quot;sections&quot;:[],&quot;depth&quot;:2}],&quot;depth&quot;:1}"/><!---->
<link href="/docs/diffusers/main/en/_app/immutable/assets/0.tn0RQdqM.css" rel="modulepreload"> <!--[--><!--[0--><!--[--><!--[0--><!--[--><p></p> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: inline-end; margin-inline-start: 10px; display: inline-flex; position: relative; z-index: 10;"><div dir="ltr" class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 h-7 max-sm:h-7 px-2 max-sm:px-1.5 text-sm font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0 hover:text-gray-800 dark:hover:text-gray-200"><svg class="sm:size-3.5 size-3" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----></span> <span dir="auto">Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-7 max-sm:h-7 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible sm:size-3.5 size-3 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg><!----></button></div> <!--[-1--><!--]--></div><!----> <!--[0--><h1 class="relative group"><a id="pipeline-callbacks" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#pipeline-callbacks"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span><!---->إجراءات الاستدعاء (Callbacks) في خط الأنابيب<!----></span></h1><!--]--><!----> <p>تُنفَّذ الدالة الاستدعائية (Callback) في نهاية خطوة إزالة الضوضاء، ويمكنها تغيير حالة خط الأنابيب أو المصفوفات (Tensors) للخطوات اللاحقة. استخدمها لتعديل السمات أو متغيرات المصفوفات لتحقيق سلوك جديد دون إعادة كتابة خط الأنابيب.</p> <p>تعمل هذه الاستدعاءات (callbacks) مع حلقات <a href="/docs/diffusers/main/ar/api/pipelines/overview#diffusers.DiffusionPipeline">DiffusionPipeline</a> التقليدية دون أي إعداد مسبق. كما تعمل مع خطوط أنابيب <a href="../modular_diffusers/overview">Modular Diffusers</a> بمجرد إدراج كتلة تشغّلها داخل حلقة إزالة الضوضاء؛ راجع <a href="#modular-pipelines">خطوط أنابيب Modular</a>.</p> <p>توفر مكتبة Diffusers عدة استدعاءات مستدعاة (callbacks) في <a href="../api/pipelines/overview#diffusers.callbacks.PipelineCallback">نظرة عامة</a> على خط الأنابيب.</p> <p>لتفعيل استدعاء، قم بتحديد متى يُنفَّذ الاستدعاء بعد عدد معين من خطوات إزالة الضوضاء باستخدام أحد الحُجج التالية.</p> <ul><li><code>cutoff_step_ratio</code> يحدد متى يتم تفعيل الاستدعاء كنسبة مئوية من إجمالي خطوات إزالة الضوضاء. استخدمه عندما يجب أن تتناسب نقطة القطع مع <code>num_inference_steps</code> (على سبيل المثال، إسقاط CFG بعد 40% من التشغيل).</li> <li><code>cutoff_step_index</code> يحدد رقم الخطوة الدقيق الذي يتم فيه تفعيل الاستدعاء. استخدمه عندما يهمك خطوة مطلقة (على سبيل المثال، الخطوة <code>10</code> في جدول ثابت من 25 خطوة).</li></ul> <p>يستخدم المثال أدناه <code>cutoff_step_ratio=0.4</code>، مما يعني أن الاستدعاء الخلفي (callback) يُفعَّل عندما يصل إزالة الضوضاء (denoising) إلى 40% من إجمالي خطوات الاستدلال. يُعطّل <a href="/docs/diffusers/main/ar/api/pipelines/overview#diffusers.callbacks.SDXLCFGCutoffCallback">SDXLCFGCutoffCallback</a> التوجيه الحر من التصنيف (CFG) بعد عدد معين من الخطوات، مما قد يساعد في توفير الحسابات دون التأثير بشكل كبير على الأداء.</p> <p>حدد استدعاءً عكسيًا (callback) يحتوي على أحد حُجج <code>cutoff</code> وقم بتمريره إلى معامل <code>callback_on_step_end</code> في خط الأنابيب.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> تم النسخ</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> DPMSolverMultistepScheduler, StableDiffusionXLPipeline
<span class="hljs-keyword">from</span> diffusers.callbacks <span class="hljs-keyword">import</span> SDXLCFGCutoffCallback
callback = SDXLCFGCutoffCallback(cutoff_step_ratio=<span class="hljs-number">0.4</span>)
<span class="hljs-comment"># if using cutoff_step_index</span>
<span class="hljs-comment"># callback = SDXLCFGCutoffCallback(cutoff_step_ratio=None, cutoff_step_index=10)</span>
pipeline = StableDiffusionXLPipeline.from_pretrained(
<span class="hljs-string">&quot;stabilityai/stable-diffusion-xl-base-1.0&quot;</span>,
dtype=torch.float16,
device_map=<span class="hljs-string">&quot;cuda&quot;</span> <span class="hljs-comment"># or &quot;mps&quot;, &quot;xpu&quot;, &quot;cpu&quot;</span>
)
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config, use_karras_sigmas=<span class="hljs-literal">True</span>)
prompt = <span class="hljs-string">&quot;a sports car on the road, best quality, high quality, high detail, 8k resolution&quot;</span>
output = pipeline(
prompt=prompt,
negative_prompt=<span class="hljs-string">&quot;&quot;</span>,
guidance_scale=<span class="hljs-number">6.5</span>,
num_inference_steps=<span class="hljs-number">25</span>,
callback_on_step_end=callback,
)<!----></pre></div><!----> <p>تحدد الاستدعاءات الرسمية المدخلات المتجهية الخاصة بها. أما بالنسبة لدالة مخصصة، فمرّر <code>callback_on_step_end_tensor_inputs</code> كما هو موضح في <a href="#display-intermediate-images">عرض الصور الوسيطة</a>.</p> <p>إذا كنت ترغب في إضافة استجابة رسمية جديدة، فلا تتردد في فتح <a href="https://github.com/huggingface/diffusers/issues/new/choose" rel="nofollow">طلب ميزة</a> أو <a href="../conceptual/contribution#how-to-open-a-pr">إرسال طلب سحب</a>. وإلا، يمكنك أيضًا إنشاء استجابة خاصة بك كما هو موضح أدناه.</p> <!--[1--><h2 class="relative group"><a id="early-stopping" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#early-stopping"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span><!---->الإيقاف المبكر<!----></span></h2><!--]--><!----> <p>يُعدّ التوقف المبكر مفيدًا إذا لم تكن راضيًا عن النتائج الوسيطة أثناء التوليد. يحدد هذا الاستدعاء التلقائي نقطة توقف ثابتة من خلال تعيين الخاصية <code>_interrupt</code> إلى <code>True</code>، مما يجعل حلقة إزالة الضوضاء تتخطى الخطوات المتبقية.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> تم النسخ</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> DiffusionPipeline
<span class="hljs-keyword">def</span> <span class="hljs-title function_">interrupt_callback</span>(<span class="hljs-params">pipeline, i, t, callback_kwargs</span>):
stop_idx = <span class="hljs-number">10</span>
<span class="hljs-keyword">if</span> i == stop_idx:
pipeline._interrupt = <span class="hljs-literal">True</span>
<span class="hljs-keyword">return</span> callback_kwargs
pipeline = DiffusionPipeline.from_pretrained(
<span class="hljs-string">&quot;Qwen/Qwen-Image&quot;</span>,
dtype=torch.bfloat16,
device_map=<span class="hljs-string">&quot;cuda&quot;</span>, <span class="hljs-comment"># or &quot;mps&quot;, &quot;xpu&quot;, &quot;cpu&quot;</span>
)
pipeline(
prompt=<span class="hljs-string">&quot;A photo of a cat&quot;</span>,
num_inference_steps=<span class="hljs-number">50</span>,
callback_on_step_end=interrupt_callback,
)<!----></pre></div><!----> <!--[1--><h2 class="relative group"><a id="display-intermediate-images" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#display-intermediate-images"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span><!---->عرض الصور الوسيطة<!----></span></h2><!--]--><!----> <p>تُعدّ تصور الصور الوسيطة مفيدًا لمراقبة التقدم. المعاينة أدناه مخصصة لنموذج SDXL فقط. فهي تُحوّل كامنات SDXL إلى RGB باستخدام تحويل خطي للحصول على نظرة سريعة أثناء إزالة الضوضاء. لا يمكن نقل تلك الأوزان إلى نماذج أخرى. بالنسبة إلى Qwen-Image ونقاط التفتيش المشابهة، فكّك الترميز باستخدام VAE الخاص بالنموذج بدلاً من هذا المُساعد.</p> <p><a href="https://huggingface.co/blog/TimothyAlexisVass/explaining-the-sdxl-latent-space" rel="nofollow">تحويل</a> بيانات Stable Diffusion XL الكامنة (4 قنوات) إلى تينسورات RGB (3 قنوات).</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> تم النسخ</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image
<span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> AutoPipelineForText2Image
<span class="hljs-keyword">def</span> <span class="hljs-title function_">latents_to_rgb</span>(<span class="hljs-params">latents</span>):
weights = (
(<span class="hljs-number">60</span>, -<span class="hljs-number">60</span>, <span class="hljs-number">25</span>, -<span class="hljs-number">70</span>),
(<span class="hljs-number">60</span>, -<span class="hljs-number">5</span>, <span class="hljs-number">15</span>, -<span class="hljs-number">50</span>),
(<span class="hljs-number">60</span>, <span class="hljs-number">10</span>, -<span class="hljs-number">5</span>, -<span class="hljs-number">35</span>),
)
weights_tensor = torch.t(torch.tensor(weights, dtype=latents.dtype).to(latents.device))
biases_tensor = torch.tensor((<span class="hljs-number">150</span>, <span class="hljs-number">140</span>, <span class="hljs-number">130</span>), dtype=latents.dtype).to(latents.device)
rgb_tensor = torch.einsum(<span class="hljs-string">&quot;...lxy,lr -&gt; ...rxy&quot;</span>, latents, weights_tensor) + biases_tensor.unsqueeze(-<span class="hljs-number">1</span>).unsqueeze(-<span class="hljs-number">1</span>)
image_array = rgb_tensor.clamp(<span class="hljs-number">0</span>, <span class="hljs-number">255</span>).byte().cpu().numpy().transpose(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">0</span>)
<span class="hljs-keyword">return</span> Image.fromarray(image_array)<!----></pre></div><!----> <p>استخرج الكمونيات (latents) وحوّل الصورة الأولى في الدفعة إلى RGB. احفظ الصورة كملف PNG مع رقم الخطوة.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> تم النسخ</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">def</span> <span class="hljs-title function_">decode_tensors</span>(<span class="hljs-params">pipe, step, timestep, callback_kwargs</span>):
latents = callback_kwargs[<span class="hljs-string">&quot;latents&quot;</span>]
image = latents_to_rgb(latents[<span class="hljs-number">0</span>])
image.save(<span class="hljs-string">f&quot;<span class="hljs-subst">{step}</span>.png&quot;</span>)
<span class="hljs-keyword">return</span> callback_kwargs<!----></pre></div><!----> <p>استخدم <code>callback_on_step_end_tensor_inputs</code> لاختيار المصفوفات التي يستقبلها الاستدعاء العكسي، والتي في هذه الحالة هي الكمونيات.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> تم النسخ</div><!----></button><!----></div> <pre class="language-py "><!---->pipeline = AutoPipelineForText2Image.from_pretrained(
<span class="hljs-string">&quot;stabilityai/stable-diffusion-xl-base-1.0&quot;</span>,
dtype=torch.float16,
device_map=<span class="hljs-string">&quot;cuda&quot;</span> <span class="hljs-comment"># or &quot;mps&quot;, &quot;xpu&quot;, &quot;cpu&quot;</span>
)
image = pipeline(
prompt=<span class="hljs-string">&quot;A croissant shaped like a cute bear.&quot;</span>,
negative_prompt=<span class="hljs-string">&quot;Deformed, ugly, bad anatomy&quot;</span>,
callback_on_step_end=decode_tensors,
callback_on_step_end_tensor_inputs=[<span class="hljs-string">&quot;latents&quot;</span>],
).images[<span class="hljs-number">0</span>]<!----></pre></div><!----> <!--[1--><h2 class="relative group"><a id="modular-pipelines" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#modular-pipelines"><span><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg><!----></span></a> <span><!---->خطوط أنابيب معيارية<!----></span></h2><!--]--><!----> <p>لا تتضمن خطوط الأنابيب المعيارية آلية <code>callback_on_step_end</code> و<code>interrupt</code>. ستأتي بدلاً من ذلك بدعم أولي للبث: <a href="https://github.com/huggingface/diffusers/pull/14159" rel="nofollow">huggingface/diffusers#14159</a>، لم يتم دمجها بعد، تضيف <code>pipe.stream()</code>، والتي تُنتج حالة خط الأنابيب في كل خطوة إزالة ضوضاء وتُنهي التشغيل عندما تتوقف عن التكرار. في الوقت الحالي، لإعادة استخدام دوال الاستدعاء الموجودة لديك، أدخل كتلة في حلقة إزالة الضوضاء: تستقبل <code>BlockState</code> للحلقة مع فهرس الخطوة وخطوة الزمن، ويمكنها قراءة <code>latents</code> أو تحريرها.</p> <blockquote class="tip"><p>حرّر الكتل <em>قبل</em> <a href="/docs/diffusers/main/ar/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks.init_pipeline">init_pipeline()</a>: يعيد <code>pipe.blocks</code> نسخة، لذا فإن تغييره بعد وجود خط الأنابيب لا يُحدث أي أثر.</p></blockquote> <p>يستقبل الكود أدناه الدالة الاستدعائية (callback) كمدخل للخطّ (pipeline) ويستدعيها بنفس التوقيع المذكور أعلاه: الخطّ، فهرس الخطوة، خطوة الزمن (timestep)، وقاموس (dict) من المصفوفات (tensors)، حيث تُكتب القيم المُعادّة مرة أخرى. يكتشف <code>walk_denoise_loops</code> كل حلقة إزالة الضوضاء (denoising loop) في الكتل، بغض النظر عن سير العمل (workflow) الذي تنتمي إليه، لذا يعمل المقطع نفسه مع أي خطّ (pipeline) معياري.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> تم النسخ</div><!----></button><!----></div> <pre class="language-py "><!----><span class="hljs-keyword">from</span> typing <span class="hljs-keyword">import</span> <span class="hljs-type">Callable</span>
<span class="hljs-keyword">import</span> torch
<span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> ModularPipeline
<span class="hljs-keyword">from</span> diffusers.modular_pipelines <span class="hljs-keyword">import</span> InputParam, LoopSequentialPipelineBlocks, ModularPipelineBlocks
<span class="hljs-keyword">class</span> <span class="hljs-title class_">CallbackOnStepEnd</span>(<span class="hljs-title class_ inherited__">ModularPipelineBlocks</span>):
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">inputs</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> [
InputParam(
<span class="hljs-string">&quot;callback_on_step_end&quot;</span>,
type_hint=<span class="hljs-type">Callable</span>,
description=<span class="hljs-string">&quot;Called after each scheduler step as `callback(pipe, i, t, {&#x27;latents&#x27;: ...})`; the dict it returns is written back.&quot;</span>,
),
InputParam(<span class="hljs-string">&quot;latents&quot;</span>, required=<span class="hljs-literal">True</span>),
]
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__call__</span>(<span class="hljs-params">self, components, block_state, i, t</span>):
<span class="hljs-keyword">if</span> block_state.callback_on_step_end <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> <span class="hljs-literal">None</span>:
outputs = block_state.callback_on_step_end(components, i, t, {<span class="hljs-string">&quot;latents&quot;</span>: block_state.latents})
block_state.latents = outputs.get(<span class="hljs-string">&quot;latents&quot;</span>, block_state.latents)
<span class="hljs-keyword">return</span> components, block_state
<span class="hljs-keyword">def</span> <span class="hljs-title function_">walk_denoise_loops</span>(<span class="hljs-params">block</span>):
<span class="hljs-string">&quot;&quot;&quot;Every denoising loop in the blocks, whichever workflow it belongs to.&quot;&quot;&quot;</span>
<span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(block, LoopSequentialPipelineBlocks) <span class="hljs-keyword">and</span> <span class="hljs-string">&quot;denoiser&quot;</span> <span class="hljs-keyword">in</span> block.sub_blocks:
<span class="hljs-keyword">yield</span> block
<span class="hljs-keyword">for</span> sub <span class="hljs-keyword">in</span> <span class="hljs-built_in">getattr</span>(block, <span class="hljs-string">&quot;sub_blocks&quot;</span>, {}).values():
<span class="hljs-keyword">yield</span> <span class="hljs-keyword">from</span> walk_denoise_loops(sub)
repo_id = <span class="hljs-string">&quot;stabilityai/stable-diffusion-xl-base-1.0&quot;</span>
blocks = ModularPipeline.from_pretrained(repo_id).blocks
<span class="hljs-keyword">for</span> loop <span class="hljs-keyword">in</span> walk_denoise_loops(blocks):
loop.sub_blocks[<span class="hljs-string">&quot;callback&quot;</span>] = CallbackOnStepEnd() <span class="hljs-comment"># appended after the last step of the loop</span>
pipe = blocks.init_pipeline(repo_id)
pipe.load_components(dtype=torch.float16)
pipe.to(<span class="hljs-string">&quot;cuda&quot;</span>)<!----></pre></div><!----> <p>أصبح <code>callback_on_step_end</code> الآن مدخلاً للخط الأنابيب، ويعمل أي مستدعى كُتب لـ<code>DiffusionPipeline</code>، مثل <code>decode_tensors</code> أعلاه، كما هو:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg><!----> <div class=" absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0 "><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent;"></div> تم النسخ</div><!----></button><!----></div> <pre class="language-py "><!---->image = pipe(prompt=<span class="hljs-string">&quot;A croissant shaped like a cute bear.&quot;</span>, callback_on_step_end=decode_tensors, output=<span class="hljs-string">&quot;images&quot;</span>)[<span class="hljs-number">0</span>]<!----></pre></div><!----> <p>يعمل <a href="#early-stopping">التوقف المبكر</a> بشكل مختلف: لا يمكن للكتلة تخطي الحلقة التي تعمل فيها، لذا فإن تعيين <code>_interrupt</code> لا يُحدث أي تأثير. بدلاً من ذلك، ارمِ الاستثناء من الاستدعاء العكسي: ينتشر الاستثناء خارج <code>pipe(...)</code> (لا يتم فك ترميز أي صورة)، وتبقى خط الأنابيب قابلاً للاستخدام بعد ذلك.</p> <p>يعمل هذا مع كل خط أنابيب معياري باستثناء الحلقة الداخلية للحلقات المتداخلة (حيث تُزيل نماذج الفيديو التوليدية الذاتية مثل Helios وWan-Animate-2 الضوضاء عن كل جزء داخل كتلة من الحلقة الخارجية). هناك، أدخل الكتلة في الحلقة الخارجية بدلاً من ذلك: فهي تعمل مرة واحدة لكل جزء وتستقبل فهرس الجزء <code>k</code> بدلاً من <code>i</code> و<code>t</code>.</p> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/diffusers/blob/main/docs/source/en/using-diffusers/callback.md" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg><!----> <span><span class="underline">Update</span> on GitHub</span></a><!----> <p></p><!--]--><!----><!--]--><!--]--><!--]--> <!--[-1--><!--]--><!--]-->
<script>
{
__sveltekit_g37pnb = {
base: "/docs/diffusers/main/en",
assets: "/docs/diffusers/main/en"
};
const element = document.currentScript.parentElement;
Promise.all([
import("/docs/diffusers/main/en/_app/immutable/entry/start.D3LnKZ4R.js"),
import("/docs/diffusers/main/en/_app/immutable/entry/app.C0rBoMxR.js")
]).then(([kit, app]) => {
kit.start(app, element, {
node_ids: [0, 321],
data: [null,null],
form: null,
error: null
});
});
}
</script>

Xet Storage Details

Size:
37 kB
·
Xet hash:
37e3126e05c1b66e8a1d590a6ee7cd4d794659186bb8fdf97785e3c49f2ba82b

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.