PEFT documentation

PEFT 통합

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

PEFT 통합

PEFT의 실용적 이점은 Diffusers와 Transformers와 같은 다른 Hugging Face 라이브러리에도 확장됩니다. PEFT의 주요 이점 중 하나는 PEFT 메서드로 생성된 어댑터 파일이 원래 모델보다 훨씬 작다는 점으로, 이를 통해 여러 어댑터를 관리하고 사용하는 것이 매우 쉬워집니다. 단순히 해결하려는 작업에 맞게 파인튜닝된 새로운 어댑터를 로드함으로써 하나의 사전 학습된 베이스 모델을 여러 작업에 사용할 수 있습니다. 또는 텍스트-이미지 확산 모델에 여러 어댑터를 결합하여 새로운 효과를 만들 수도 있습니다.

이 튜토리얼에서는 PEFT가 Diffusers와 Transformers에서 어댑터를 관리하는 데 어떻게 도움이 되는지 보여줍니다.

Diffusers

Diffusers는 diffusion 모델을 사용하여 텍스트 또는 이미지에서 이미지와 영상을 생성하는 생성형 AI 라이브러리입니다. LoRA는 diffusion 모델에 새로운 스타일의 이미지를 생성하도록 모델을 매우 빠르게 학습하고 공유할 수 있기 때문에 diffusion 모델에서 특히 인기 있는 학습 방법입니다. 여러 LoRA 모델을 더 쉽게 사용하고 시도할 수 있도록, Diffusers는 추론을 위한 다양한 어댑터 관리를 돕기 위해 PEFT 라이브러리를 사용합니다.

예를 들어, 베이스 모델을 로드한 다음 load_lora_weights 메서드를 사용하여 추론을 위해 artificialguybr/3DRedmond-V1 어댑터를 로드할 수 있습니다. 로드 메서드의 adapter_name 인수는 PEFT에 의해 활성화되며, 어댑터에 이름을 지정하여 참조하기 쉽게 해줍니다.

import torch
from diffusers import DiffusionPipeline

device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to(device)
pipeline.load_lora_weights(
    "peft-internal-testing/artificialguybr__3DRedmond-V1", 
    weight_name="3DRedmond-3DRenderStyle-3DRenderAF.safetensors", 
    adapter_name="3d"
)
image = pipeline("sushi rolls shaped like kawaii cat faces").images[0]
image

이제 또 다른 멋진 LoRA 모델인 ostris/super-cereal-sdxl-lora를 사용해 보겠습니다. adapter_name으로 이 새로운 어댑터를 로드하고 이름을 지정한 후, set_adapters 메서드를 사용해 현재 활성 어댑터로 설정하기만 하면 됩니다.

pipeline.load_lora_weights(
    "ostris/super-cereal-sdxl-lora", 
    weight_name="cereal_box_sdxl_v1.safetensors", 
    adapter_name="cereal"
)
pipeline.set_adapters("cereal")
image = pipeline("sushi rolls shaped like kawaii cat faces").images[0]
image

마지막으로, disable_lora 메서드를 호출하여 기본 모델로 복원할 수 있습니다.

pipeline.disable_lora()

PEFT가 Diffusers를 어떻게 지원하는지에 대한 자세한 내용은 Inference with PEFT 튜토리얼에서 확인하세요.

Transformers

🤗 Transformers는 모든 모달리티의 모든 유형의 작업을 위한 사전 학습 모델 모음입니다. 이러한 모델을 학습 또는 추론에 사용할 수 있습니다. 많은 모델이 대규모 언어 모델(LLM)이므로, 어댑터를 관리하고 학습하기 위해 PEFT를 Transformers와 통합하는 것이 합리적입니다.

학습할 기본 사전 학습 모델을 로드합니다.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")

다음으로, 모델 파라미터를 어떻게 적응시킬지 지정하기 위해 어댑터 구성을 추가합니다. 기본 모델에 구성을 추가하려면 add_adapter() 메서드를 호출합니다.

from peft import LoraConfig

peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM"
)
model.add_adapter(peft_config)

이제 Transformers의 Trainer 클래스나 선호하는 학습 프레임워크를 사용하여 모델을 학습시킬 수 있습니다.

새로 학습한 모델을 추론에 사용하려면, AutoModel 클래스는 백엔드에서 PEFT를 사용하여 어댑터 가중치와 구성 파일을 기본 사전학습 모델에 로드합니다.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("peft-internal-testing/opt-350m-lora")

대신, 추론을 간편하게 실행하기 위해 모델을 로드하려면 Pipelines를 사용할 수 있습니다:

from transformers import pipeline

model = pipeline("text-generation", "peft-internal-testing/opt-350m-lora")
print(model("Hello World"))

여러 어댑터를 비교하거나 함께 사용하려면 add_adapter() 메서드를 호출하여 기본 모델에 어댑터 구성을 추가할 수 있습니다. 유일한 요구 사항은 어댑터 유형이 동일해야 한다는 것입니다(LoRA와 LoHa 어댑터를 혼합할 수 없습니다).

from transformers import AutoModelForCausalLM
from peft import LoraConfig

model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")
model.add_adapter(lora_config_1, adapter_name="adapter_1")

기본 모델에 새 어댑터를 연결하려면 add_adapter()를 다시 호출하세요.

model.add_adapter(lora_config_2, adapter_name="adapter_2")

이후 set_adapter()를 사용하여 현재 활성화된 어댑터를 설정할 수 있습니다.

model.set_adapter("adapter_1")
output = model.generate(**inputs)
print(tokenizer.decode(output_disabled[0], skip_special_tokens=True))

어댑터를 비활성화하려면 disable_adapters 메서드를 호출하세요.

model.disable_adapters()

enable_adapters를 사용하면 어댑터를 다시 활성화할 수 있습니다.

궁금하시다면 PEFT로 어댑터 로드 및 학습 튜토리얼을 참고해 보세요.

Update on GitHub