Buckets:
| import"../chunks/DsnmJJEf.js";import{i as S,h as Q,C,H as i,a as l,E as q,s as z}from"../chunks/D5H6NtZg.js";import{p as A,o as L,s as a,f as d,a as r,b as D,c,d as H,r as P,n as $}from"../chunks/BXBUBnmz.js";import{D as K}from"../chunks/DpaWfUh3.js";import{F as B,M as u}from"../chunks/fUE-n-Ic.js";const O='{"title":"Textual-Inversion","local":"textual-inversion","sections":[{"title":"허브에 모델 업로드하기","local":"허브에-모델-업로드하기","sections":[],"depth":2},{"title":"체크포인트 저장 및 불러오기","local":"체크포인트-저장-및-불러오기","sections":[],"depth":2},{"title":"파인 튜닝","local":"파인-튜닝","sections":[{"title":"중간 로깅","local":"중간-로깅","sections":[],"depth":3}],"depth":2},{"title":"추론","local":"추론","sections":[],"depth":2},{"title":"작동 방식","local":"작동-방식","sections":[],"depth":2}],"depth":1}';var aa=c('<meta name="hf:doc:metadata"/>'),la=c('<!> <blockquote class="tip"><p>💡학습 성능을 올리기 위해, 플레이스홀더 토큰(<code><cat-toy></code>)을 (단일한 임베딩 벡터가 아닌) 복수의 임베딩 벡터로 표현하는 것 역시 고려할 있습니다. 이러한 트릭이 모델이 보다 복잡한 이미지의 스타일(앞서 말한 콘셉트)을 더 잘 캡처하는 데 도움이 될 수 있습니다. 복수의 임베딩 벡터 학습을 활성화하려면 다음 옵션을 전달하십시오.</p> <!></blockquote>',1),ea=c('<p>TPU에 액세스할 수 있는 경우, <a href="https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion_flax.py" rel="nofollow">Flax 학습 스크립트</a>를 사용하여 더 빠르게 모델을 학습시켜보세요. (물론 GPU에서도 작동합니다.) 동일한 설정에서 Flax 학습 스크립트는 PyTorch 학습 스크립트보다 최소 70% 더 빨라야 합니다! ⚡️</p> <p>시작하기 앞서 Flax에 대한 의존성 라이브러리들을 설치해야 합니다.</p> <!> <p>모델의 리포지토리 ID(또는 모델 가중치가 포함된 디렉터리 경로)를 <code>MODEL_NAME</code> 환경 변수에 할당하고, 해당 값을 <a href="https://huggingface.co/docs/diffusers/en/api/diffusion_pipeline#diffusers.DiffusionPipeline.from_pretrained.pretrained_model_name_or_path" rel="nofollow"><code>pretrained_model_name_or_path</code></a> 인자에 전달합니다.</p> <p>그런 다음 <a href="https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion_flax.py" rel="nofollow">학습 스크립트</a>를 시작할 수 있습니다.</p> <!>',1),sa=c('<blockquote class="tip"><p>💡 커뮤니티는 <a href="https://huggingface.co/sd-concepts-library" rel="nofollow">sd-concepts-library</a> 라는 대규모의 textual-inversion 임베딩 벡터 라이브러리를 만들었습니다. textual-inversion 임베딩을 밑바닥부터 학습하는 대신, 해당 라이브러리에 본인이 찾는 textual-inversion 임베딩이 이미 추가되어 있지 않은지를 확인하는 것도 좋은 방법이 될 것 같습니다.</p></blockquote> <p>textual-inversion 임베딩 벡터을 불러오기 위해서는, 먼저 해당 임베딩 벡터를 학습할 때 사용한 모델을 불러와야 합니다. 여기서는 <a href="https://huggingface.co/docs/diffusers/training/stable-diffusion-v1-5/stable-diffusion-v1-5" rel="nofollow"><code>stable-diffusion-v1-5/stable-diffusion-v1-5</code></a> 모델이 사용되었다고 가정하고 불러오겠습니다.</p> <!> <p>다음으로 <code>TextualInversionLoaderMixin.load_textual_inversion</code> 함수를 통해, textual-inversion 임베딩 벡터를 불러와야 합니다. 여기서 우리는 이전의 <code><cat-toy></code> 예제의 임베딩을 불러올 것입니다.</p> <!> <p>이제 플레이스홀더 토큰(<code><cat-toy></code>)이 잘 동작하는지를 확인하는 파이프라인을 실행할 수 있습니다.</p> <!> <p><code>TextualInversionLoaderMixin.load_textual_inversion</code>은 Diffusers 형식으로 저장된 텍스트 임베딩 벡터를 로드할 수 있을 뿐만 아니라, <a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui" rel="nofollow">Automatic1111</a> 형식으로 저장된 임베딩 벡터도 로드할 수 있습니다. 이렇게 하려면, 먼저 <a href="https://civitai.com/models/3036?modelVersionId=8387" rel="nofollow">civitAI</a>에서 임베딩 벡터를 다운로드한 다음 로컬에서 불러와야 합니다.</p> <!>',1),ta=c("<p>현재 Flax에 대한 <code>load_textual_inversion</code> 함수는 없습니다. 따라서 학습 후 textual-inversion 임베딩 벡터가 모델의 일부로서 저장되었는지를 확인해야 합니다. 그런 다음은 다른 Flax 모델과 마찬가지로 실행할 수 있습니다.</p> <!>",1),oa=c('<p></p> <!> <!> <!> <p><a href="https://huggingface.co/papers/2208.01618" rel="nofollow">textual-inversion</a>은 소수의 예시 이미지에서 새로운 콘셉트를 포착하는 기법입니다. 이 기술은 원래 <a href="https://github.com/CompVis/latent-diffusion" rel="nofollow">Latent Diffusion</a>에서 시연되었지만, 이후 <a href="https://huggingface.co/docs/diffusers/main/en/conceptual/stable_diffusion" rel="nofollow">Stable Diffusion</a>과 같은 유사한 다른 모델에도 적용되었습니다. 학습된 콘셉트는 text-to-image 파이프라인에서 생성된 이미지를 더 잘 제어하는 데 사용할 수 있습니다. 이 모델은 텍스트 인코더의 임베딩 공간에서 새로운 ‘단어’를 학습하여 개인화된 이미지 생성을 위한 텍스트 프롬프트 내에서 사용됩니다.</p> <p><img src="https://textual-inversion.github.io/static/images/editing/colorful_teapot.JPG" alt="Textual Inversion example"/></p> <small>By using just 3-5 images you can teach new concepts to a model such as Stable Diffusion for personalized image generation <a href="https://github.com/rinongal/textual_inversion">(image source)</a>.</small> <p>이 가이드에서는 textual-inversion으로 <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> 모델을 학습하는 방법을 설명합니다. 이 가이드에서 사용된 모든 textual-inversion 학습 스크립트는 <a href="https://github.com/huggingface/diffusers/tree/main/examples/textual_inversion" rel="nofollow">여기</a>에서 확인할 수 있습니다. 내부적으로 어떻게 작동하는지 자세히 살펴보고 싶으시다면 해당 링크를 참조해주시기 바랍니다.</p> <blockquote><p>[!TIP][Stable Diffusion Textual Inversion Concepts Library](<a href="https://huggingface.co/sd-concepts-library)%EC%97%90%EB%8A%94" rel="nofollow">https://huggingface.co/sd-concepts-library)에는</a> 커뮤니티에서 제작한 학습된 textual-inversion 모델들이 있습니다. 시간이 지남에 따라 더 많은 콘셉트들이 추가되어 유용한 리소스로 성장할 것입니다!</p></blockquote> <p>시작하기 전에 학습을 위한 의존성 라이브러리들을 설치해야 합니다:</p> <!> <p>의존성 라이브러리들의 설치가 완료되면, <a href="https://github.com/huggingface/accelerate/" rel="nofollow">🤗Accelerate</a> 환경을 초기화시킵니다.</p> <!> <p>별도의 설정없이, 기본 🤗Accelerate 환경을 설정하려면 다음과 같이 하세요:</p> <!> <p>또는 사용 중인 환경이 노트북과 같은 대화형 셸을 지원하지 않는다면, 다음과 같이 사용할 수 있습니다:</p> <!> <p>마지막으로, Memory-Efficient Attention을 통해 메모리 사용량을 줄이기 위해 <a href="https://huggingface.co/docs/diffusers/main/en/training/optimization/xformers" rel="nofollow">xFormers</a>를 설치합니다. xFormers를 설치한 후, 학습 스크립트에 <code>--enable_xformers_memory_efficient_attention</code> 인자를 추가합니다. xFormers는 Flax에서 지원되지 않습니다.</p> <!> <p>모델을 허브에 저장하려면, 학습 스크립트에 다음 인자를 추가해야 합니다.</p> <!> <!> <p>학습중에 모델의 체크포인트를 정기적으로 저장하는 것이 좋습니다. 이렇게 하면 어떤 이유로든 학습이 중단된 경우 저장된 체크포인트에서 학습을 다시 시작할 수 있습니다. 학습 스크립트에 다음 인자를 전달하면 500단계마다 전체 학습 상태가 <code>output_dir</code>의 하위 폴더에 체크포인트로서 저장됩니다.</p> <!> <p>저장된 체크포인트에서 학습을 재개하려면, 학습 스크립트와 재개할 특정 체크포인트에 다음 인자를 전달하세요.</p> <!> <!> <p>학습용 데이터셋으로 <a href="https://huggingface.co/datasets/diffusers/cat_toy_example" rel="nofollow">고양이 장난감 데이터셋</a>을 다운로드하여 디렉토리에 저장하세요. 여러분만의 고유한 데이터셋을 사용하고자 한다면, <a href="https://huggingface.co/docs/diffusers/training/create_dataset" rel="nofollow">학습용 데이터셋 만들기</a> 가이드를 살펴보시기 바랍니다.</p> <!> <p>모델의 리포지토리 ID(또는 모델 가중치가 포함된 디렉터리 경로)를 <code>MODEL_NAME</code> 환경 변수에 할당하고, 해당 값을 <a href="https://huggingface.co/docs/diffusers/en/api/diffusion_pipeline#diffusers.DiffusionPipeline.from_pretrained.pretrained_model_name_or_path" rel="nofollow"><code>pretrained_model_name_or_path</code></a> 인자에 전달합니다. 그리고 이미지가 포함된 디렉터리 경로를 <code>DATA_DIR</code> 환경 변수에 할당합니다.</p> <p>이제 <a href="https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion.py" rel="nofollow">학습 스크립트</a>를 실행할 수 있습니다. 스크립트는 다음 파일을 생성하고 리포지토리에 저장합니다.</p> <ul><li><code>learned_embeds.bin</code></li> <li><code>token_identifier.txt</code></li> <li><code>type_of_concept.txt</code>.</li></ul> <blockquote class="tip"><p>💡V100 GPU 1개를 기준으로 전체 학습에는 최대 1시간이 걸립니다. 학습이 완료되기를 기다리는 동안 궁금한 점이 있으면 아래 섹션에서 <a href="https://huggingface.co/docs/diffusers/training/text_inversion#how-it-works" rel="nofollow">textual-inversion이 어떻게 작동하는지</a> 자유롭게 확인하세요 !</p></blockquote> <!> <!> <p>모델의 학습 진행 상황을 추적하는 데 관심이 있는 경우, 학습 과정에서 생성된 이미지를 저장할 수 있습니다. 학습 스크립트에 다음 인수를 추가하여 중간 로깅을 활성화합니다.</p> <ul><li><code>validation_prompt</code> : 샘플을 생성하는 데 사용되는 프롬프트(기본값은 <code>None</code>으로 설정되며, 이 때 중간 로깅은 비활성화됨)</li> <li><code>num_validation_images</code> : 생성할 샘플 이미지 수</li> <li><code>validation_steps</code> : <code>validation_prompt</code>로부터 샘플 이미지를 생성하기 전 스텝의 수</li></ul> <!> <!> <p>모델을 학습한 후에는, 해당 모델을 <code>StableDiffusionPipeline</code>을 사용하여 추론에 사용할 수 있습니다.</p> <p>textual-inversion 스크립트는 기본적으로 textual-inversion을 통해 얻어진 임베딩 벡터만을 저장합니다. 해당 임베딩 벡터들은 텍스트 인코더의 임베딩 행렬에 추가되어 있습습니다.</p> <!> <!> <p><img src="https://textual-inversion.github.io/static/images/training/training.JPG" alt="Diagram from the paper showing overview"/></p> <small>Architecture overview from the Textual Inversion <a href="https://textual-inversion.github.io/">blog post.</a></small> <p>일반적으로 텍스트 프롬프트는 모델에 전달되기 전에 임베딩으로 토큰화됩니다. textual-inversion은 비슷한 작업을 수행하지만, 위 다이어그램의 특수 토큰 <code>S*</code>로부터 새로운 토큰 임베딩 <code>v*</code>를 학습합니다. 모델의 아웃풋은 디퓨전 모델을 조정하는 데 사용되며, 디퓨전 모델이 단 몇 개의 예제 이미지에서 신속하고 새로운 콘셉트를 이해하는 데 도움을 줍니다.</p> <p>이를 위해 textual-inversion은 제너레이터 모델과 학습용 이미지의 노이즈 버전을 사용합니다. 제너레이터는 노이즈가 적은 버전의 이미지를 예측하려고 시도하며 토큰 임베딩 <code>v*</code>은 제너레이터의 성능에 따라 최적화됩니다. 토큰 임베딩이 새로운 콘셉트를 성공적으로 포착하면 디퓨전 모델에 더 유용한 정보를 제공하고 노이즈가 적은 더 선명한 이미지를 생성하는 데 도움이 됩니다. 이러한 최적화 프로세스는 일반적으로 다양한 프롬프트와 이미지에 수천 번에 노출됨으로써 이루어집니다.</p> <!> <p></p>',1);function da(F,Y){A(Y,!1),L(()=>{new URLSearchParams(window.location.search).get("fw")}),S();var m=oa();Q("11u6mld",s=>{var p=aa();z(p,"content",O),r(s,p)});var g=a(d(m),2);C(g,{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"});var b=a(g,2);K(b,{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;",options:[{label:"Mixed",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers_doc/ko/text_inversion.ipynb"},{label:"PyTorch",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers_doc/ko/pytorch/text_inversion.ipynb"},{label:"TensorFlow",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers_doc/ko/tensorflow/text_inversion.ipynb"},{label:"Mixed",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/diffusers_doc/ko/text_inversion.ipynb"},{label:"PyTorch",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/diffusers_doc/ko/pytorch/text_inversion.ipynb"},{label:"TensorFlow",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/main/diffusers_doc/ko/tensorflow/text_inversion.ipynb"}]});var y=a(b,2);i(y,{title:"Textual-Inversion",local:"textual-inversion",headingTag:"h1"});var M=a(y,14);l(M,{code:"cGlwJTIwaW5zdGFsbCUyMGRpZmZ1c2VycyUyMGFjY2VsZXJhdGUlMjB0cmFuc2Zvcm1lcnM=",highlighted:"pip install diffusers accelerate transformers",lang:"bash",wrap:!1});var w=a(M,4);l(w,{code:"YWNjZWxlcmF0ZSUyMGNvbmZpZw==",highlighted:"accelerate config",lang:"bash",wrap:!1});var _=a(w,4);l(_,{code:"YWNjZWxlcmF0ZSUyMGNvbmZpZyUyMGRlZmF1bHQ=",highlighted:"accelerate config default",lang:"bash",wrap:!1});var J=a(_,4);l(J,{code:"ZnJvbSUyMGFjY2VsZXJhdGUudXRpbHMlMjBpbXBvcnQlMjB3cml0ZV9iYXNpY19jb25maWclMEElMEF3cml0ZV9iYXNpY19jb25maWcoKQ==",highlighted:`<span class="hljs-keyword">from</span> accelerate.utils <span class="hljs-keyword">import</span> write_basic_config | |
| write_basic_config()`,lang:"py",wrap:!1});var T=a(J,4);i(T,{title:"허브에 모델 업로드하기",local:"허브에-모델-업로드하기",headingTag:"h2"});var v=a(T,4);l(v,{code:"LS1wdXNoX3RvX2h1Yg==",highlighted:"--push_to_hub",lang:"bash",wrap:!1});var U=a(v,2);i(U,{title:"체크포인트 저장 및 불러오기",local:"체크포인트-저장-및-불러오기",headingTag:"h2"});var j=a(U,4);l(j,{code:"LS1jaGVja3BvaW50aW5nX3N0ZXBzJTNENTAw",highlighted:"--checkpointing_steps=500",lang:"bash",wrap:!1});var x=a(j,4);l(x,{code:"LS1yZXN1bWVfZnJvbV9jaGVja3BvaW50JTNEJTIyY2hlY2twb2ludC0xNTAwJTIy",highlighted:'--resume_from_checkpoint=<span class="hljs-string">"checkpoint-1500"</span>',lang:"bash",wrap:!1});var Z=a(x,2);i(Z,{title:"파인 튜닝",local:"파인-튜닝",headingTag:"h2"});var X=a(Z,4);l(X,{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMHNuYXBzaG90X2Rvd25sb2FkJTBBJTBBbG9jYWxfZGlyJTIwJTNEJTIwJTIyLiUyRmNhdCUyMiUwQXNuYXBzaG90X2Rvd25sb2FkKCUwQSUyMCUyMCUyMCUyMCUyMmRpZmZ1c2VycyUyRmNhdF90b3lfZXhhbXBsZSUyMiUyQyUyMGxvY2FsX2RpciUzRGxvY2FsX2RpciUyQyUyMHJlcG9fdHlwZSUzRCUyMmRhdGFzZXQlMjIlMkMlMjBpZ25vcmVfcGF0dGVybnMlM0QlMjIuZ2l0YXR0cmlidXRlcyUyMiUwQSk=",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> snapshot_download | |
| local_dir = <span class="hljs-string">"./cat"</span> | |
| snapshot_download( | |
| <span class="hljs-string">"diffusers/cat_toy_example"</span>, local_dir=local_dir, repo_type=<span class="hljs-string">"dataset"</span>, ignore_patterns=<span class="hljs-string">".gitattributes"</span> | |
| )`,lang:"py",wrap:!1});var W=a(X,10);B(W,{pytorch:!0,tensorflow:!1,jax:!0,$$slots:{pytorch:(s,p)=>{u(s,{children:(o,f)=>{var e=la(),t=d(e);l(t,{code:"ZXhwb3J0JTIwTU9ERUxfTkFNRSUzRCUyMnN0YWJsZS1kaWZmdXNpb24tdjEtNSUyRnN0YWJsZS1kaWZmdXNpb24tdjEtNSUyMiUwQWV4cG9ydCUyMERBVEFfRElSJTNEJTIyLiUyRmNhdCUyMiUwQSUwQWFjY2VsZXJhdGUlMjBsYXVuY2glMjB0ZXh0dWFsX2ludmVyc2lvbi5weSUyMCU1QyUwQSUyMCUyMC0tcHJldHJhaW5lZF9tb2RlbF9uYW1lX29yX3BhdGglM0QlMjRNT0RFTF9OQU1FJTIwJTVDJTBBJTIwJTIwLS10cmFpbl9kYXRhX2RpciUzRCUyNERBVEFfRElSJTIwJTVDJTBBJTIwJTIwLS1sZWFybmFibGVfcHJvcGVydHklM0QlMjJvYmplY3QlMjIlMjAlNUMlMEElMjAlMjAtLXBsYWNlaG9sZGVyX3Rva2VuJTNEJTIyJTNDY2F0LXRveSUzRSUyMiUyMC0taW5pdGlhbGl6ZXJfdG9rZW4lM0QlMjJ0b3klMjIlMjAlNUMlMEElMjAlMjAtLXJlc29sdXRpb24lM0Q1MTIlMjAlNUMlMEElMjAlMjAtLXRyYWluX2JhdGNoX3NpemUlM0QxJTIwJTVDJTBBJTIwJTIwLS1ncmFkaWVudF9hY2N1bXVsYXRpb25fc3RlcHMlM0Q0JTIwJTVDJTBBJTIwJTIwLS1tYXhfdHJhaW5fc3RlcHMlM0QzMDAwJTIwJTVDJTBBJTIwJTIwLS1sZWFybmluZ19yYXRlJTNENS4wZS0wNCUyMC0tc2NhbGVfbHIlMjAlNUMlMEElMjAlMjAtLWxyX3NjaGVkdWxlciUzRCUyMmNvbnN0YW50JTIyJTIwJTVDJTBBJTIwJTIwLS1scl93YXJtdXBfc3RlcHMlM0QwJTIwJTVDJTBBJTIwJTIwLS1vdXRwdXRfZGlyJTNEJTIydGV4dHVhbF9pbnZlcnNpb25fY2F0JTIyJTIwJTVDJTBBJTIwJTIwLS1wdXNoX3RvX2h1Yg==",highlighted:`<span class="hljs-built_in">export</span> MODEL_NAME=<span class="hljs-string">"stable-diffusion-v1-5/stable-diffusion-v1-5"</span> | |
| <span class="hljs-built_in">export</span> DATA_DIR=<span class="hljs-string">"./cat"</span> | |
| accelerate launch textual_inversion.py \\ | |
| --pretrained_model_name_or_path=<span class="hljs-variable">$MODEL_NAME</span> \\ | |
| --train_data_dir=<span class="hljs-variable">$DATA_DIR</span> \\ | |
| --learnable_property=<span class="hljs-string">"object"</span> \\ | |
| --placeholder_token=<span class="hljs-string">"<cat-toy>"</span> --initializer_token=<span class="hljs-string">"toy"</span> \\ | |
| --resolution=512 \\ | |
| --train_batch_size=1 \\ | |
| --gradient_accumulation_steps=4 \\ | |
| --max_train_steps=3000 \\ | |
| --learning_rate=5.0e-04 --scale_lr \\ | |
| --lr_scheduler=<span class="hljs-string">"constant"</span> \\ | |
| --lr_warmup_steps=0 \\ | |
| --output_dir=<span class="hljs-string">"textual_inversion_cat"</span> \\ | |
| --push_to_hub`,lang:"bash",wrap:!1});var n=a(t,2),h=a(H(n),2);l(h,{code:"LS1udW1fdmVjdG9ycyUzRDU=",highlighted:"--num_vectors=5",lang:"bash",wrap:!1}),P(n),r(o,e)}})},jax:(s,p)=>{u(s,{children:(o,f)=>{var e=ea(),t=a(d(e),4);l(t,{code:"cGlwJTIwaW5zdGFsbCUyMC1VJTIwLXIlMjByZXF1aXJlbWVudHNfZmxheC50eHQ=",highlighted:"pip install -U -r requirements_flax.txt",lang:"bash",wrap:!1});var n=a(t,6);l(n,{code:"ZXhwb3J0JTIwTU9ERUxfTkFNRSUzRCUyMmR1b25nbmElMkZzdGFibGUtZGlmZnVzaW9uLXYxLTQtZmxheCUyMiUwQWV4cG9ydCUyMERBVEFfRElSJTNEJTIyLiUyRmNhdCUyMiUwQSUwQXB5dGhvbiUyMHRleHR1YWxfaW52ZXJzaW9uX2ZsYXgucHklMjAlNUMlMEElMjAlMjAtLXByZXRyYWluZWRfbW9kZWxfbmFtZV9vcl9wYXRoJTNEJTI0TU9ERUxfTkFNRSUyMCU1QyUwQSUyMCUyMC0tdHJhaW5fZGF0YV9kaXIlM0QlMjREQVRBX0RJUiUyMCU1QyUwQSUyMCUyMC0tbGVhcm5hYmxlX3Byb3BlcnR5JTNEJTIyb2JqZWN0JTIyJTIwJTVDJTBBJTIwJTIwLS1wbGFjZWhvbGRlcl90b2tlbiUzRCUyMiUzQ2NhdC10b3klM0UlMjIlMjAtLWluaXRpYWxpemVyX3Rva2VuJTNEJTIydG95JTIyJTIwJTVDJTBBJTIwJTIwLS1yZXNvbHV0aW9uJTNENTEyJTIwJTVDJTBBJTIwJTIwLS10cmFpbl9iYXRjaF9zaXplJTNEMSUyMCU1QyUwQSUyMCUyMC0tbWF4X3RyYWluX3N0ZXBzJTNEMzAwMCUyMCU1QyUwQSUyMCUyMC0tbGVhcm5pbmdfcmF0ZSUzRDUuMGUtMDQlMjAtLXNjYWxlX2xyJTIwJTVDJTBBJTIwJTIwLS1vdXRwdXRfZGlyJTNEJTIydGV4dHVhbF9pbnZlcnNpb25fY2F0JTIyJTIwJTVDJTBBJTIwJTIwLS1wdXNoX3RvX2h1Yg==",highlighted:`<span class="hljs-built_in">export</span> MODEL_NAME=<span class="hljs-string">"duongna/stable-diffusion-v1-4-flax"</span> | |
| <span class="hljs-built_in">export</span> DATA_DIR=<span class="hljs-string">"./cat"</span> | |
| python textual_inversion_flax.py \\ | |
| --pretrained_model_name_or_path=<span class="hljs-variable">$MODEL_NAME</span> \\ | |
| --train_data_dir=<span class="hljs-variable">$DATA_DIR</span> \\ | |
| --learnable_property=<span class="hljs-string">"object"</span> \\ | |
| --placeholder_token=<span class="hljs-string">"<cat-toy>"</span> --initializer_token=<span class="hljs-string">"toy"</span> \\ | |
| --resolution=512 \\ | |
| --train_batch_size=1 \\ | |
| --max_train_steps=3000 \\ | |
| --learning_rate=5.0e-04 --scale_lr \\ | |
| --output_dir=<span class="hljs-string">"textual_inversion_cat"</span> \\ | |
| --push_to_hub`,lang:"bash",wrap:!1}),r(o,e)}})}}});var I=a(W,2);i(I,{title:"중간 로깅",local:"중간-로깅",headingTag:"h3"});var N=a(I,6);l(N,{code:"LS12YWxpZGF0aW9uX3Byb21wdCUzRCUyMkElMjAlM0NjYXQtdG95JTNFJTIwYmFja3BhY2slMjIlMEEtLW51bV92YWxpZGF0aW9uX2ltYWdlcyUzRDQlMEEtLXZhbGlkYXRpb25fc3RlcHMlM0QxMDA=",highlighted:`--validation_prompt=<span class="hljs-string">"A <cat-toy> backpack"</span> | |
| --num_validation_images=4 | |
| --validation_steps=100`,lang:"bash",wrap:!1});var R=a(N,2);i(R,{title:"추론",local:"추론",headingTag:"h2"});var G=a(R,6);B(G,{pytorch:!0,tensorflow:!1,jax:!0,$$slots:{pytorch:(s,p)=>{u(s,{children:(o,f)=>{var e=sa(),t=a(d(e),4);l(t,{code:"ZnJvbSUyMGRpZmZ1c2VycyUyMGltcG9ydCUyMFN0YWJsZURpZmZ1c2lvblBpcGVsaW5lJTBBaW1wb3J0JTIwdG9yY2glMEElMEFtb2RlbF9pZCUyMCUzRCUyMCUyMnN0YWJsZS1kaWZmdXNpb24tdjEtNSUyRnN0YWJsZS1kaWZmdXNpb24tdjEtNSUyMiUwQXBpcGUlMjAlM0QlMjBTdGFibGVEaWZmdXNpb25QaXBlbGluZS5mcm9tX3ByZXRyYWluZWQobW9kZWxfaWQlMkMlMjB0b3JjaF9kdHlwZSUzRHRvcmNoLmZsb2F0MTYpLnRvKCUyMmN1ZGElMjIp",highlighted:`<span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> StableDiffusionPipeline | |
| <span class="hljs-keyword">import</span> torch | |
| model_id = <span class="hljs-string">"stable-diffusion-v1-5/stable-diffusion-v1-5"</span> | |
| pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to(<span class="hljs-string">"cuda"</span>)`,lang:"python",wrap:!1});var n=a(t,4);l(n,{code:"cGlwZS5sb2FkX3RleHR1YWxfaW52ZXJzaW9uKCUyMnNkLWNvbmNlcHRzLWxpYnJhcnklMkZjYXQtdG95JTIyKQ==",highlighted:'pipe.load_textual_inversion(<span class="hljs-string">"sd-concepts-library/cat-toy"</span>)',lang:"python",wrap:!1});var h=a(n,4);l(h,{code:"cHJvbXB0JTIwJTNEJTIwJTIyQSUyMCUzQ2NhdC10b3klM0UlMjBiYWNrcGFjayUyMiUwQSUwQWltYWdlJTIwJTNEJTIwcGlwZShwcm9tcHQlMkMlMjBudW1faW5mZXJlbmNlX3N0ZXBzJTNENTApLmltYWdlcyU1QjAlNUQlMEFpbWFnZS5zYXZlKCUyMmNhdC1iYWNrcGFjay5wbmclMjIp",highlighted:`prompt = <span class="hljs-string">"A <cat-toy> backpack"</span> | |
| image = pipe(prompt, num_inference_steps=<span class="hljs-number">50</span>).images[<span class="hljs-number">0</span>] | |
| image.save(<span class="hljs-string">"cat-backpack.png"</span>)`,lang:"python",wrap:!1});var E=a(h,4);l(E,{code:"cGlwZS5sb2FkX3RleHR1YWxfaW52ZXJzaW9uKCUyMi4lMkZjaGFydHVybmVydjIucHQlMjIp",highlighted:'pipe.load_textual_inversion(<span class="hljs-string">"./charturnerv2.pt"</span>)',lang:"python",wrap:!1}),r(o,e)}})},jax:(s,p)=>{u(s,{children:(o,f)=>{var e=ta(),t=a(d(e),2);l(t,{code:"aW1wb3J0JTIwamF4JTBBaW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBZnJvbSUyMGZsYXguamF4X3V0aWxzJTIwaW1wb3J0JTIwcmVwbGljYXRlJTBBZnJvbSUyMGZsYXgudHJhaW5pbmcuY29tbW9uX3V0aWxzJTIwaW1wb3J0JTIwc2hhcmQlMEFmcm9tJTIwZGlmZnVzZXJzJTIwaW1wb3J0JTIwRmxheFN0YWJsZURpZmZ1c2lvblBpcGVsaW5lJTBBJTBBbW9kZWxfcGF0aCUyMCUzRCUyMCUyMnBhdGgtdG8teW91ci10cmFpbmVkLW1vZGVsJTIyJTBBcGlwZWxpbmUlMkMlMjBwYXJhbXMlMjAlM0QlMjBGbGF4U3RhYmxlRGlmZnVzaW9uUGlwZWxpbmUuZnJvbV9wcmV0cmFpbmVkKG1vZGVsX3BhdGglMkMlMjBkdHlwZSUzRGpheC5udW1weS5iZmxvYXQxNiklMEElMEFwcm9tcHQlMjAlM0QlMjAlMjJBJTIwJTNDY2F0LXRveSUzRSUyMGJhY2twYWNrJTIyJTBBcHJuZ19zZWVkJTIwJTNEJTIwamF4LnJhbmRvbS5QUk5HS2V5KDApJTBBbnVtX2luZmVyZW5jZV9zdGVwcyUyMCUzRCUyMDUwJTBBJTBBbnVtX3NhbXBsZXMlMjAlM0QlMjBqYXguZGV2aWNlX2NvdW50KCklMEFwcm9tcHQlMjAlM0QlMjBudW1fc2FtcGxlcyUyMColMjAlNUJwcm9tcHQlNUQlMEFwcm9tcHRfaWRzJTIwJTNEJTIwcGlwZWxpbmUucHJlcGFyZV9pbnB1dHMocHJvbXB0KSUwQSUwQSUyMyUyMHNoYXJkJTIwaW5wdXRzJTIwYW5kJTIwcm5nJTBBcGFyYW1zJTIwJTNEJTIwcmVwbGljYXRlKHBhcmFtcyklMEFwcm5nX3NlZWQlMjAlM0QlMjBqYXgucmFuZG9tLnNwbGl0KHBybmdfc2VlZCUyQyUyMGpheC5kZXZpY2VfY291bnQoKSklMEFwcm9tcHRfaWRzJTIwJTNEJTIwc2hhcmQocHJvbXB0X2lkcyklMEElMEFpbWFnZXMlMjAlM0QlMjBwaXBlbGluZShwcm9tcHRfaWRzJTJDJTIwcGFyYW1zJTJDJTIwcHJuZ19zZWVkJTJDJTIwbnVtX2luZmVyZW5jZV9zdGVwcyUyQyUyMGppdCUzRFRydWUpLmltYWdlcyUwQWltYWdlcyUyMCUzRCUyMHBpcGVsaW5lLm51bXB5X3RvX3BpbChucC5hc2FycmF5KGltYWdlcy5yZXNoYXBlKChudW1fc2FtcGxlcyUyQyklMjAlMkIlMjBpbWFnZXMuc2hhcGUlNUItMyUzQSU1RCkpKSUwQWltYWdlLnNhdmUoJTIyY2F0LWJhY2twYWNrLnBuZyUyMik=",highlighted:`<span class="hljs-keyword">import</span> jax | |
| <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">from</span> flax.jax_utils <span class="hljs-keyword">import</span> replicate | |
| <span class="hljs-keyword">from</span> flax.training.common_utils <span class="hljs-keyword">import</span> shard | |
| <span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> FlaxStableDiffusionPipeline | |
| model_path = <span class="hljs-string">"path-to-your-trained-model"</span> | |
| pipeline, params = FlaxStableDiffusionPipeline.from_pretrained(model_path, dtype=jax.numpy.bfloat16) | |
| prompt = <span class="hljs-string">"A <cat-toy> backpack"</span> | |
| prng_seed = jax.random.PRNGKey(<span class="hljs-number">0</span>) | |
| num_inference_steps = <span class="hljs-number">50</span> | |
| num_samples = jax.device_count() | |
| prompt = num_samples * [prompt] | |
| prompt_ids = pipeline.prepare_inputs(prompt) | |
| <span class="hljs-comment"># shard inputs and rng</span> | |
| params = replicate(params) | |
| prng_seed = jax.random.split(prng_seed, jax.device_count()) | |
| prompt_ids = shard(prompt_ids) | |
| images = pipeline(prompt_ids, params, prng_seed, num_inference_steps, jit=<span class="hljs-literal">True</span>).images | |
| images = pipeline.numpy_to_pil(np.asarray(images.reshape((num_samples,) + images.shape[-<span class="hljs-number">3</span>:]))) | |
| image.save(<span class="hljs-string">"cat-backpack.png"</span>)`,lang:"python",wrap:!1}),r(o,e)}})}}});var k=a(G,2);i(k,{title:"작동 방식",local:"작동-방식",headingTag:"h2"});var V=a(k,10);q(V,{source:"https://github.com/huggingface/diffusers/blob/main/docs/source/ko/training/text_inversion.md"}),$(2),r(F,m),D()}export{da as component}; | |
Xet Storage Details
- Size:
- 26.9 kB
- Xet hash:
- 8fe8e6524d57cdbd4997e890dcd094c0993848a7cd43f9a3282822adc3437228
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.