토니의 연습장

MLLM 구현 본문

언어 AI (NLP)/Multimodal (MLLM, LMM)

MLLM 구현

bellmake 2025. 5. 26. 17:38

참고 : 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