https://huggingface.co/docs/peft/package_reference/adalora#peft.AdaLoraConfig.tfinal
AdaLoRA
🤗 Accelerate integrations
huggingface.co
안녕하세요
오늘은 Hugging face의 PEFT중 한 기법인 AdaLora를 활용해 원하는 Layer만 파인튜닝을 하는 방법을 소개해드리려고 합니당
실제로 연구를 하다보면 Pretrained model을 가져와서 사용할 때 특정 layer만 조작해주고 싶을 때가 있는데,
이걸 target_modules 로 한번에 q, k, v로 설정해주면 모든 transformer를 다 파인튜닝 해버려 곤란하기도 합니다
예를 들어 encoder-decoder model이 있을 때, encoder만 finetuning 하고 싶을 경우 적용할 수 있는 방안에 대해서 소개시켜드리려고 합니다.
우선 AdaLoraConfig를 보면,
config = AdaLoraConfig(
beta1=0.85,
beta2=0.85,
target_modules = get_encoder_layer_names(6, sublayers)
)
이와 같이 target_modules인자가 존재하는데요.
여기에 원하는 k, q, v값을 넣어서 그 부분만 AdaLora를 적용해줄 수 있습니다.
근데 target_modules에 정확히 어떤 인자가 들어가야 하는지
hugging face의 document를 보아도
정보가 잘 나와있지 않습니다.
그래서 제가 했던 방법을 소개시켜드리고자 합니다.
우선 print(model)을 했을 때 나온, 그 안 layer들을 가져와주어야 하는데요
sublayers = [
'self_attn.k_proj',
'self_attn.v_proj',
'self_attn.q_proj',
'self_attn.out_proj',
'fc1',
'fc2'
]
def get_encoder_layer_names(num_layers, sublayers): #pretrained layer 수, 파인튜닝 하고자 하는 layer 이름
names = []
for i in range(num_layers):
for sublayer in sublayers:
name = f'encoder.layers.{i}.{sublayer}' # 원하는 module layer 작성
names.append(name)
return names
# 저의 경우 Whisper-base 모델을 활용하였습니다.
get_encoder_layer_names(6, sublayers)
위처럼 get_encoder_layer_names의 customize함수에 원하는 layer이름을 넣어줍니다.
저의 경우 encoder만 넣고 싶으니 encoder.layer~~ 이하로 설정 해주었습니다.
이후
config = AdaLoraConfig(
beta1=0.85,
beta2=0.85,
target_modules = get_encoder_layer_names(6, sublayers)
)
model = get_peft_model(model, config, "default")
를 설정해주면
아래 그림과 같이 원하는 Layer에만 adaLora가 설정된 것을 확인할 수 있습니다!!!
오늘은 파인튜닝 하다가 실제로 많이 접해볼 예제를 다루어보았는데요!
도움이 되셨으면 좋겠습니다.
오늘의 포스팅 끗 ~!

'Deep-Learning' 카테고리의 다른 글
[RNN/LSTM/GRU] 순환 신경망 기반 Network 정리 (1) | 2023.07.16 |
---|---|
Diffusion Counterfactual explanations (0) | 2023.05.06 |
[GAN] GAN 및 DCGAN 개념설명 (0) | 2023.01.15 |