PEFT documentation
PEFT 구성 및 모델
PEFT 구성 및 모델
오늘날 대규모 사전 학습 모델은 일반적으로 수십억 개의 파라미터를 가지며, 이러한 방대한 규모는 모든 계산을 수행하는 데 더 많은 저장 공간과 계산력이 필요하기 때문에 상당한 학습 도전을 제기합니다. 이러한 대규모 사전 학습 모델을 학습하려면 강력한 GPU 또는 TPU에 접근할 수 있어야 하는데, 이는 비용이 많이 들고, 모든 사람이 쉽게 접근할 수 없으며, 환경 친화적이지도 않고, 실용적이지도 않습니다. PEFT 방법은 이러한 도전 과제 중 많은 부분을 해결합니다. PEFT 방법에는 여러 유형(soft prompting, matrix decomposition, adapters)이 있지만, 모두 동일한 목표, 즉 학습 가능한 파라미터의 수를 줄이는 데 초점을 맞춥니다. 이를 통해 소비자 하드웨어에서 대규모 모델을 학습하고 저장하는 것이 더 쉽게 가능해집니다.
PEFT 라이브러리는 무료 또는 저비용 GPU에서 대규모 모델을 빠르게 훈련할 수 있도록 설계되었습니다. 이 튜토리얼에서는 사전 학습된 베이스 모델에 PEFT 방법을 적용하여 훈련하기 위한 설정을 구성하는 방법을 학습합니다. PEFT 설정이 완료되면 원하는 훈련 프레임워크(Transformer의 Trainer 클래스, Accelerate, 사용자 정의 PyTorch 훈련 루프)를 사용할 수 있습니다.
PEFT 구성
각 PEFT 메서드에서 설정할 수 있는 파라미터에 대해서는 해당 API reference 페이지에서 자세히 알아보세요.
configuration는 특정 PEFT 방법을 적용하는 방식을 지정하는 중요한 매개변수를 저장합니다.
예를 들어, LoRA를 적용하기 위한 LoraConfig와 p-tuning을 적용하기 위한 PromptEncoderConfig를 확인해 보세요(이러한 설정 파일은 이미 JSON 직렬화되어 있습니다). PEFT 어댑터를 로드할 때, 필수적인 adapter_config.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를 초기화하여 학습을 위한 자체 구성을 만들 수 있습니다.
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
){
"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를 초기화하여 학습을 위한 자체 구성을 만들 수 있습니다.
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을 생성할 수 있습니다. Transformers 라이브러리의 최첨단 모델, 사용자 정의 모델, 그리고 새로운 또는 지원되지 않는 transformer 아키텍처 중 선택할 수 있습니다.
이 튜토리얼에서는 facebook/opt-350m 기반 모델을 로드하여 파인튜닝을 수행합니다.
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")lora_config을 사용하여 기본 facebook/opt-350m 모델에서 PeftModel을 생성하려면 get_peft_model() 함수를 사용하세요.
from peft import get_peft_model
lora_model = get_peft_model(model, lora_config)
lora_model.print_healthcheck()get_peft_model()을 호출하면 기본 모델이 in-place로 수정됩니다. 즉, 이미 동일한 방식으로 수정된 모델에 get_peft_model()을 호출하면 해당 모델이 추가로 변형됩니다. 따라서
get_peft_model()을 호출한 후 PEFT 구성을 수정하려면, 먼저 unload()로 모델을 언로드한 다음 새 구성으로get_peft_model()을 호출해야 합니다. 또는, 새로운 PEFT 구성을 적용하기 전에 모델이 수정되지 않은 새로운 상태를 유지하도록 모델을 다시 초기화할 수도 있습니다.
이제 선호하는 학습 프레임워크로 PeftModel을 학습할 수 있습니다. 학습이 완료되면 save_pretrained()를 사용하여 모델을 로컬에 저장하거나 push_to_hub 메서드를 사용하여 Hub에 업로드할 수 있습니다.
# 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을 로드하려면, 해당 모델을 생성할 때 사용된 PeftConfig와 학습의 기반이 된 베이스 모델을 제공해야 합니다.
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")기본적으로 PeftModel은 추론을 위해 설정되어 있지만, 어댑터를 더 학습하려면
is_trainable=True로 설정할 수 있습니다.lora_model = PeftModel.from_pretrained(model, "ybelkada/opt-350m-lora", is_trainable=True)
PeftModel.from_pretrained() 메서드는 어떤 모델 프레임워크(Transformers, timm, 일반적인 PyTorch 모델)를 사용했는지와 무관하게 PeftModel을 로드할 수 있어 가장 유연한 방법입니다. AutoPeftModel와 같은 다른 클래스들은 기본적으로 PeftModel을 감싸는 편리한 래퍼일 뿐이며, PEFT 가중치가 저장된 Hub 또는 로컬에서 PEFT 모델을 직접 로드하는 것을 더 쉽게 만들어 줍니다.
from peft import AutoPeftModelForCausalLM
lora_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")AutoPeftModel 클래스에 대해 자세히 알아보려면 AutoPeftModel API 참고 문서를 확인하세요.
다음 단계
적절한 PeftConfig를 사용하면 사전 학습된 모델에 적용하여 PeftModel을 생성하고, 무료로 제공되는 GPU에서 대규모 고성능 모델을 더 빠르게 학습할 수 있습니다. PEFT 구성 및 모델에 대해 자세히 알아보려면 다음 가이드가 도움이 될 수 있습니다:
- Transformers가 아닌 모델에 PEFT 방법을 구성하는 방법은 커스텀 모델 작업 가이드에서 확인하세요.