토니의 연습장
MLLM 구현 본문
참고 : https://starknotes.tistory.com/202
MiniGPT-4
MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language ModelsThe recent GPT-4 has demonstrated extraordinary multi-modal abilities, such as directly generating websites from handwritten text and identifying humorous elements within
starknotes.tistory.com
class MultimodalProjector(nn.Module):
def __init__(self, image_embedding_dim, text_embedding_dim, hidden_dim=None, activation=nn.ReLU, normalization=True):
"""
"""
super(MultimodalProjector, self).__init__()
layers = []
if hidden_dim is not None:
# If hidden dim specified, use 2-layer projection
layers.append(nn.Linear(image_embedding_dim, hidden_dim))
if activation is not None:
layers.append(activation())
layers.append(nn.Linear(hidden_dim, text_embedding_dim))
else:
# If no hidden dim, use single linear layer
layers.append(nn.Linear(image_embedding_dim, text_embedding_dim))
self.projector = nn.Sequential(*layers)
self.normalization = normalization
참고) LoRA parameter 들만 남기고 다른 모델들은 전부 freeze 하는 법
def prime_model(self, stage="one"):
if stage == "one":
# freeze all models except vision adpater
for param in self.vision_model.parameters():
param.requires_grad = False
for param in self.text_model.parameters():
param.requires_grad = False
# only train vision adapter
for param in self.vision_adapter.parameters():
param.requires_grad =True
else:
# Stage two - unfreeze all models
# Unfreeze all models
for param in self.vision_model.parameters():
param.requires_grad = False
for param in self.text_model.parameters():
param.requires_grad = False
for param in self.vision_adapter.parameters():
param.requires_grad = False
# Unfreeze LoRA layers
for name, param in self.vision_model.named_parameters():
if "lora" in name:
param.requires_grad = True
for name, param in self.text_model.named_parameters():
if "lora" in name:
param.requires_grad = True
for name, param in self.vision_adapter.named_parameters():
if "lora" in name:
param.requires_grad = True
왜 named_parameters()를 LoRA에서 쓰는가?
LoRA 파라미터는 일반적으로 이름에 "lora"라는 문자열이 포함되어 있습니다.
예: "transformer.blocks.0.attn.q_proj.lora_A.weight"
따라서 다음과 같은 필터링이 가능하죠:
for name, param in model.named_parameters():
if "lora" in name:
param.requires_grad = True
이걸 parameters()로만 처리하면 name이 없기 때문에 "lora" 여부를 판단할 수 없습니다.
결론
for param in model.parameters(): ...
- 이름 없이 파라미터만 다룰 때 (예: 전체 freeze)
for name, param in model.named_parameters(): ...
- 파라미터 이름에 따라 조건 분기하거나 특정 파라미터만 선택적으로 조작할 때 사용
- 예: "lora"가 이름에 포함된 파라미터만 requires_grad = True로 설정
따라서 LoRA처럼 일부 파라미터만 학습 가능하게 만들고 싶을 때는 named_parameters()가 필수입니다.
'언어 AI (NLP) > Multimodal (MLLM, LMM)' 카테고리의 다른 글
BLIP / CLIP (3) | 2025.07.17 |
---|---|
MLLM / LMM (0) | 2025.04.07 |