target_modules는 LoRA를 모델의 어느 레이어에 적용할지 지정하는 옵션이다.
LoRA는 모델 전체에 적용되는 것이 아니라 특정 가중치 행렬(Linear Layer)에만 적용된다.
예를 들어 다음과 같이 설정할 수 있다.
from peft import LoraConfig
config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"]
)
위 설정에서는 LoRA가 다음 레이어에만 적용된다.
q_projv_proj나머지 레이어는 기존 가중치를 그대로 사용한다.
Transformer 모델에는 매우 많은 가중치 행렬이 존재한다.
Self-Attention 구조를 예로 들면 다음과 같다.
Input
↓
Q Projection (q_proj)
K Projection (k_proj)
V Projection (v_proj)
↓
Attention
↓
Output Projection (o_proj)
각 Projection은 대규모 행렬로 구성되어 있다.
만약 모든 가중치에 LoRA를 적용한다면:
와 같은 문제가 발생한다.
따라서 LoRA를 적용할 핵심 레이어만 선택하여 효율적으로 학습하는 것이 일반적이다.
Llama 계열 모델에서는 다음 설정이 가장 널리 사용된다.
target_modules=[
"q_proj",
"v_proj"
]
이는 Query와 Value Projection에만 LoRA를 적용하는 방식이다.
LoRA 원 논문에서도 Attention 관련 행렬만 수정해도 상당한 성능 향상을 얻을 수 있음을 보여주었다.
Attention의 모든 Projection에 적용할 수도 있다.
target_modules=[
"q_proj",
"k_proj",
"v_proj",
"o_proj"
]
이 경우 Attention 모듈 전체를 튜닝하게 된다.
최근에는 MLP 영역까지 포함하여 LoRA를 적용하는 경우도 많다.
target_modules=[
"q_proj",
"k_proj",
"v_proj",
"o_proj",
"gate_proj",
"up_proj",
"down_proj"
]
이 설정은 Llama 계열 모델의 주요 Linear Layer 대부분을 학습 대상으로 포함한다.
Llama 모델에서는 일반적으로 다음과 같은 이름을 사용한다.
self_attn.q_proj
self_attn.k_proj
self_attn.v_proj
self_attn.o_proj
mlp.gate_proj
mlp.up_proj
mlp.down_proj
따라서:
target_modules=["q_proj", "v_proj"]
와 같이 지정하면 모델 내부의 모든 q_proj, v_proj 레이어에 LoRA가 자동 적용된다.
target_modules는 모델 구조에 따라 달라진다.
q_proj
k_proj
v_proj
o_proj
c_attn
c_proj
query
key
value
따라서 사용 중인 모델의 레이어 이름을 먼저 확인해야 한다.
다음 코드를 사용하면 모델 내부의 모듈 이름을 확인할 수 있다.
for name, module in model.named_modules():
print(name)
예를 들어 다음과 같은 결과가 출력될 수 있다.
model.layers.0.self_attn.q_proj
model.layers.0.self_attn.k_proj
model.layers.0.self_attn.v_proj
이 경우 다음과 같이 설정할 수 있다.
target_modules=[
"q_proj",
"k_proj",
"v_proj"
]
all-linear 옵션최신 PEFT에서는 모든 Linear Layer를 자동으로 선택하는 옵션도 제공한다.
target_modules="all-linear"
예시:
config = LoraConfig(
r=16,
lora_alpha=32,
target_modules="all-linear"
)
이 설정을 사용하면 모델 내의 모든 Linear Layer에 LoRA가 적용된다.
target_modules=[
"q_proj",
"v_proj"
]
특징:
target_modules=[
"q_proj",
"k_proj",
"v_proj",
"o_proj",
"gate_proj",
"up_proj",
"down_proj"
]
특징:
target_modules는 LoRA를 적용할 레이어를 지정하는 옵션이다.
LoRA는 모델 전체를 수정하지 않고 특정 가중치 행렬에만 저차원 어댑터를 추가하기 때문에 효율적인 학습이 가능하다.
Llama 계열에서는 일반적으로 다음 두 가지 방식이 많이 사용된다.
target_modules=["q_proj", "v_proj"]
또는
target_modules=[
"q_proj",
"k_proj",
"v_proj",
"o_proj",
"gate_proj",
"up_proj",
"down_proj"
]
적용 대상 레이어가 많아질수록 성능 향상을 기대할 수 있지만, 그만큼 메모리 사용량과 학습 비용도 증가한다.