File size: 2,497 Bytes
3e936b2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import torch
import peft
from peft import get_peft_model_state_dict
from torch.distributed.fsdp import FullyShardedDataParallel as FSDP
from torch.distributed.fsdp import StateDictType, FullStateDictConfig

def configure_lora_for_model(transformer, model_name, lora_config, is_main_process=True):
    target_linear_modules = set()
    if model_name == 'generator':
        adapter_target_modules = ['CausalWanAttentionBlock']
    elif model_name == 'fake_score':
        adapter_target_modules = ['WanAttentionBlock']
    else:
        raise ValueError(f'Invalid model name: {model_name}')
    for name, module in transformer.named_modules():
        if module.__class__.__name__ in adapter_target_modules:
            for full_submodule_name, submodule in module.named_modules(prefix=name):
                if isinstance(submodule, torch.nn.Linear):
                    target_linear_modules.add(full_submodule_name)
    target_linear_modules = list(target_linear_modules)
    if is_main_process:
        print(f'LoRA target modules for {model_name}: {len(target_linear_modules)} Linear layers')
        if getattr(lora_config, 'verbose', False):
            for module_name in sorted(target_linear_modules):
                print(f'  - {module_name}')
    adapter_type = lora_config.get('type', 'lora')
    if adapter_type == 'lora':
        peft_config = peft.LoraConfig(r=lora_config.get('rank', 16), lora_alpha=lora_config.get('alpha', None) or lora_config.get('rank', 16), lora_dropout=lora_config.get('dropout', 0.0), target_modules=target_linear_modules)
    else:
        raise NotImplementedError(f'Adapter type {adapter_type} is not implemented')
    lora_model = peft.get_peft_model(transformer, peft_config)
    if is_main_process:
        print('peft_config', peft_config)
        lora_model.print_trainable_parameters()
    return lora_model

def gather_lora_state_dict(lora_model):
    with FSDP.state_dict_type(lora_model, StateDictType.FULL_STATE_DICT, FullStateDictConfig(rank0_only=True, offload_to_cpu=True)):
        full = lora_model.state_dict()
    return get_peft_model_state_dict(lora_model, state_dict=full)

def load_lora_checkpoint(lora_model, lora_state_dict, model_name, is_main_process=True):
    if is_main_process:
        print(f'Loading LoRA {model_name} weights: {len(lora_state_dict)} keys in checkpoint')
    peft.set_peft_model_state_dict(lora_model, lora_state_dict)
    if is_main_process:
        print(f'LoRA {model_name} weights loaded successfully')