File size: 2,268 Bytes
039c272
 
dd7ff72
039c272
 
dd7ff72
039c272
dd7ff72
 
 
 
039c272
 
dd7ff72
039c272
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd7ff72
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import os
os.environ['HF_HOME'] = os.path.abspath("./.hf_cache")
import torch
from transformers import BlipProcessor, BlipForQuestionAnswering, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
import yaml

# Initialize the BLIP model and processor
config = yaml.safe_load(open("./config.yaml", "r"))
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model_id = config["finetune_model"]["orignal_model_id"]

def load_model_processor(model_path=model_id, use_quantization=True):
    print("Loading Model and Processor................")
    
    if use_quantization and torch.cuda.is_available() and device.type == "cuda":
        # Configure BitsAndBytes for 4-bit Quantization
        bnb_config = BitsAndBytesConfig(
            load_in_4bit=True,
            bnb_4bit_use_double_quant=True,
            bnb_4bit_quant_type="nf4",
            bnb_4bit_compute_dtype=torch.float16
        )
        
        # Load base model wrapped in 4-bit
        model = BlipForQuestionAnswering.from_pretrained(
            model_path, 
            quantization_config=bnb_config,
            device_map="auto"
        )
        
        # Prepares model for k-bit training and gradient checkpointing
        model = prepare_model_for_kbit_training(model)
        
        # Setup LoRA (Parameter Efficient Fine Tuning)
        # For Blip, common projection layers are query, value, key.
        lora_config = LoraConfig(
            r=16,
            lora_alpha=32,
            target_modules=["query", "value", "key"], 
            lora_dropout=0.05,
            bias="none",
            task_type="CAUSAL_LM" # BLIP uses a causal LM head for decoding
        )
        
        model = get_peft_model(model, lora_config)
        model.print_trainable_parameters()
        print("Model loaded with 4-bit quantization and LoRA adapters.")
    else:
        # Fallback to standard loading if no CUDA or quantization turned off
        model = BlipForQuestionAnswering.from_pretrained(model_path).to(device)
        print("Model loaded in full precision.")

    processor = BlipProcessor.from_pretrained(model_id)
    print(f"Model and Processor loaded successfully {model_path}  !!!")
    return model, processor