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가 설정된 것을 확인할 수 있습니다!!! 

 

오늘은 파인튜닝 하다가 실제로 많이 접해볼 예제를 다루어보았는데요!

도움이 되셨으면 좋겠습니다. 

오늘의 포스팅 끗 ~!

+ Recent posts