| | |
| | | import torch |
| | | import torch.nn |
| | | import torch.optim |
| | | |
| | | import pdb |
| | | |
| | | def filter_state_dict( |
| | | dst_state: Dict[str, Union[float, torch.Tensor]], |
| | |
| | | ignore_init_mismatch: bool=True, |
| | | map_location: str = "cpu", |
| | | oss_bucket=None, |
| | | scope_map="module.:none", |
| | | scope_map=[], |
| | | excludes=None, |
| | | ignore_mismatch=False, |
| | | **kwargs, |
| | |
| | | dst_state = obj.state_dict() |
| | | |
| | | print(f"ckpt: {path}") |
| | | |
| | | if oss_bucket is None: |
| | | src_state = torch.load(path, map_location=map_location) |
| | | else: |
| | | buffer = BytesIO(oss_bucket.get_object(path).read()) |
| | | src_state = torch.load(buffer, map_location=map_location) |
| | | if "state_dict" in src_state: |
| | | src_state = src_state["state_dict"] |
| | | |
| | | |
| | | src_state = src_state["state_dict"] if "state_dict" in src_state else src_state |
| | | src_state = src_state["model_state_dict"] if "model_state_dict" in src_state else src_state |
| | | src_state = src_state["model"] if "model" in src_state else src_state |
| | | |
| | | if isinstance(scope_map, str): |
| | | scope_map = scope_map.split(",") |
| | | scope_map += ["module.", "None"] |
| | | |
| | | for k in dst_state.keys(): |
| | | |
| | |
| | | for i in range(0, len(scope_map), 2): |
| | | src_prefix = scope_map[i] if scope_map[i].lower() != "none" else "" |
| | | dst_prefix = scope_map[i+1] if scope_map[i+1].lower() != "none" else "" |
| | | |
| | | if k.startswith(dst_prefix) and k.replace(dst_prefix, src_prefix) in src_state.keys(): |
| | | k_src = k.replace(dst_prefix, src_prefix) |
| | | print(f"init param, map: {k} from {k_src} in ckpt") |
| | | |
| | | if dst_prefix == "" and (src_prefix + k) in src_state.keys(): |
| | | k_src = src_prefix + k |
| | | if not k_src.startswith("module."): |
| | | print(f"init param, map: {k} from {k_src} in ckpt") |
| | | elif k.startswith(dst_prefix) and k.replace(dst_prefix, src_prefix, 1) in src_state.keys(): |
| | | k_src = k.replace(dst_prefix, src_prefix, 1) |
| | | if not k_src.startswith("module."): |
| | | print(f"init param, map: {k} from {k_src} in ckpt") |
| | | |
| | | if k_src in src_state.keys(): |
| | | if ignore_init_mismatch and dst_state[k].shape != src_state[k_src].shape: |