Buckets:

rtrm's picture
download
raw
47.7 kB
import{s as tl,o as ll,n as jt}from"../chunks/scheduler.94020406.js";import{S as nl,i as al,g as p,s as n,r as o,E as pl,h as i,f as t,c as a,j as V,u as M,x as m,k as nt,y as g,a as l,v as r,d as u,t as d,w as h}from"../chunks/index.a08c8d92.js";import{T as ft}from"../chunks/Tip.3b0aeee8.js";import{C as j}from"../chunks/CodeBlock.f1fae7de.js";import{D as il}from"../chunks/DocNotebookDropdown.a1753374.js";import{H as G,E as ml}from"../chunks/getInferenceSnippets.3bf24426.js";function cl(Z){let c,w='💡 VAE, UNet 및 텍스트 인코더 모델의 작동방식에 대한 자세한 내용은 <a href="https://huggingface.co/blog/stable_diffusion#how-does-stable-diffusion-work" rel="nofollow">How does Stable Diffusion work?</a> 블로그를 참조하세요.';return{c(){c=p("p"),c.innerHTML=w},l(f){c=i(f,"P",{"data-svelte-h":!0}),m(c)!=="svelte-ra0af6"&&(c.innerHTML=w)},m(f,U){l(f,c,U)},p:jt,d(f){f&&t(c)}}}function ol(Z){let c,w="💡 <code>guidance_scale</code> 매개변수는 이미지를 생성할 때 프롬프트에 얼마나 많은 가중치를 부여할지 결정합니다.";return{c(){c=p("p"),c.innerHTML=w},l(f){c=i(f,"P",{"data-svelte-h":!0}),m(c)!=="svelte-g2ye81"&&(c.innerHTML=w)},m(f,U){l(f,c,U)},p:jt,d(f){f&&t(c)}}}function Ml(Z){let c,w="💡 <code>vae</code> 모델에는 3개의 다운 샘플링 레이어가 있기 때문에 높이와 너비가 8로 나뉩니다. 다음을 실행하여 확인할 수 있습니다:",f,U,T;return U=new j({props:{code:"MiUyMCoqJTIwKGxlbih2YWUuY29uZmlnLmJsb2NrX291dF9jaGFubmVscyklMjAtJTIwMSklMjAlM0QlM0QlMjA4",highlighted:'<span class="hljs-number">2</span> ** (<span class="hljs-built_in">len</span>(vae.config.block_out_channels) - <span class="hljs-number">1</span>) == <span class="hljs-number">8</span>',wrap:!1}}),{c(){c=p("p"),c.innerHTML=w,f=n(),o(U.$$.fragment)},l(b){c=i(b,"P",{"data-svelte-h":!0}),m(c)!=="svelte-132csr5"&&(c.innerHTML=w),f=a(b),M(U.$$.fragment,b)},m(b,C){l(b,c,C),l(b,f,C),r(U,b,C),T=!0},p:jt,i(b){T||(u(U.$$.fragment,b),T=!0)},o(b){d(U.$$.fragment,b),T=!1},d(b){b&&(t(c),t(f)),h(U,b)}}}function rl(Z){let c,w,f,U,T,b,C,Ks,Q,bt="🧨 Diffusers는 사용자 친화적이며 유연한 도구 상자로, 사용사례에 맞게 diffusion 시스템을 구축 할 수 있도록 설계되었습니다. 이 도구 상자의 핵심은 모델과 스케줄러입니다. <code>DiffusionPipeline</code>은 편의를 위해 이러한 구성 요소를 번들로 제공하지만, 파이프라인을 분리하고 모델과 스케줄러를 개별적으로 사용해 새로운 diffusion 시스템을 만들 수도 있습니다.",Os,W,Ut="이 튜토리얼에서는 기본 파이프라인부터 시작해 Stable Diffusion 파이프라인까지 진행하며 모델과 스케줄러를 사용해 추론을 위한 diffusion 시스템을 조립하는 방법을 배웁니다.",se,x,ee,N,Jt="파이프라인은 추론을 위해 모델을 실행하는 빠르고 쉬운 방법으로, 이미지를 생성하는 데 코드가 4줄 이상 필요하지 않습니다:",te,E,le,_,yt='<img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ddpm-cat.png" alt="Image of cat created from DDPMPipeline"/>',ne,X,wt="정말 쉽습니다. 그런데 파이프라인은 어떻게 이렇게 할 수 있었을까요? 파이프라인을 세분화하여 내부에서 어떤 일이 일어나고 있는지 살펴보겠습니다.",ae,B,Tt="위 예시에서 파이프라인에는 <code>UNet2DModel</code> 모델과 <code>DDPMScheduler</code>가 포함되어 있습니다. 파이프라인은 원하는 출력 크기의 랜덤 노이즈를 받아 모델을 여러번 통과시켜 이미지의 노이즈를 제거합니다. 각 timestep에서 모델은 <em>noise residual</em>을 예측하고 스케줄러는 이를 사용하여 노이즈가 적은 이미지를 예측합니다. 파이프라인은 지정된 추론 스텝수에 도달할 때까지 이 과정을 반복합니다.",pe,F,Ct="모델과 스케줄러를 별도로 사용하여 파이프라인을 다시 생성하기 위해 자체적인 노이즈 제거 프로세스를 작성해 보겠습니다.",ie,J,S,Ss,$t="모델과 스케줄러를 불러옵니다:",at,H,pt,D,Hs,Vt="노이즈 제거 프로세스를 실행할 timestep 수를 설정합니다:",it,L,mt,z,Ds,Zt="스케줄러의 timestep을 설정하면 균등한 간격의 구성 요소를 가진 텐서가 생성됩니다.(이 예시에서는 50개) 각 요소는 모델이 이미지의 노이즈를 제거하는 시간 간격에 해당합니다. 나중에 노이즈 제거 루프를 만들 때 이 텐서를 반복하여 이미지의 노이즈를 제거합니다:",ct,Y,ot,A,Ls,_t="원하는 출력과 같은 모양을 가진 랜덤 노이즈를 생성합니다:",Mt,P,rt,$,zs,vt="이제 timestep을 반복하는 루프를 작성합니다. 각 timestep에서 모델은 <code>UNet2DModel.forward()</code>를 통해 noisy residual을 반환합니다. 스케줄러의 <code>step()</code> 메서드는 noisy residual, timestep, 그리고 입력을 받아 이전 timestep에서 이미지를 예측합니다. 이 출력은 노이즈 제거 루프의 모델에 대한 다음 입력이 되며, <code>timesteps</code> 배열의 끝에 도달할 때까지 반복됩니다.",ut,q,dt,Ys,It="이것이 전체 노이즈 제거 프로세스이며, 동일한 패턴을 사용해 모든 diffusion 시스템을 작성할 수 있습니다.",ht,K,As,kt="마지막 단계는 노이즈가 제거된 출력을 이미지로 변환하는 것입니다:",gt,O,me,ss,Rt="다음 섹션에서는 여러분의 기술을 시험해보고 좀 더 복잡한 Stable Diffusion 파이프라인을 분석해 보겠습니다. 방법은 거의 동일합니다. 필요한 구성요소들을 초기화하고 timestep수를 설정하여 <code>timestep</code> 배열을 생성합니다. 노이즈 제거 루프에서 <code>timestep</code> 배열이 사용되며, 이 배열의 각 요소에 대해 모델은 노이즈가 적은 이미지를 예측합니다. 노이즈 제거 루프는 <code>timestep</code>을 반복하고 각 timestep에서 noise residual을 출력하고 스케줄러는 이를 사용하여 이전 timestep에서 노이즈가 덜한 이미지를 예측합니다. 이 프로세스는 <code>timestep</code> 배열의 끝에 도달할 때까지 반복됩니다.",ce,es,Gt="한번 사용해 봅시다!",oe,ts,Me,ls,Qt="Stable Diffusion 은 text-to-image <em>latent diffusion</em> 모델입니다. latent diffusion 모델이라고 불리는 이유는 실제 픽셀 공간 대신 이미지의 저차원의 표현으로 작업하기 때문이고, 메모리 효율이 더 높습니다. 인코더는 이미지를 더 작은 표현으로 압축하고, 디코더는 압축된 표현을 다시 이미지로 변환합니다. text-to-image 모델의 경우 텍스트 임베딩을 생성하기 위해 tokenizer와 인코더가 필요합니다. 이전 예제에서 이미 UNet 모델과 스케줄러가 필요하다는 것은 알고 계셨을 것입니다.",re,ns,Wt="보시다시피, 이것은 UNet 모델만 포함된 DDPM 파이프라인보다 더 복잡합니다. Stable Diffusion 모델에는 세 개의 개별 사전학습된 모델이 있습니다.",ue,v,de,as,xt='이제 Stable Diffusion 파이프라인에 필요한 구성요소들이 무엇인지 알았으니, <code>from_pretrained()</code> 메서드를 사용해 모든 구성요소를 불러옵니다. 사전학습된 체크포인트 <a href="https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5" rel="nofollow"><code>stable-diffusion-v1-5/stable-diffusion-v1-5</code></a>에서 찾을 수 있으며, 각 구성요소들은 별도의 하위 폴더에 저장되어 있습니다:',he,ps,ge,is,Nt="기본 <code>PNDMScheduler</code> 대신, <code>UniPCMultistepScheduler</code>로 교체하여 다른 스케줄러를 얼마나 쉽게 연결할 수 있는지 확인합니다:",fe,ms,je,cs,Et="추론 속도를 높이려면 스케줄러와 달리 학습 가능한 가중치가 있으므로 모델을 GPU로 옮기세요:",be,os,Ue,Ms,Je,rs,Xt="다음 단계는 임베딩을 생성하기 위해 텍스트를 토큰화하는 것입니다. 이 텍스트는 UNet 모델에서 condition으로 사용되고 입력 프롬프트와 유사한 방향으로 diffusion 프로세스를 조정하는 데 사용됩니다.",ye,I,we,us,Bt="다른 프롬프트를 생성하고 싶다면 원하는 프롬프트를 자유롭게 선택하세요!",Te,ds,Ce,hs,Ft="텍스트를 토큰화하고 프롬프트에서 임베딩을 생성합니다:",$e,gs,Ve,fs,St="또한 패딩 토큰의 임베딩인 <em>unconditional 텍스트 임베딩</em>을 생성해야 합니다. 이 임베딩은 조건부 <code>text_embeddings</code>과 동일한 shape(<code>batch_size</code> 그리고 <code>seq_length</code>)을 가져야 합니다:",Ze,js,_e,bs,Ht="두번의 forward pass를 피하기 위해 conditional 임베딩과 unconditional 임베딩을 배치(batch)로 연결하겠습니다:",ve,Us,Ie,Js,ke,ys,Dt="그다음 diffusion 프로세스의 시작점으로 초기 랜덤 노이즈를 생성합니다. 이것이 이미지의 잠재적 표현이며 점차적으로 노이즈가 제거됩니다. 이 시점에서 <code>latent</code> 이미지는 최종 이미지 크기보다 작지만 나중에 모델이 이를 512x512 이미지 크기로 변환하므로 괜찮습니다.",Re,k,Ge,ws,Qe,Ts,We,Cs,Lt="먼저 <code>UniPCMultistepScheduler</code>와 같은 향상된 스케줄러에 필요한 노이즈 스케일 값인 초기 노이즈 분포 <em>sigma</em> 로 입력을 스케일링 하는 것부터 시작합니다:",xe,$s,Ne,Vs,zt="마지막 단계는 <code>latent</code>의 순수한 노이즈를 점진적으로 프롬프트에 설명된 이미지로 변환하는 노이즈 제거 루프를 생성하는 것입니다. 노이즈 제거 루프는 세 가지 작업을 수행해야 한다는 점을 기억하세요:",Ee,Zs,Yt="<li>노이즈 제거 중에 사용할 스케줄러의 timesteps를 설정합니다.</li> <li>timestep을 따라 반복합니다.</li> <li>각 timestep에서 UNet 모델을 호출하여 noise residual을 예측하고 스케줄러에 전달하여 이전 노이즈 샘플을 계산합니다.</li>",Xe,_s,Be,vs,Fe,Is,At="마지막 단계는 <code>vae</code>를 이용하여 잠재 표현을 이미지로 디코딩하고 <code>sample</code>과 함께 디코딩된 출력을 얻는 것입니다:",Se,ks,He,Rs,Pt="마지막으로 이미지를 <code>PIL.Image</code>로 변환하면 생성된 이미지를 확인할 수 있습니다!",De,Gs,Le,R,qt='<img src="https://huggingface.co/blog/assets/98_stable_diffusion/stable_diffusion_k_lms.png"/>',ze,Qs,Ye,Ws,Kt="기본 파이프라인부터 복잡한 파이프라인까지, 자신만의 diffusion 시스템을 작성하는 데 필요한 것은 노이즈 제거 루프뿐이라는 것을 알 수 있었습니다. 이 루프는 스케줄러의 timesteps를 설정하고, 이를 반복하며, UNet 모델을 호출하여 noise residual을 예측하고 스케줄러에 전달하여 이전 노이즈 샘플을 계산하는 과정을 번갈아 가며 수행해야 합니다.",Ae,xs,Ot="이것이 바로 🧨 Diffusers가 설계된 목적입니다: 모델과 스케줄러를 사용해 자신만의 diffusion 시스템을 직관적이고 쉽게 작성할 수 있도록 하기 위해서입니다.",Pe,Ns,sl="다음 단계를 자유롭게 진행하세요:",qe,Es,el='<li>🧨 Diffusers에 <a href="using-diffusers/#contribute_pipeline">파이프라인 구축 및 기여</a>하는 방법을 알아보세요. 여러분이 어떤 아이디어를 내놓을지 기대됩니다!</li> <li>라이브러리에서 <a href="./api/pipelines/overview">기본 파이프라인</a>을 살펴보고, 모델과 스케줄러를 별도로 사용하여 파이프라인을 처음부터 해체하고 빌드할 수 있는지 확인해 보세요.</li>',Ke,Xs,Oe,qs,st;return T=new G({props:{title:"파이프라인, 모델 및 스케줄러 이해하기",local:"파이프라인-모델-및-스케줄러-이해하기",headingTag:"h1"}}),C=new il({props:{classNames:"absolute z-10 right-0 top-0",options:[{label:"Mixed",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers_doc/ko/write_own_pipeline.ipynb"},{label:"PyTorch",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers_doc/ko/pytorch/write_own_pipeline.ipynb"},{label:"TensorFlow",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers_doc/ko/tensorflow/write_own_pipeline.ipynb"},{label:"Mixed",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/diffusers_doc/ko/write_own_pipeline.ipynb"},{label:"PyTorch",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/diffusers_doc/ko/pytorch/write_own_pipeline.ipynb"},{label:"TensorFlow",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/diffusers_doc/ko/tensorflow/write_own_pipeline.ipynb"}]}}),x=new G({props:{title:"기본 파이프라인 해체하기",local:"기본-파이프라인-해체하기",headingTag:"h2"}}),E=new j({props:{code:"ZnJvbSUyMGRpZmZ1c2VycyUyMGltcG9ydCUyMEREUE1QaXBlbGluZSUwQSUwQWRkcG0lMjAlM0QlMjBERFBNUGlwZWxpbmUuZnJvbV9wcmV0cmFpbmVkKCUyMmdvb2dsZSUyRmRkcG0tY2F0LTI1NiUyMikudG8oJTIyY3VkYSUyMiklMEFpbWFnZSUyMCUzRCUyMGRkcG0obnVtX2luZmVyZW5jZV9zdGVwcyUzRDI1KS5pbWFnZXMlNUIwJTVEJTBBaW1hZ2U=",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> DDPMPipeline
<span class="hljs-meta">&gt;&gt;&gt; </span>ddpm = DDPMPipeline.from_pretrained(<span class="hljs-string">&quot;google/ddpm-cat-256&quot;</span>).to(<span class="hljs-string">&quot;cuda&quot;</span>)
<span class="hljs-meta">&gt;&gt;&gt; </span>image = ddpm(num_inference_steps=<span class="hljs-number">25</span>).images[<span class="hljs-number">0</span>]
<span class="hljs-meta">&gt;&gt;&gt; </span>image`,wrap:!1}}),H=new j({props:{code:"ZnJvbSUyMGRpZmZ1c2VycyUyMGltcG9ydCUyMEREUE1TY2hlZHVsZXIlMkMlMjBVTmV0MkRNb2RlbCUwQSUwQXNjaGVkdWxlciUyMCUzRCUyMEREUE1TY2hlZHVsZXIuZnJvbV9wcmV0cmFpbmVkKCUyMmdvb2dsZSUyRmRkcG0tY2F0LTI1NiUyMiklMEFtb2RlbCUyMCUzRCUyMFVOZXQyRE1vZGVsLmZyb21fcHJldHJhaW5lZCglMjJnb29nbGUlMkZkZHBtLWNhdC0yNTYlMjIpLnRvKCUyMmN1ZGElMjIp",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> DDPMScheduler, UNet2DModel
<span class="hljs-meta">&gt;&gt;&gt; </span>scheduler = DDPMScheduler.from_pretrained(<span class="hljs-string">&quot;google/ddpm-cat-256&quot;</span>)
<span class="hljs-meta">&gt;&gt;&gt; </span>model = UNet2DModel.from_pretrained(<span class="hljs-string">&quot;google/ddpm-cat-256&quot;</span>).to(<span class="hljs-string">&quot;cuda&quot;</span>)`,wrap:!1}}),L=new j({props:{code:"c2NoZWR1bGVyLnNldF90aW1lc3RlcHMoNTAp",highlighted:'<span class="hljs-meta">&gt;&gt;&gt; </span>scheduler.set_timesteps(<span class="hljs-number">50</span>)',wrap:!1}}),Y=new j({props:{code:"c2NoZWR1bGVyLnRpbWVzdGVwcw==",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span>scheduler.timesteps
tensor([<span class="hljs-number">980</span>, <span class="hljs-number">960</span>, <span class="hljs-number">940</span>, <span class="hljs-number">920</span>, <span class="hljs-number">900</span>, <span class="hljs-number">880</span>, <span class="hljs-number">860</span>, <span class="hljs-number">840</span>, <span class="hljs-number">820</span>, <span class="hljs-number">800</span>, <span class="hljs-number">780</span>, <span class="hljs-number">760</span>, <span class="hljs-number">740</span>, <span class="hljs-number">720</span>,
<span class="hljs-number">700</span>, <span class="hljs-number">680</span>, <span class="hljs-number">660</span>, <span class="hljs-number">640</span>, <span class="hljs-number">620</span>, <span class="hljs-number">600</span>, <span class="hljs-number">580</span>, <span class="hljs-number">560</span>, <span class="hljs-number">540</span>, <span class="hljs-number">520</span>, <span class="hljs-number">500</span>, <span class="hljs-number">480</span>, <span class="hljs-number">460</span>, <span class="hljs-number">440</span>,
<span class="hljs-number">420</span>, <span class="hljs-number">400</span>, <span class="hljs-number">380</span>, <span class="hljs-number">360</span>, <span class="hljs-number">340</span>, <span class="hljs-number">320</span>, <span class="hljs-number">300</span>, <span class="hljs-number">280</span>, <span class="hljs-number">260</span>, <span class="hljs-number">240</span>, <span class="hljs-number">220</span>, <span class="hljs-number">200</span>, <span class="hljs-number">180</span>, <span class="hljs-number">160</span>,
<span class="hljs-number">140</span>, <span class="hljs-number">120</span>, <span class="hljs-number">100</span>, <span class="hljs-number">80</span>, <span class="hljs-number">60</span>, <span class="hljs-number">40</span>, <span class="hljs-number">20</span>, <span class="hljs-number">0</span>])`,wrap:!1}}),P=new j({props:{code:"aW1wb3J0JTIwdG9yY2glMEElMEFzYW1wbGVfc2l6ZSUyMCUzRCUyMG1vZGVsLmNvbmZpZy5zYW1wbGVfc2l6ZSUwQW5vaXNlJTIwJTNEJTIwdG9yY2gucmFuZG4oKDElMkMlMjAzJTJDJTIwc2FtcGxlX3NpemUlMkMlMjBzYW1wbGVfc2l6ZSklMkMlMjBkZXZpY2UlM0QlMjJjdWRhJTIyKQ==",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">import</span> torch
<span class="hljs-meta">&gt;&gt;&gt; </span>sample_size = model.config.sample_size
<span class="hljs-meta">&gt;&gt;&gt; </span>noise = torch.randn((<span class="hljs-number">1</span>, <span class="hljs-number">3</span>, sample_size, sample_size), device=<span class="hljs-string">&quot;cuda&quot;</span>)`,wrap:!1}}),q=new j({props:{code:"aW5wdXQlMjAlM0QlMjBub2lzZSUwQSUwQWZvciUyMHQlMjBpbiUyMHNjaGVkdWxlci50aW1lc3RlcHMlM0ElMEElMjAlMjAlMjAlMjB3aXRoJTIwdG9yY2gubm9fZ3JhZCgpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbm9pc3lfcmVzaWR1YWwlMjAlM0QlMjBtb2RlbChpbnB1dCUyQyUyMHQpLnNhbXBsZSUwQSUyMCUyMCUyMCUyMHByZXZpb3VzX25vaXN5X3NhbXBsZSUyMCUzRCUyMHNjaGVkdWxlci5zdGVwKG5vaXN5X3Jlc2lkdWFsJTJDJTIwdCUyQyUyMGlucHV0KS5wcmV2X3NhbXBsZSUwQSUyMCUyMCUyMCUyMGlucHV0JTIwJTNEJTIwcHJldmlvdXNfbm9pc3lfc2FtcGxl",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-built_in">input</span> = noise
<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">for</span> t <span class="hljs-keyword">in</span> scheduler.timesteps:
<span class="hljs-meta">... </span> <span class="hljs-keyword">with</span> torch.no_grad():
<span class="hljs-meta">... </span> noisy_residual = model(<span class="hljs-built_in">input</span>, t).sample
<span class="hljs-meta">... </span> previous_noisy_sample = scheduler.step(noisy_residual, t, <span class="hljs-built_in">input</span>).prev_sample
<span class="hljs-meta">... </span> <span class="hljs-built_in">input</span> = previous_noisy_sample`,wrap:!1}}),O=new j({props:{code:"ZnJvbSUyMFBJTCUyMGltcG9ydCUyMEltYWdlJTBBaW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBaW1hZ2UlMjAlM0QlMjAoaW5wdXQlMjAlMkYlMjAyJTIwJTJCJTIwMC41KS5jbGFtcCgwJTJDJTIwMSklMEFpbWFnZSUyMCUzRCUyMGltYWdlLmNwdSgpLnBlcm11dGUoMCUyQyUyMDIlMkMlMjAzJTJDJTIwMSkubnVtcHkoKSU1QjAlNUQlMEFpbWFnZSUyMCUzRCUyMEltYWdlLmZyb21hcnJheSgoaW1hZ2UlMjAqJTIwMjU1KS5yb3VuZCgpLmFzdHlwZSglMjJ1aW50OCUyMikpJTBBaW1hZ2U=",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image
<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-meta">&gt;&gt;&gt; </span>image = (<span class="hljs-built_in">input</span> / <span class="hljs-number">2</span> + <span class="hljs-number">0.5</span>).clamp(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>)
<span class="hljs-meta">&gt;&gt;&gt; </span>image = image.cpu().permute(<span class="hljs-number">0</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1</span>).numpy()[<span class="hljs-number">0</span>]
<span class="hljs-meta">&gt;&gt;&gt; </span>image = Image.fromarray((image * <span class="hljs-number">255</span>).<span class="hljs-built_in">round</span>().astype(<span class="hljs-string">&quot;uint8&quot;</span>))
<span class="hljs-meta">&gt;&gt;&gt; </span>image`,wrap:!1}}),ts=new G({props:{title:"Stable Diffusion 파이프라인 해체하기",local:"stable-diffusion-파이프라인-해체하기",headingTag:"h2"}}),v=new ft({props:{$$slots:{default:[cl]},$$scope:{ctx:Z}}}),ps=new j({props:{code:"ZnJvbSUyMFBJTCUyMGltcG9ydCUyMEltYWdlJTBBaW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwdHJhbnNmb3JtZXJzJTIwaW1wb3J0JTIwQ0xJUFRleHRNb2RlbCUyQyUyMENMSVBUb2tlbml6ZXIlMEFmcm9tJTIwZGlmZnVzZXJzJTIwaW1wb3J0JTIwQXV0b2VuY29kZXJLTCUyQyUyMFVOZXQyRENvbmRpdGlvbk1vZGVsJTJDJTIwUE5ETVNjaGVkdWxlciUwQSUwQXZhZSUyMCUzRCUyMEF1dG9lbmNvZGVyS0wuZnJvbV9wcmV0cmFpbmVkKCUyMkNvbXBWaXMlMkZzdGFibGUtZGlmZnVzaW9uLXYxLTQlMjIlMkMlMjBzdWJmb2xkZXIlM0QlMjJ2YWUlMjIpJTBBdG9rZW5pemVyJTIwJTNEJTIwQ0xJUFRva2VuaXplci5mcm9tX3ByZXRyYWluZWQoJTIyQ29tcFZpcyUyRnN0YWJsZS1kaWZmdXNpb24tdjEtNCUyMiUyQyUyMHN1YmZvbGRlciUzRCUyMnRva2VuaXplciUyMiklMEF0ZXh0X2VuY29kZXIlMjAlM0QlMjBDTElQVGV4dE1vZGVsLmZyb21fcHJldHJhaW5lZCglMjJDb21wVmlzJTJGc3RhYmxlLWRpZmZ1c2lvbi12MS00JTIyJTJDJTIwc3ViZm9sZGVyJTNEJTIydGV4dF9lbmNvZGVyJTIyKSUwQXVuZXQlMjAlM0QlMjBVTmV0MkRDb25kaXRpb25Nb2RlbC5mcm9tX3ByZXRyYWluZWQoJTIyQ29tcFZpcyUyRnN0YWJsZS1kaWZmdXNpb24tdjEtNCUyMiUyQyUyMHN1YmZvbGRlciUzRCUyMnVuZXQlMjIp",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image
<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">import</span> torch
<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> CLIPTextModel, CLIPTokenizer
<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> AutoencoderKL, UNet2DConditionModel, PNDMScheduler
<span class="hljs-meta">&gt;&gt;&gt; </span>vae = AutoencoderKL.from_pretrained(<span class="hljs-string">&quot;CompVis/stable-diffusion-v1-4&quot;</span>, subfolder=<span class="hljs-string">&quot;vae&quot;</span>)
<span class="hljs-meta">&gt;&gt;&gt; </span>tokenizer = CLIPTokenizer.from_pretrained(<span class="hljs-string">&quot;CompVis/stable-diffusion-v1-4&quot;</span>, subfolder=<span class="hljs-string">&quot;tokenizer&quot;</span>)
<span class="hljs-meta">&gt;&gt;&gt; </span>text_encoder = CLIPTextModel.from_pretrained(<span class="hljs-string">&quot;CompVis/stable-diffusion-v1-4&quot;</span>, subfolder=<span class="hljs-string">&quot;text_encoder&quot;</span>)
<span class="hljs-meta">&gt;&gt;&gt; </span>unet = UNet2DConditionModel.from_pretrained(<span class="hljs-string">&quot;CompVis/stable-diffusion-v1-4&quot;</span>, subfolder=<span class="hljs-string">&quot;unet&quot;</span>)`,wrap:!1}}),ms=new j({props:{code:"ZnJvbSUyMGRpZmZ1c2VycyUyMGltcG9ydCUyMFVuaVBDTXVsdGlzdGVwU2NoZWR1bGVyJTBBJTBBc2NoZWR1bGVyJTIwJTNEJTIwVW5pUENNdWx0aXN0ZXBTY2hlZHVsZXIuZnJvbV9wcmV0cmFpbmVkKCUyMkNvbXBWaXMlMkZzdGFibGUtZGlmZnVzaW9uLXYxLTQlMjIlMkMlMjBzdWJmb2xkZXIlM0QlMjJzY2hlZHVsZXIlMjIp",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> UniPCMultistepScheduler
<span class="hljs-meta">&gt;&gt;&gt; </span>scheduler = UniPCMultistepScheduler.from_pretrained(<span class="hljs-string">&quot;CompVis/stable-diffusion-v1-4&quot;</span>, subfolder=<span class="hljs-string">&quot;scheduler&quot;</span>)`,wrap:!1}}),os=new j({props:{code:"dG9yY2hfZGV2aWNlJTIwJTNEJTIwJTIyY3VkYSUyMiUwQXZhZS50byh0b3JjaF9kZXZpY2UpJTBBdGV4dF9lbmNvZGVyLnRvKHRvcmNoX2RldmljZSklMEF1bmV0LnRvKHRvcmNoX2RldmljZSk=",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span>torch_device = <span class="hljs-string">&quot;cuda&quot;</span>
<span class="hljs-meta">&gt;&gt;&gt; </span>vae.to(torch_device)
<span class="hljs-meta">&gt;&gt;&gt; </span>text_encoder.to(torch_device)
<span class="hljs-meta">&gt;&gt;&gt; </span>unet.to(torch_device)`,wrap:!1}}),Ms=new G({props:{title:"텍스트 임베딩 생성하기",local:"텍스트-임베딩-생성하기",headingTag:"h3"}}),I=new ft({props:{$$slots:{default:[ol]},$$scope:{ctx:Z}}}),ds=new j({props:{code:"cHJvbXB0JTIwJTNEJTIwJTVCJTIyYSUyMHBob3RvZ3JhcGglMjBvZiUyMGFuJTIwYXN0cm9uYXV0JTIwcmlkaW5nJTIwYSUyMGhvcnNlJTIyJTVEJTBBaGVpZ2h0JTIwJTNEJTIwNTEyJTIwJTIwJTIzJTIwU3RhYmxlJTIwRGlmZnVzaW9uJUVDJTlEJTk4JTIwJUVBJUI4JUIwJUVCJUIzJUI4JTIwJUVCJTg2JTkyJUVDJTlEJUI0JTBBd2lkdGglMjAlM0QlMjA1MTIlMjAlMjAlMjMlMjBTdGFibGUlMjBEaWZmdXNpb24lRUMlOUQlOTglMjAlRUElQjglQjAlRUIlQjMlQjglMjAlRUIlODQlODglRUIlQjklODQlMEFudW1faW5mZXJlbmNlX3N0ZXBzJTIwJTNEJTIwMjUlMjAlMjAlMjMlMjAlRUIlODUlQjglRUMlOUQlQjQlRUMlQTYlODglMjAlRUMlQTAlOUMlRUElQjElQjAlMjAlRUMlOEElQTQlRUQlODUlOUQlMjAlRUMlODglOTglMEFndWlkYW5jZV9zY2FsZSUyMCUzRCUyMDcuNSUyMCUyMCUyMyUyMGNsYXNzaWZpZXItZnJlZSUyMGd1aWRhbmNlJUVCJUE1JUJDJTIwJUVDJTlDJTg0JUVEJTk1JTlDJTIwc2NhbGUlMEFnZW5lcmF0b3IlMjAlM0QlMjB0b3JjaC5tYW51YWxfc2VlZCgwKSUyMCUyMCUyMyUyMCVFQyVCNCU4OCVFQSVCOCVCMCUyMCVFQyU5RSVBMCVFQyU5RSVBQyUyMCVFQiU4NSVCOCVFQyU5RCVCNCVFQyVBNiU4OCVFQiVBNSVCQyUyMCVFQyU4MyU5RCVFQyU4NCVCMSVFRCU5NSU5OCVFQiU4QSU5NCUyMHNlZWQlMjBnZW5lcmF0b3IlMEFiYXRjaF9zaXplJTIwJTNEJTIwbGVuKHByb21wdCk=",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span>prompt = [<span class="hljs-string">&quot;a photograph of an astronaut riding a horse&quot;</span>]
<span class="hljs-meta">&gt;&gt;&gt; </span>height = <span class="hljs-number">512</span> <span class="hljs-comment"># Stable Diffusion의 기본 높이</span>
<span class="hljs-meta">&gt;&gt;&gt; </span>width = <span class="hljs-number">512</span> <span class="hljs-comment"># Stable Diffusion의 기본 너비</span>
<span class="hljs-meta">&gt;&gt;&gt; </span>num_inference_steps = <span class="hljs-number">25</span> <span class="hljs-comment"># 노이즈 제거 스텝 수</span>
<span class="hljs-meta">&gt;&gt;&gt; </span>guidance_scale = <span class="hljs-number">7.5</span> <span class="hljs-comment"># classifier-free guidance를 위한 scale</span>
<span class="hljs-meta">&gt;&gt;&gt; </span>generator = torch.manual_seed(<span class="hljs-number">0</span>) <span class="hljs-comment"># 초기 잠재 노이즈를 생성하는 seed generator</span>
<span class="hljs-meta">&gt;&gt;&gt; </span>batch_size = <span class="hljs-built_in">len</span>(prompt)`,wrap:!1}}),gs=new j({props:{code:"dGV4dF9pbnB1dCUyMCUzRCUyMHRva2VuaXplciglMEElMjAlMjAlMjAlMjBwcm9tcHQlMkMlMjBwYWRkaW5nJTNEJTIybWF4X2xlbmd0aCUyMiUyQyUyMG1heF9sZW5ndGglM0R0b2tlbml6ZXIubW9kZWxfbWF4X2xlbmd0aCUyQyUyMHRydW5jYXRpb24lM0RUcnVlJTJDJTIwcmV0dXJuX3RlbnNvcnMlM0QlMjJwdCUyMiUwQSklMEElMEF3aXRoJTIwdG9yY2gubm9fZ3JhZCgpJTNBJTBBJTIwJTIwJTIwJTIwdGV4dF9lbWJlZGRpbmdzJTIwJTNEJTIwdGV4dF9lbmNvZGVyKHRleHRfaW5wdXQuaW5wdXRfaWRzLnRvKHRvcmNoX2RldmljZSkpJTVCMCU1RA==",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span>text_input = tokenizer(
<span class="hljs-meta">... </span> prompt, padding=<span class="hljs-string">&quot;max_length&quot;</span>, max_length=tokenizer.model_max_length, truncation=<span class="hljs-literal">True</span>, return_tensors=<span class="hljs-string">&quot;pt&quot;</span>
<span class="hljs-meta">... </span>)
<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">with</span> torch.no_grad():
<span class="hljs-meta">... </span> text_embeddings = text_encoder(text_input.input_ids.to(torch_device))[<span class="hljs-number">0</span>]`,wrap:!1}}),js=new j({props:{code:"bWF4X2xlbmd0aCUyMCUzRCUyMHRleHRfaW5wdXQuaW5wdXRfaWRzLnNoYXBlJTVCLTElNUQlMEF1bmNvbmRfaW5wdXQlMjAlM0QlMjB0b2tlbml6ZXIoJTVCJTIyJTIyJTVEJTIwKiUyMGJhdGNoX3NpemUlMkMlMjBwYWRkaW5nJTNEJTIybWF4X2xlbmd0aCUyMiUyQyUyMG1heF9sZW5ndGglM0RtYXhfbGVuZ3RoJTJDJTIwcmV0dXJuX3RlbnNvcnMlM0QlMjJwdCUyMiklMEF1bmNvbmRfZW1iZWRkaW5ncyUyMCUzRCUyMHRleHRfZW5jb2Rlcih1bmNvbmRfaW5wdXQuaW5wdXRfaWRzLnRvKHRvcmNoX2RldmljZSkpJTVCMCU1RA==",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span>max_length = text_input.input_ids.shape[-<span class="hljs-number">1</span>]
<span class="hljs-meta">&gt;&gt;&gt; </span>uncond_input = tokenizer([<span class="hljs-string">&quot;&quot;</span>] * batch_size, padding=<span class="hljs-string">&quot;max_length&quot;</span>, max_length=max_length, return_tensors=<span class="hljs-string">&quot;pt&quot;</span>)
<span class="hljs-meta">&gt;&gt;&gt; </span>uncond_embeddings = text_encoder(uncond_input.input_ids.to(torch_device))[<span class="hljs-number">0</span>]`,wrap:!1}}),Us=new j({props:{code:"dGV4dF9lbWJlZGRpbmdzJTIwJTNEJTIwdG9yY2guY2F0KCU1QnVuY29uZF9lbWJlZGRpbmdzJTJDJTIwdGV4dF9lbWJlZGRpbmdzJTVEKQ==",highlighted:'<span class="hljs-meta">&gt;&gt;&gt; </span>text_embeddings = torch.cat([uncond_embeddings, text_embeddings])',wrap:!1}}),Js=new G({props:{title:"랜덤 노이즈 생성",local:"랜덤-노이즈-생성",headingTag:"h3"}}),k=new ft({props:{$$slots:{default:[Ml]},$$scope:{ctx:Z}}}),ws=new j({props:{code:"bGF0ZW50cyUyMCUzRCUyMHRvcmNoLnJhbmRuKCUwQSUyMCUyMCUyMCUyMChiYXRjaF9zaXplJTJDJTIwdW5ldC5jb25maWcuaW5fY2hhbm5lbHMlMkMlMjBoZWlnaHQlMjAlMkYlMkYlMjA4JTJDJTIwd2lkdGglMjAlMkYlMkYlMjA4KSUyQyUwQSUyMCUyMCUyMCUyMGdlbmVyYXRvciUzRGdlbmVyYXRvciUyQyUwQSUyMCUyMCUyMCUyMGRldmljZSUzRHRvcmNoX2RldmljZSUyQyUwQSk=",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span>latents = torch.randn(
<span class="hljs-meta">... </span> (batch_size, unet.config.in_channels, height // <span class="hljs-number">8</span>, width // <span class="hljs-number">8</span>),
<span class="hljs-meta">... </span> generator=generator,
<span class="hljs-meta">... </span> device=torch_device,
<span class="hljs-meta">... </span>)`,wrap:!1}}),Ts=new G({props:{title:"이미지 노이즈 제거",local:"이미지-노이즈-제거",headingTag:"h3"}}),$s=new j({props:{code:"bGF0ZW50cyUyMCUzRCUyMGxhdGVudHMlMjAqJTIwc2NoZWR1bGVyLmluaXRfbm9pc2Vfc2lnbWE=",highlighted:'<span class="hljs-meta">&gt;&gt;&gt; </span>latents = latents * scheduler.init_noise_sigma',wrap:!1}}),_s=new j({props:{code:"ZnJvbSUyMHRxZG0uYXV0byUyMGltcG9ydCUyMHRxZG0lMEElMEFzY2hlZHVsZXIuc2V0X3RpbWVzdGVwcyhudW1faW5mZXJlbmNlX3N0ZXBzKSUwQSUwQWZvciUyMHQlMjBpbiUyMHRxZG0oc2NoZWR1bGVyLnRpbWVzdGVwcyklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjBjbGFzc2lmaWVyLWZyZWUlMjBndWlkYW5jZSVFQiVBNSVCQyUyMCVFQyU4OCU5OCVFRCU5NiU4OSVFRCU5NSU5OCVFQiU4QSU5NCUyMCVFQSVCMiVCRCVFQyU5QSVCMCUyMCVFQiU5MSU5MCVFQiVCMiU4OCVFQyU5RCU5OCUyMGZvcndhcmQlMjBwYXNzJUVCJUE1JUJDJTIwJUVDJTg4JTk4JUVEJTk2JTg5JUVEJTk1JTk4JUVDJUE3JTgwJTIwJUVDJTk1JThBJUVCJThGJTg0JUVCJUExJTlEJTIwbGF0ZW50JUVCJUE1JUJDJTIwJUVEJTk5JTk1JUVDJTlFJUE1LiUwQSUyMCUyMCUyMCUyMGxhdGVudF9tb2RlbF9pbnB1dCUyMCUzRCUyMHRvcmNoLmNhdCglNUJsYXRlbnRzJTVEJTIwKiUyMDIpJTBBJTBBJTIwJTIwJTIwJTIwbGF0ZW50X21vZGVsX2lucHV0JTIwJTNEJTIwc2NoZWR1bGVyLnNjYWxlX21vZGVsX2lucHV0KGxhdGVudF9tb2RlbF9pbnB1dCUyQyUyMHRpbWVzdGVwJTNEdCklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBub2lzZSUyMHJlc2lkdWFsJTIwJUVDJTk4JTg4JUVDJUI4JUExJTBBJTIwJTIwJTIwJTIwd2l0aCUyMHRvcmNoLm5vX2dyYWQoKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG5vaXNlX3ByZWQlMjAlM0QlMjB1bmV0KGxhdGVudF9tb2RlbF9pbnB1dCUyQyUyMHQlMkMlMjBlbmNvZGVyX2hpZGRlbl9zdGF0ZXMlM0R0ZXh0X2VtYmVkZGluZ3MpLnNhbXBsZSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMGd1aWRhbmNlJTIwJUVDJTg4JTk4JUVEJTk2JTg5JTBBJTIwJTIwJTIwJTIwbm9pc2VfcHJlZF91bmNvbmQlMkMlMjBub2lzZV9wcmVkX3RleHQlMjAlM0QlMjBub2lzZV9wcmVkLmNodW5rKDIpJTBBJTIwJTIwJTIwJTIwbm9pc2VfcHJlZCUyMCUzRCUyMG5vaXNlX3ByZWRfdW5jb25kJTIwJTJCJTIwZ3VpZGFuY2Vfc2NhbGUlMjAqJTIwKG5vaXNlX3ByZWRfdGV4dCUyMC0lMjBub2lzZV9wcmVkX3VuY29uZCklMEElMEElMjAlMjAlMjAlMjAlMjMlMjAlRUMlOUQlQjQlRUMlQTAlODQlMjAlRUIlODUlQjglRUMlOUQlQjQlRUMlQTYlODglMjAlRUMlODMlOTglRUQlOTQlOEMlRUMlOUQlODQlMjAlRUElQjMlODQlRUMlODIlQjAlMjB4X3QlMjAtJTNFJTIweF90LTElMEElMjAlMjAlMjAlMjBsYXRlbnRzJTIwJTNEJTIwc2NoZWR1bGVyLnN0ZXAobm9pc2VfcHJlZCUyQyUyMHQlMkMlMjBsYXRlbnRzKS5wcmV2X3NhbXBsZQ==",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> tqdm.auto <span class="hljs-keyword">import</span> tqdm
<span class="hljs-meta">&gt;&gt;&gt; </span>scheduler.set_timesteps(num_inference_steps)
<span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">for</span> t <span class="hljs-keyword">in</span> tqdm(scheduler.timesteps):
<span class="hljs-meta">... </span> <span class="hljs-comment"># classifier-free guidance를 수행하는 경우 두번의 forward pass를 수행하지 않도록 latent를 확장.</span>
<span class="hljs-meta">... </span> latent_model_input = torch.cat([latents] * <span class="hljs-number">2</span>)
<span class="hljs-meta">... </span> latent_model_input = scheduler.scale_model_input(latent_model_input, timestep=t)
<span class="hljs-meta">... </span> <span class="hljs-comment"># noise residual 예측</span>
<span class="hljs-meta">... </span> <span class="hljs-keyword">with</span> torch.no_grad():
<span class="hljs-meta">... </span> noise_pred = unet(latent_model_input, t, encoder_hidden_states=text_embeddings).sample
<span class="hljs-meta">... </span> <span class="hljs-comment"># guidance 수행</span>
<span class="hljs-meta">... </span> noise_pred_uncond, noise_pred_text = noise_pred.chunk(<span class="hljs-number">2</span>)
<span class="hljs-meta">... </span> noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)
<span class="hljs-meta">... </span> <span class="hljs-comment"># 이전 노이즈 샘플을 계산 x_t -&gt; x_t-1</span>
<span class="hljs-meta">... </span> latents = scheduler.step(noise_pred, t, latents).prev_sample`,wrap:!1}}),vs=new G({props:{title:"이미지 디코딩",local:"이미지-디코딩",headingTag:"h3"}}),ks=new j({props:{code:"JTIzJTIwbGF0ZW50JUVCJUE1JUJDJTIwJUVDJThBJUE0JUVDJUJDJTgwJUVDJTlEJUJDJUVCJUE3JTgxJUVEJTk1JTk4JUVBJUIzJUEwJTIwdmFlJUVCJUExJTlDJTIwJUVDJTlEJUI0JUVCJUFGJUI4JUVDJUE3JTgwJTIwJUVCJTk0JTk0JUVDJUJEJTk0JUVCJTk0JUE5JTBBbGF0ZW50cyUyMCUzRCUyMDElMjAlMkYlMjAwLjE4MjE1JTIwKiUyMGxhdGVudHMlMEF3aXRoJTIwdG9yY2gubm9fZ3JhZCgpJTNBJTBBJTIwJTIwJTIwJTIwaW1hZ2UlMjAlM0QlMjB2YWUuZGVjb2RlKGxhdGVudHMpLnNhbXBsZQ==",highlighted:`<span class="hljs-comment"># latent를 스케일링하고 vae로 이미지 디코딩</span>
latents = <span class="hljs-number">1</span> / <span class="hljs-number">0.18215</span> * latents
<span class="hljs-keyword">with</span> torch.no_grad():
image = vae.decode(latents).sample`,wrap:!1}}),Gs=new j({props:{code:"aW1hZ2UlMjAlM0QlMjAoaW1hZ2UlMjAlMkYlMjAyJTIwJTJCJTIwMC41KS5jbGFtcCgwJTJDJTIwMSklMEFpbWFnZSUyMCUzRCUyMGltYWdlLmRldGFjaCgpLmNwdSgpLnBlcm11dGUoMCUyQyUyMDIlMkMlMjAzJTJDJTIwMSkubnVtcHkoKSUwQWltYWdlcyUyMCUzRCUyMChpbWFnZSUyMColMjAyNTUpLnJvdW5kKCkuYXN0eXBlKCUyMnVpbnQ4JTIyKSUwQXBpbF9pbWFnZXMlMjAlM0QlMjAlNUJJbWFnZS5mcm9tYXJyYXkoaW1hZ2UpJTIwZm9yJTIwaW1hZ2UlMjBpbiUyMGltYWdlcyU1RCUwQXBpbF9pbWFnZXMlNUIwJTVE",highlighted:`<span class="hljs-meta">&gt;&gt;&gt; </span>image = (image / <span class="hljs-number">2</span> + <span class="hljs-number">0.5</span>).clamp(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>)
<span class="hljs-meta">&gt;&gt;&gt; </span>image = image.detach().cpu().permute(<span class="hljs-number">0</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1</span>).numpy()
<span class="hljs-meta">&gt;&gt;&gt; </span>images = (image * <span class="hljs-number">255</span>).<span class="hljs-built_in">round</span>().astype(<span class="hljs-string">&quot;uint8&quot;</span>)
<span class="hljs-meta">&gt;&gt;&gt; </span>pil_images = [Image.fromarray(image) <span class="hljs-keyword">for</span> image <span class="hljs-keyword">in</span> images]
<span class="hljs-meta">&gt;&gt;&gt; </span>pil_images[<span class="hljs-number">0</span>]`,wrap:!1}}),Qs=new G({props:{title:"다음 단계",local:"다음-단계",headingTag:"h2"}}),Xs=new ml({props:{source:"https://github.com/huggingface/diffusers/blob/main/docs/source/ko/using-diffusers/write_own_pipeline.md"}}),{c(){c=p("meta"),w=n(),f=p("p"),U=n(),o(T.$$.fragment),b=n(),o(C.$$.fragment),Ks=n(),Q=p("p"),Q.innerHTML=bt,Os=n(),W=p("p"),W.textContent=Ut,se=n(),o(x.$$.fragment),ee=n(),N=p("p"),N.textContent=Jt,te=n(),o(E.$$.fragment),le=n(),_=p("div"),_.innerHTML=yt,ne=n(),X=p("p"),X.textContent=wt,ae=n(),B=p("p"),B.innerHTML=Tt,pe=n(),F=p("p"),F.textContent=Ct,ie=n(),J=p("ol"),S=p("li"),Ss=p("p"),Ss.textContent=$t,at=n(),o(H.$$.fragment),pt=n(),D=p("li"),Hs=p("p"),Hs.textContent=Vt,it=n(),o(L.$$.fragment),mt=n(),z=p("li"),Ds=p("p"),Ds.textContent=Zt,ct=n(),o(Y.$$.fragment),ot=n(),A=p("li"),Ls=p("p"),Ls.textContent=_t,Mt=n(),o(P.$$.fragment),rt=n(),$=p("li"),zs=p("p"),zs.innerHTML=vt,ut=n(),o(q.$$.fragment),dt=n(),Ys=p("p"),Ys.textContent=It,ht=n(),K=p("li"),As=p("p"),As.textContent=kt,gt=n(),o(O.$$.fragment),me=n(),ss=p("p"),ss.innerHTML=Rt,ce=n(),es=p("p"),es.textContent=Gt,oe=n(),o(ts.$$.fragment),Me=n(),ls=p("p"),ls.innerHTML=Qt,re=n(),ns=p("p"),ns.textContent=Wt,ue=n(),o(v.$$.fragment),de=n(),as=p("p"),as.innerHTML=xt,he=n(),o(ps.$$.fragment),ge=n(),is=p("p"),is.innerHTML=Nt,fe=n(),o(ms.$$.fragment),je=n(),cs=p("p"),cs.textContent=Et,be=n(),o(os.$$.fragment),Ue=n(),o(Ms.$$.fragment),Je=n(),rs=p("p"),rs.textContent=Xt,ye=n(),o(I.$$.fragment),we=n(),us=p("p"),us.textContent=Bt,Te=n(),o(ds.$$.fragment),Ce=n(),hs=p("p"),hs.textContent=Ft,$e=n(),o(gs.$$.fragment),Ve=n(),fs=p("p"),fs.innerHTML=St,Ze=n(),o(js.$$.fragment),_e=n(),bs=p("p"),bs.textContent=Ht,ve=n(),o(Us.$$.fragment),Ie=n(),o(Js.$$.fragment),ke=n(),ys=p("p"),ys.innerHTML=Dt,Re=n(),o(k.$$.fragment),Ge=n(),o(ws.$$.fragment),Qe=n(),o(Ts.$$.fragment),We=n(),Cs=p("p"),Cs.innerHTML=Lt,xe=n(),o($s.$$.fragment),Ne=n(),Vs=p("p"),Vs.innerHTML=zt,Ee=n(),Zs=p("ol"),Zs.innerHTML=Yt,Xe=n(),o(_s.$$.fragment),Be=n(),o(vs.$$.fragment),Fe=n(),Is=p("p"),Is.innerHTML=At,Se=n(),o(ks.$$.fragment),He=n(),Rs=p("p"),Rs.innerHTML=Pt,De=n(),o(Gs.$$.fragment),Le=n(),R=p("div"),R.innerHTML=qt,ze=n(),o(Qs.$$.fragment),Ye=n(),Ws=p("p"),Ws.textContent=Kt,Ae=n(),xs=p("p"),xs.textContent=Ot,Pe=n(),Ns=p("p"),Ns.textContent=sl,qe=n(),Es=p("ul"),Es.innerHTML=el,Ke=n(),o(Xs.$$.fragment),Oe=n(),qs=p("p"),this.h()},l(s){const e=pl("svelte-u9bgzb",document.head);c=i(e,"META",{name:!0,content:!0}),e.forEach(t),w=a(s),f=i(s,"P",{}),V(f).forEach(t),U=a(s),M(T.$$.fragment,s),b=a(s),M(C.$$.fragment,s),Ks=a(s),Q=i(s,"P",{"data-svelte-h":!0}),m(Q)!=="svelte-1w08vjm"&&(Q.innerHTML=bt),Os=a(s),W=i(s,"P",{"data-svelte-h":!0}),m(W)!=="svelte-1rh2wvk"&&(W.textContent=Ut),se=a(s),M(x.$$.fragment,s),ee=a(s),N=i(s,"P",{"data-svelte-h":!0}),m(N)!=="svelte-1ejhv0l"&&(N.textContent=Jt),te=a(s),M(E.$$.fragment,s),le=a(s),_=i(s,"DIV",{class:!0,"data-svelte-h":!0}),m(_)!=="svelte-ej6f4c"&&(_.innerHTML=yt),ne=a(s),X=i(s,"P",{"data-svelte-h":!0}),m(X)!=="svelte-1l346u9"&&(X.textContent=wt),ae=a(s),B=i(s,"P",{"data-svelte-h":!0}),m(B)!=="svelte-abj3gw"&&(B.innerHTML=Tt),pe=a(s),F=i(s,"P",{"data-svelte-h":!0}),m(F)!=="svelte-dgd067"&&(F.textContent=Ct),ie=a(s),J=i(s,"OL",{});var y=V(J);S=i(y,"LI",{});var Bs=V(S);Ss=i(Bs,"P",{"data-svelte-h":!0}),m(Ss)!=="svelte-j1r62h"&&(Ss.textContent=$t),at=a(Bs),M(H.$$.fragment,Bs),Bs.forEach(t),pt=a(y),D=i(y,"LI",{});var Fs=V(D);Hs=i(Fs,"P",{"data-svelte-h":!0}),m(Hs)!=="svelte-khbsw8"&&(Hs.textContent=Vt),it=a(Fs),M(L.$$.fragment,Fs),Fs.forEach(t),mt=a(y),z=i(y,"LI",{});var et=V(z);Ds=i(et,"P",{"data-svelte-h":!0}),m(Ds)!=="svelte-yj8dtl"&&(Ds.textContent=Zt),ct=a(et),M(Y.$$.fragment,et),et.forEach(t),ot=a(y),A=i(y,"LI",{});var tt=V(A);Ls=i(tt,"P",{"data-svelte-h":!0}),m(Ls)!=="svelte-1mx5t16"&&(Ls.textContent=_t),Mt=a(tt),M(P.$$.fragment,tt),tt.forEach(t),rt=a(y),$=i(y,"LI",{});var Ps=V($);zs=i(Ps,"P",{"data-svelte-h":!0}),m(zs)!=="svelte-1dcn1b9"&&(zs.innerHTML=vt),ut=a(Ps),M(q.$$.fragment,Ps),dt=a(Ps),Ys=i(Ps,"P",{"data-svelte-h":!0}),m(Ys)!=="svelte-x05lv9"&&(Ys.textContent=It),Ps.forEach(t),ht=a(y),K=i(y,"LI",{});var lt=V(K);As=i(lt,"P",{"data-svelte-h":!0}),m(As)!=="svelte-1plitwm"&&(As.textContent=kt),gt=a(lt),M(O.$$.fragment,lt),lt.forEach(t),y.forEach(t),me=a(s),ss=i(s,"P",{"data-svelte-h":!0}),m(ss)!=="svelte-1lzspna"&&(ss.innerHTML=Rt),ce=a(s),es=i(s,"P",{"data-svelte-h":!0}),m(es)!=="svelte-5z3iwd"&&(es.textContent=Gt),oe=a(s),M(ts.$$.fragment,s),Me=a(s),ls=i(s,"P",{"data-svelte-h":!0}),m(ls)!=="svelte-cnatu9"&&(ls.innerHTML=Qt),re=a(s),ns=i(s,"P",{"data-svelte-h":!0}),m(ns)!=="svelte-1qnf9z2"&&(ns.textContent=Wt),ue=a(s),M(v.$$.fragment,s),de=a(s),as=i(s,"P",{"data-svelte-h":!0}),m(as)!=="svelte-xdwsf8"&&(as.innerHTML=xt),he=a(s),M(ps.$$.fragment,s),ge=a(s),is=i(s,"P",{"data-svelte-h":!0}),m(is)!=="svelte-angdpe"&&(is.innerHTML=Nt),fe=a(s),M(ms.$$.fragment,s),je=a(s),cs=i(s,"P",{"data-svelte-h":!0}),m(cs)!=="svelte-xe2wp7"&&(cs.textContent=Et),be=a(s),M(os.$$.fragment,s),Ue=a(s),M(Ms.$$.fragment,s),Je=a(s),rs=i(s,"P",{"data-svelte-h":!0}),m(rs)!=="svelte-nswq27"&&(rs.textContent=Xt),ye=a(s),M(I.$$.fragment,s),we=a(s),us=i(s,"P",{"data-svelte-h":!0}),m(us)!=="svelte-193i9if"&&(us.textContent=Bt),Te=a(s),M(ds.$$.fragment,s),Ce=a(s),hs=i(s,"P",{"data-svelte-h":!0}),m(hs)!=="svelte-v5k7o5"&&(hs.textContent=Ft),$e=a(s),M(gs.$$.fragment,s),Ve=a(s),fs=i(s,"P",{"data-svelte-h":!0}),m(fs)!=="svelte-1nerc8v"&&(fs.innerHTML=St),Ze=a(s),M(js.$$.fragment,s),_e=a(s),bs=i(s,"P",{"data-svelte-h":!0}),m(bs)!=="svelte-iqpjwl"&&(bs.textContent=Ht),ve=a(s),M(Us.$$.fragment,s),Ie=a(s),M(Js.$$.fragment,s),ke=a(s),ys=i(s,"P",{"data-svelte-h":!0}),m(ys)!=="svelte-b5xa4e"&&(ys.innerHTML=Dt),Re=a(s),M(k.$$.fragment,s),Ge=a(s),M(ws.$$.fragment,s),Qe=a(s),M(Ts.$$.fragment,s),We=a(s),Cs=i(s,"P",{"data-svelte-h":!0}),m(Cs)!=="svelte-1xr7g73"&&(Cs.innerHTML=Lt),xe=a(s),M($s.$$.fragment,s),Ne=a(s),Vs=i(s,"P",{"data-svelte-h":!0}),m(Vs)!=="svelte-4n9fvy"&&(Vs.innerHTML=zt),Ee=a(s),Zs=i(s,"OL",{"data-svelte-h":!0}),m(Zs)!=="svelte-iivnel"&&(Zs.innerHTML=Yt),Xe=a(s),M(_s.$$.fragment,s),Be=a(s),M(vs.$$.fragment,s),Fe=a(s),Is=i(s,"P",{"data-svelte-h":!0}),m(Is)!=="svelte-12g4hh4"&&(Is.innerHTML=At),Se=a(s),M(ks.$$.fragment,s),He=a(s),Rs=i(s,"P",{"data-svelte-h":!0}),m(Rs)!=="svelte-1bjoomr"&&(Rs.innerHTML=Pt),De=a(s),M(Gs.$$.fragment,s),Le=a(s),R=i(s,"DIV",{class:!0,"data-svelte-h":!0}),m(R)!=="svelte-1b0w6va"&&(R.innerHTML=qt),ze=a(s),M(Qs.$$.fragment,s),Ye=a(s),Ws=i(s,"P",{"data-svelte-h":!0}),m(Ws)!=="svelte-nwx4ql"&&(Ws.textContent=Kt),Ae=a(s),xs=i(s,"P",{"data-svelte-h":!0}),m(xs)!=="svelte-g0p09q"&&(xs.textContent=Ot),Pe=a(s),Ns=i(s,"P",{"data-svelte-h":!0}),m(Ns)!=="svelte-qg73l2"&&(Ns.textContent=sl),qe=a(s),Es=i(s,"UL",{"data-svelte-h":!0}),m(Es)!=="svelte-y3g0al"&&(Es.innerHTML=el),Ke=a(s),M(Xs.$$.fragment,s),Oe=a(s),qs=i(s,"P",{}),V(qs).forEach(t),this.h()},h(){nt(c,"name","hf:doc:metadata"),nt(c,"content",ul),nt(_,"class","flex justify-center"),nt(R,"class","flex justify-center")},m(s,e){g(document.head,c),l(s,w,e),l(s,f,e),l(s,U,e),r(T,s,e),l(s,b,e),r(C,s,e),l(s,Ks,e),l(s,Q,e),l(s,Os,e),l(s,W,e),l(s,se,e),r(x,s,e),l(s,ee,e),l(s,N,e),l(s,te,e),r(E,s,e),l(s,le,e),l(s,_,e),l(s,ne,e),l(s,X,e),l(s,ae,e),l(s,B,e),l(s,pe,e),l(s,F,e),l(s,ie,e),l(s,J,e),g(J,S),g(S,Ss),g(S,at),r(H,S,null),g(J,pt),g(J,D),g(D,Hs),g(D,it),r(L,D,null),g(J,mt),g(J,z),g(z,Ds),g(z,ct),r(Y,z,null),g(J,ot),g(J,A),g(A,Ls),g(A,Mt),r(P,A,null),g(J,rt),g(J,$),g($,zs),g($,ut),r(q,$,null),g($,dt),g($,Ys),g(J,ht),g(J,K),g(K,As),g(K,gt),r(O,K,null),l(s,me,e),l(s,ss,e),l(s,ce,e),l(s,es,e),l(s,oe,e),r(ts,s,e),l(s,Me,e),l(s,ls,e),l(s,re,e),l(s,ns,e),l(s,ue,e),r(v,s,e),l(s,de,e),l(s,as,e),l(s,he,e),r(ps,s,e),l(s,ge,e),l(s,is,e),l(s,fe,e),r(ms,s,e),l(s,je,e),l(s,cs,e),l(s,be,e),r(os,s,e),l(s,Ue,e),r(Ms,s,e),l(s,Je,e),l(s,rs,e),l(s,ye,e),r(I,s,e),l(s,we,e),l(s,us,e),l(s,Te,e),r(ds,s,e),l(s,Ce,e),l(s,hs,e),l(s,$e,e),r(gs,s,e),l(s,Ve,e),l(s,fs,e),l(s,Ze,e),r(js,s,e),l(s,_e,e),l(s,bs,e),l(s,ve,e),r(Us,s,e),l(s,Ie,e),r(Js,s,e),l(s,ke,e),l(s,ys,e),l(s,Re,e),r(k,s,e),l(s,Ge,e),r(ws,s,e),l(s,Qe,e),r(Ts,s,e),l(s,We,e),l(s,Cs,e),l(s,xe,e),r($s,s,e),l(s,Ne,e),l(s,Vs,e),l(s,Ee,e),l(s,Zs,e),l(s,Xe,e),r(_s,s,e),l(s,Be,e),r(vs,s,e),l(s,Fe,e),l(s,Is,e),l(s,Se,e),r(ks,s,e),l(s,He,e),l(s,Rs,e),l(s,De,e),r(Gs,s,e),l(s,Le,e),l(s,R,e),l(s,ze,e),r(Qs,s,e),l(s,Ye,e),l(s,Ws,e),l(s,Ae,e),l(s,xs,e),l(s,Pe,e),l(s,Ns,e),l(s,qe,e),l(s,Es,e),l(s,Ke,e),r(Xs,s,e),l(s,Oe,e),l(s,qs,e),st=!0},p(s,[e]){const y={};e&2&&(y.$$scope={dirty:e,ctx:s}),v.$set(y);const Bs={};e&2&&(Bs.$$scope={dirty:e,ctx:s}),I.$set(Bs);const Fs={};e&2&&(Fs.$$scope={dirty:e,ctx:s}),k.$set(Fs)},i(s){st||(u(T.$$.fragment,s),u(C.$$.fragment,s),u(x.$$.fragment,s),u(E.$$.fragment,s),u(H.$$.fragment,s),u(L.$$.fragment,s),u(Y.$$.fragment,s),u(P.$$.fragment,s),u(q.$$.fragment,s),u(O.$$.fragment,s),u(ts.$$.fragment,s),u(v.$$.fragment,s),u(ps.$$.fragment,s),u(ms.$$.fragment,s),u(os.$$.fragment,s),u(Ms.$$.fragment,s),u(I.$$.fragment,s),u(ds.$$.fragment,s),u(gs.$$.fragment,s),u(js.$$.fragment,s),u(Us.$$.fragment,s),u(Js.$$.fragment,s),u(k.$$.fragment,s),u(ws.$$.fragment,s),u(Ts.$$.fragment,s),u($s.$$.fragment,s),u(_s.$$.fragment,s),u(vs.$$.fragment,s),u(ks.$$.fragment,s),u(Gs.$$.fragment,s),u(Qs.$$.fragment,s),u(Xs.$$.fragment,s),st=!0)},o(s){d(T.$$.fragment,s),d(C.$$.fragment,s),d(x.$$.fragment,s),d(E.$$.fragment,s),d(H.$$.fragment,s),d(L.$$.fragment,s),d(Y.$$.fragment,s),d(P.$$.fragment,s),d(q.$$.fragment,s),d(O.$$.fragment,s),d(ts.$$.fragment,s),d(v.$$.fragment,s),d(ps.$$.fragment,s),d(ms.$$.fragment,s),d(os.$$.fragment,s),d(Ms.$$.fragment,s),d(I.$$.fragment,s),d(ds.$$.fragment,s),d(gs.$$.fragment,s),d(js.$$.fragment,s),d(Us.$$.fragment,s),d(Js.$$.fragment,s),d(k.$$.fragment,s),d(ws.$$.fragment,s),d(Ts.$$.fragment,s),d($s.$$.fragment,s),d(_s.$$.fragment,s),d(vs.$$.fragment,s),d(ks.$$.fragment,s),d(Gs.$$.fragment,s),d(Qs.$$.fragment,s),d(Xs.$$.fragment,s),st=!1},d(s){s&&(t(w),t(f),t(U),t(b),t(Ks),t(Q),t(Os),t(W),t(se),t(ee),t(N),t(te),t(le),t(_),t(ne),t(X),t(ae),t(B),t(pe),t(F),t(ie),t(J),t(me),t(ss),t(ce),t(es),t(oe),t(Me),t(ls),t(re),t(ns),t(ue),t(de),t(as),t(he),t(ge),t(is),t(fe),t(je),t(cs),t(be),t(Ue),t(Je),t(rs),t(ye),t(we),t(us),t(Te),t(Ce),t(hs),t($e),t(Ve),t(fs),t(Ze),t(_e),t(bs),t(ve),t(Ie),t(ke),t(ys),t(Re),t(Ge),t(Qe),t(We),t(Cs),t(xe),t(Ne),t(Vs),t(Ee),t(Zs),t(Xe),t(Be),t(Fe),t(Is),t(Se),t(He),t(Rs),t(De),t(Le),t(R),t(ze),t(Ye),t(Ws),t(Ae),t(xs),t(Pe),t(Ns),t(qe),t(Es),t(Ke),t(Oe),t(qs)),t(c),h(T,s),h(C,s),h(x,s),h(E,s),h(H),h(L),h(Y),h(P),h(q),h(O),h(ts,s),h(v,s),h(ps,s),h(ms,s),h(os,s),h(Ms,s),h(I,s),h(ds,s),h(gs,s),h(js,s),h(Us,s),h(Js,s),h(k,s),h(ws,s),h(Ts,s),h($s,s),h(_s,s),h(vs,s),h(ks,s),h(Gs,s),h(Qs,s),h(Xs,s)}}}const ul='{"title":"파이프라인, 모델 및 스케줄러 이해하기","local":"파이프라인-모델-및-스케줄러-이해하기","sections":[{"title":"기본 파이프라인 해체하기","local":"기본-파이프라인-해체하기","sections":[],"depth":2},{"title":"Stable Diffusion 파이프라인 해체하기","local":"stable-diffusion-파이프라인-해체하기","sections":[{"title":"텍스트 임베딩 생성하기","local":"텍스트-임베딩-생성하기","sections":[],"depth":3},{"title":"랜덤 노이즈 생성","local":"랜덤-노이즈-생성","sections":[],"depth":3},{"title":"이미지 노이즈 제거","local":"이미지-노이즈-제거","sections":[],"depth":3},{"title":"이미지 디코딩","local":"이미지-디코딩","sections":[],"depth":3}],"depth":2},{"title":"다음 단계","local":"다음-단계","sections":[],"depth":2}],"depth":1}';function dl(Z){return ll(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Jl extends nl{constructor(c){super(),al(this,c,dl,rl,tl,{})}}export{Jl as component};

Xet Storage Details

Size:
47.7 kB
·
Xet hash:
0b2e84475af51043a90bdfa55e4ee75f4b35d7fd32597bde609bfff6c12632f0

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