| | import torch |
| | from model.internlm_xcomposer.configuration_internlm_xcomposer2 import InternLMXcomposer2Config |
| | from model.internlm_xcomposer.modeling_internlm_xcomposer2 import InternLMXComposer2ForCausalLM |
| | from model.internlm_xcomposer.tokenization_internlm_xcomposer2 import InternLMXComposer2Tokenizer |
| | from peft import LoraConfig, get_peft_model |
| |
|
| | from .base import BaseModel |
| |
|
| | class InternLM(BaseModel): |
| | def __init__(self, **kwargs): |
| | super().__init__(**kwargs) |
| |
|
| | def load_model_tokenizer(self): |
| | config = InternLMXcomposer2Config.from_pretrained(self.model_path) |
| | config.use_cache = False |
| | config.max_length = self.training_args.max_length |
| | |
| | model = InternLMXComposer2ForCausalLM.from_pretrained( |
| | self.model_path, |
| | config=config, |
| | device_map=None, |
| | use_caption=self.use_caption |
| | ) |
| |
|
| | if self.data_args.img_size != 336: |
| | model.vit.resize_pos() |
| |
|
| | tokenizer_path = self.model_path if self.lora_args.lora_weight_path == '' \ |
| | else self.lora_args.lora_weight_path |
| | tokenizer = InternLMXComposer2Tokenizer.from_pretrained( |
| | tokenizer_path, |
| | padding_side='right', |
| | use_fast=False, |
| | ) |
| |
|
| | self.model = model |
| | self.tokenizer = tokenizer |
| |
|
| | def configure_training_args(self): |
| | training_args = self.training_args |
| | if training_args.fix_vit: |
| | self.model.vit.requires_grad_(False) |
| | else: |
| | self.model.vit.requires_grad_(True) |
| | self.model.vit.vision_tower.vision_model.post_layernorm = torch.nn.Identity() |
| |
|
| | if training_args.fix_sampler or self.use_caption: |
| | self.model.vision_proj.requires_grad_(False) |
| | else: |
| | self.model.vision_proj.requires_grad_(True) |
| |
|
| | def configure_peft(self): |
| | if not self.training_args.use_lora: |
| | for name, param in self.model.model.named_parameters(): |
| | if 'vision_cross' not in name: |
| | param.requires_grad = False |
| | return |
| | |
| | lora_args = self.lora_args |
| | if lora_args.lora_type == 'lora': |
| | for name, param in self.model.model.named_parameters(): |
| | if 'vision_cross' in name: |
| | continue |
| | param.requires_grad = False |
| | lora_config = LoraConfig( |
| | r=lora_args.lora_r, |
| | lora_alpha=lora_args.lora_alpha, |
| | target_modules=lora_args.lora_target_modules, |
| | lora_dropout=lora_args.lora_dropout, |
| | bias=lora_args.lora_bias, |
| | task_type='CAUSAL_LM', |
| | ) |
| |
|
| | self.model = get_peft_model(self.model, lora_config) |
| | elif lora_args.lora_type == 'plora': |
| | for name, param in self.model.model.named_parameters(): |
| | if 'Plora' not in name: |
| | param.requires_grad = False |
| |
|
| | if self.use_caption: |
| | if lora_args.lora_type == 'lora': |
| | self.model.model.vision_proj.requires_grad_(True) |
| | self.model.model.model.tok_embeddings.requires_grad_(True) |
| | self.model.model.logit_scale.requires_grad_(True) |
| | else: |
| | self.model.vision_proj.requires_grad_(True) |
| | self.model.model.tok_embeddings.requires_grad_(True) |
| | self.model.logit_scale.requires_grad_(True) |
| |
|
| | |
| | for name, param in self.model.model.named_parameters(): |
| | if 'vision_cross' in name: |
| | param.requires_grad = True |
| |
|
| | if self.training_args.gradient_checkpointing: |
| | self.model.enable_input_require_grads() |
| | |
| | self.model.model.vit.vision_tower.gradient_checkpointing_enable({"use_reentrant": True}) |
| |
|
| |
|
| | |
| |
|
| |
|