# PEFT 구성 및 모델

오늘날 대규모 사전 학습 모델은 일반적으로 수십억 개의 파라미터를 가지며, 이러한 방대한 규모는 모든 계산을 수행하는 데 더 많은 저장 공간과 계산력이 필요하기 때문에 상당한 학습의 도전 과제를 제시합니다. 이러한 대규모 사전 학습 모델을 학습하려면 강력한 GPU 또는 TPU에 접근할 수 있어야 하는데, 이는 비용이 많이 들고, 모든 사람이 쉽게 접근할 수 없으며, 환경 친화적이지도 않고, 실용적이지도 않습니다. PEFT 방법은 이러한 도전 과제 중 많은 부분을 해결합니다. PEFT 방법에는 여러 유형(soft prompting, matrix decomposition, adapters)이 있지만, 모두 동일한 목표, 즉 학습 가능한 파라미터의 수를 줄이는 데 초점을 맞춥니다. 이를 통해 소비자 하드웨어에서 대규모 모델을 학습하고 저장하는 것이 더 쉽게 가능해집니다.

PEFT 라이브러리는 무료 또는 저비용 GPU에서 대규모 모델을 빠르게 훈련할 수 있도록 설계되었습니다. 이 튜토리얼에서는 사전 학습된 베이스 모델에 PEFT 방법을 적용하여 훈련하기 위한 설정을 구성하는 방법을 학습합니다. PEFT 설정이 완료되면 원하는 훈련 프레임워크(Transformer의 [Trainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer) 클래스, [Accelerate](https://hf.co/docs/accelerate), 사용자 정의 PyTorch 훈련 루프)를 사용할 수 있습니다.

## PEFT 구성

> [!TIP]
> 각 PEFT 메서드에서 설정할 수 있는 파라미터에 대해서는 해당 API reference 페이지에서 자세히 알아보세요.

configuration는 특정 PEFT 방법을 적용하는 방식을 지정하는 중요한 매개변수를 저장합니다.

예를 들어, LoRA를 적용하기 위한 `LoraConfig`와 p-tuning을 적용하기 위한 `PromptEncoderConfig`를 확인해 보세요(이러한 설정 파일은 이미 JSON 직렬화되어 있습니다). PEFT 어댑터를 로드할 때, 필수적인 `adapter_config.json` 파일이 함께 있는지 확인하는 것이 좋습니다.

```json
{
  "base_model_name_or_path": "facebook/opt-350m", #base model to apply LoRA to
  "bias": "none",
  "fan_in_fan_out": false,
  "inference_mode": true,
  "init_lora_weights": true,
  "layers_pattern": null,
  "layers_to_transform": null,
  "lora_alpha": 32,
  "lora_dropout": 0.05,
  "modules_to_save": null,
  "peft_type": "LORA", #PEFT method type
  "r": 16,
  "revision": null,
  "target_modules": [
    "q_proj", #model modules to apply LoRA to (query and value projection layers)
    "v_proj"
  ],
  "task_type": "CAUSAL_LM" #type of task to train model on
}
```

[LoraConfig](/docs/peft/main/ko/package_reference/lora#peft.LoraConfig)를 초기화하여 학습을 위한 자체 구성을 만들 수 있습니다.

```py
from peft import LoraConfig, TaskType

lora_config = LoraConfig(
    r=16,
    target_modules=["q_proj", "v_proj"],
    task_type=TaskType.CAUSAL_LM,
    lora_alpha=32,
    lora_dropout=0.05
)
```

```json
{
  "base_model_name_or_path": "roberta-large", #base model to apply p-tuning to
  "encoder_dropout": 0.0,
  "encoder_hidden_size": 128,
  "encoder_num_layers": 2,
  "encoder_reparameterization_type": "MLP",
  "inference_mode": true,
  "num_attention_heads": 16,
  "num_layers": 24,
  "num_transformer_submodules": 1,
  "num_virtual_tokens": 20,
  "peft_type": "P_TUNING", #PEFT method type
  "task_type": "SEQ_CLS", #type of task to train model on
  "token_dim": 1024
}
```

[PromptEncoderConfig](/docs/peft/main/ko/package_reference/p_tuning#peft.PromptEncoderConfig)를 초기화하여 학습을 위한 자체 구성을 만들 수 있습니다.

```py
from peft import PromptEncoderConfig, TaskType

p_tuning_config = PromptEncoderConfig(
    encoder_reparameterization_type="MLP",
    encoder_hidden_size=128,
    num_attention_heads=16,
    num_layers=24,
    num_transformer_submodules=1,
    num_virtual_tokens=20,
    token_dim=1024,
    task_type=TaskType.SEQ_CLS
)
```

## PEFT 모델

PEFT 구성을 갖추면 이제 이를 사전 학습된 모델에 적용하여 [PeftModel](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel)을 생성할 수 있습니다. [Transformers](https://hf.co/docs/transformers) 라이브러리의 최첨단 모델, 사용자 정의 모델, 그리고 새로운 또는 지원되지 않는 transformer 아키텍처 중 선택할 수 있습니다.

이 튜토리얼에서는 [facebook/opt-350m](https://huggingface.co/facebook/opt-350m) 기반 모델을 로드하여 파인튜닝을 수행합니다.

```py
from transformers import AutoModelForCausalLM

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

`lora_config`을 사용하여 기본 facebook/opt-350m 모델에서 [PeftModel](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel)을 생성하려면 [get_peft_model()](/docs/peft/main/ko/package_reference/peft_model#peft.get_peft_model) 함수를 사용하세요.

```py
from peft import get_peft_model

lora_model = get_peft_model(model, lora_config)
lora_model.print_healthcheck()
```

> [!WARNING]
> [get_peft_model()](/docs/peft/main/ko/package_reference/peft_model#peft.get_peft_model)을 호출하면 기본 모델이 *in-place*로 수정됩니다. 즉, 이미 동일한 방식으로 수정된 모델에 [get_peft_model()](/docs/peft/main/ko/package_reference/peft_model#peft.get_peft_model)을 호출하면 해당 모델이 추가로 변형됩니다. 따라서 `get_peft_model()`을 호출한 후 PEFT 구성을 수정하려면, 먼저 [unload()](/docs/peft/main/ko/package_reference/tuners#peft.tuners.tuners_utils.BaseTuner.unload)로 모델을 언로드한 다음 새 구성으로 `get_peft_model()`을 호출해야 합니다. 또는, 새로운 PEFT 구성을 적용하기 전에 모델이 수정되지 않은 새로운 상태를 유지하도록 모델을 다시 초기화할 수도 있습니다.

이제 선호하는 학습 프레임워크로 [PeftModel](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel)을 학습할 수 있습니다. 학습이 완료되면 [save_pretrained()](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel.save_pretrained)를 사용하여 모델을 로컬에 저장하거나 [push_to_hub](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel.push_to_hub) 메서드를 사용하여 Hub에 업로드할 수 있습니다.

```py
# save locally
lora_model.save_pretrained("your-name/opt-350m-lora")

# push to Hub
lora_model.push_to_hub("your-name/opt-350m-lora")
```

추론을 위해 [PeftModel](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel)을 로드하려면, 해당 모델을 생성할 때 사용된 [PeftConfig](/docs/peft/main/ko/package_reference/config#peft.PeftConfig)와 학습의 기반이 된 베이스 모델을 제공해야 합니다.

```py
from peft import PeftModel, PeftConfig

config = PeftConfig.from_pretrained("ybelkada/opt-350m-lora")
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path)
lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora")
```

> [!TIP]
> 기본적으로 [PeftModel](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel)은 추론을 위해 설정되어 있지만, 어댑터를 더 학습하려면 `is_trainable=True`로 설정할 수 있습니다.
>
> ```py
> lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora", is_trainable=True)
> ```

[PeftModel.from_pretrained()](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel.from_pretrained) 메서드는 어떤 모델 프레임워크(Transformers, timm, 일반적인 PyTorch 모델)를 사용했는지와 무관하게 [PeftModel](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel)을 로드할 수 있어 가장 유연한 방법입니다. [AutoPeftModel](/docs/peft/main/ko/package_reference/auto_class#peft.AutoPeftModel)와 같은 다른 클래스들은 기본 [PeftModel](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel)을 감싼 편리한 래퍼일 뿐이며, PEFT 가중치가 저장된 Hub 또는 로컬에서 PEFT 모델을 직접 로드하는 것을 더 쉽게 만들어 줍니다.

```py
from peft import AutoPeftModelForCausalLM

lora_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
```

[AutoPeftModel](../package_reference/auto_class) 클래스에 대해 자세히 알아보려면 [AutoPeftModel](/docs/peft/main/ko/package_reference/auto_class#peft.AutoPeftModel) API 참고 문서를 확인하세요.

## 다음 단계

적절한 [PeftConfig](/docs/peft/main/ko/package_reference/config#peft.PeftConfig)를 사용하면 사전 학습된 모델에 적용하여 [PeftModel](/docs/peft/main/ko/package_reference/peft_model#peft.PeftModel)을 생성하고, 무료로 제공되는 GPU에서 대규모 고성능 모델을 더 빠르게 학습할 수 있습니다. PEFT 구성 및 모델에 대해 자세히 알아보려면 다음 가이드가 도움이 될 수 있습니다:

* Transformers가 아닌 모델에 PEFT 방법을 구성하는 방법은 [커스텀 모델 사용](../developer_guides/custom_models) 가이드에서 확인하세요.

