Buckets:

rtrm's picture
download
raw
11.7 kB
<meta charset="utf-8" /><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;Using callback&quot;,&quot;local&quot;:&quot;using-callback&quot;,&quot;sections&quot;:[],&quot;depth&quot;:1}">
<link href="/docs/diffusers/v0.22.2/en/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/entry/start.73ea8a3d.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/scheduler.182ea377.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/singletons.60172a60.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/index.1f6d62f6.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/paths.49cddc6d.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/entry/app.60438fe3.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/index.abf12888.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/nodes/0.efabe74f.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/each.e59479a4.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/nodes/151.a42a4421.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/Tip.230e2334.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/CodeBlock.57fe6e13.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/DocNotebookDropdown.d9060979.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/globals.7f7f1b26.js">
<link rel="modulepreload" href="/docs/diffusers/v0.22.2/en/_app/immutable/chunks/Heading.16916d63.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{&quot;title&quot;:&quot;Using callback&quot;,&quot;local&quot;:&quot;using-callback&quot;,&quot;sections&quot;:[],&quot;depth&quot;:1}"><!-- HEAD_svelte-u9bgzb_END --> <p></p> <h1 class="relative group"><a id="using-callback" 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="#using-callback"><span><svg class="" 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>Using callback</span></h1> <div class="flex space-x-1 absolute z-10 right-0 top-0"> <div class="relative colab-dropdown "> <button class=" " type="button"> <img alt="Open In Colab" class="!m-0" src="https://colab.research.google.com/assets/colab-badge.svg"> </button> </div> <div class="relative colab-dropdown "> <button class=" " type="button"> <img alt="Open In Studio Lab" class="!m-0" src="https://studiolab.sagemaker.aws/studiolab.svg"> </button> </div></div> <p data-svelte-h="svelte-1h53jlr">Most 🤗 Diffusers pipeline now accept a <code>callback_on_step_end</code> argument that allows you to change the default behavior of denoising loop with custom defined functions. Here is an example of a callback function we can write to disable classifier free guidance after 40% of inference steps to save compute with minimum tradeoff in performance.</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 class="" 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> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">def</span> <span class="hljs-title function_">callback_dynamic_cfg</span>(<span class="hljs-params">pipe, step_index, timestep, callback_kwargs</span>):
<span class="hljs-comment"># adjust the batch_size of prompt_embeds according to guidance_scale</span>
<span class="hljs-keyword">if</span> step_index == <span class="hljs-built_in">int</span>(pipe.num_timestep * <span class="hljs-number">0.4</span>):
prompt_embeds = callback_kwargs[<span class="hljs-string">&quot;prompt_embeds&quot;</span>]
prompt_embeds =prompt_embeds.chunk(<span class="hljs-number">2</span>)[-<span class="hljs-number">1</span>]
<span class="hljs-comment"># update guidance_scale and prompt_embeds</span>
pipe._guidance_scale = <span class="hljs-number">0.0</span>
callback_kwargs[<span class="hljs-string">&quot;prompt_embeds&quot;</span>] = prompt_embeds
<span class="hljs-keyword">return</span> callback_kwargs<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-vi0tkb">Your callback function has below arguments:</p> <ul data-svelte-h="svelte-15zlbnp"><li><code>pipe</code> is the pipeline instance, which provides access to useful properties such as <code>num_timestep</code> and <code>guidance_scale</code>. You can modify these properties by updating the underlying attributes. In this example, we disable CFG by setting <code>pipe._guidance_scale</code> to be <code>0</code>.</li> <li><code>step_index</code> and <code>timestep</code> tell you where you are in the denoising loop. In our example, we use <code>step_index</code> to decide when to turn off CFG.</li> <li><code>callback_kwargs</code> is a dict that contains tensor variables you can modify during the denoising loop. It only includes variables specified in the <code>callback_on_step_end_tensor_inputs</code> argument passed to the pipeline’s <code>__call__</code> method. Different pipelines may use different sets of variables so please check the pipeline class’s <code>_callback_tensor_inputs</code> attribute for the list of variables that you can modify. Common variables include <code>latents</code> and <code>prompt_embeds</code>. In our example, we need to adjust the batch size of <code>prompt_embeds</code> after setting <code>guidance_scale</code> to be <code>0</code> in order for it to work properly.</li></ul> <p data-svelte-h="svelte-m11ka4">You can pass the callback function as <code>callback_on_step_end</code> argument to the pipeline along with <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 class="" 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> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->import torch
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline<span class="hljs-selector-class">.from_pretrained</span>(<span class="hljs-string">&quot;runwayml/stable-diffusion-v1-5&quot;</span>, torch_dtype=torch.float16)
pipe = pipe<span class="hljs-selector-class">.to</span>(<span class="hljs-string">&quot;cuda&quot;</span>)
prompt = <span class="hljs-string">&quot;a photo of an astronaut riding a horse on mars&quot;</span>
generator = torch<span class="hljs-selector-class">.Generator</span>(device=<span class="hljs-string">&quot;cuda&quot;</span>)<span class="hljs-selector-class">.manual_seed</span>(<span class="hljs-number">1</span>)
out= <span class="hljs-built_in">pipe</span>(prompt, generator=generator, callback_on_step_end = callback_custom_cfg, callback_on_step_end_tensor_inputs=<span class="hljs-selector-attr">[<span class="hljs-string">&#x27;prompt_embeds&#x27;</span>]</span>)
out<span class="hljs-selector-class">.images</span><span class="hljs-selector-attr">[0]</span><span class="hljs-selector-class">.save</span>(<span class="hljs-string">&quot;out_custom_cfg.png&quot;</span>)<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-z6o3gr">Your callback function will be executed at the end of each denoising step and modify pipeline attributes and tensor variables for the next denoising step. We successfully added the “dynamic CFG” feature to the stable diffusion pipeline without having to modify the code at all.</p> <div class="course-tip bg-gradient-to-br dark:bg-gradient-to-r before:border-green-500 dark:before:border-green-800 from-green-50 dark:from-gray-900 to-white dark:to-gray-950 border border-green-50 text-green-700 dark:text-gray-400"><p data-svelte-h="svelte-1w3qg3l">Currently we only support <code>callback_on_step_end</code>. If you have a solid use case and require a callback function with a different execution point, please open an <a href="https://github.com/huggingface/diffusers/issues/new/choose" rel="nofollow">feature request</a> so we can add it!</p></div> <p></p>
<script>
{
__sveltekit_ynvcvq = {
assets: "/docs/diffusers/v0.22.2/en",
base: "/docs/diffusers/v0.22.2/en",
env: {}
};
const element = document.currentScript.parentElement;
const data = [null,null];
Promise.all([
import("/docs/diffusers/v0.22.2/en/_app/immutable/entry/start.73ea8a3d.js"),
import("/docs/diffusers/v0.22.2/en/_app/immutable/entry/app.60438fe3.js")
]).then(([kit, app]) => {
kit.start(app, element, {
node_ids: [0, 151],
data,
form: null,
error: null
});
});
}
</script>

Xet Storage Details

Size:
11.7 kB
·
Xet hash:
1d61340e7f8703423d0e9e158fcf38d0f3bbe80c15656bcce368268c7f32d706

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