CoolFace
Apppublic

ShalomKing/infinitetalk

sourceHugging Faceapache-2.0updated 10mo agoView on Hugging Face
1likes
utils.py60 linesDownload Raw Back to src
1from contextlib import contextmanager2 3import torch4 5@contextmanager6def init_weights_on_device(device=torch.device("meta"), include_buffers: bool = False):7    old_register_parameter = torch.nn.Module.register_parameter8    if include_buffers:9        old_register_buffer = torch.nn.Module.register_buffer10 11    def register_empty_parameter(module, name, param):12        old_register_parameter(module, name, param)13        if param is not None:14            param_cls = type(module._parameters[name])15            kwargs = module._parameters[name].__dict__16            kwargs["requires_grad"] = param.requires_grad17            module._parameters[name] = param_cls(18                module._parameters[name].to(device), **kwargs19            )20 21    def register_empty_buffer(module, name, buffer, persistent=True):22        old_register_buffer(module, name, buffer, persistent=persistent)23        if buffer is not None:24            module._buffers[name] = module._buffers[name].to(device)25 26    def patch_tensor_constructor(fn):27        def wrapper(*args, **kwargs):28            kwargs["device"] = device29            return fn(*args, **kwargs)30 31        return wrapper32 33    if include_buffers:34        tensor_constructors_to_patch = {35            torch_function_name: getattr(torch, torch_function_name)36            for torch_function_name in ["empty", "zeros", "ones", "full"]37        }38    else:39        tensor_constructors_to_patch = {}40 41    try:42        torch.nn.Module.register_parameter = register_empty_parameter43        if include_buffers:44            torch.nn.Module.register_buffer = register_empty_buffer45        for torch_function_name in tensor_constructors_to_patch.keys():46            setattr(47                torch,48                torch_function_name,49                patch_tensor_constructor(getattr(torch, torch_function_name)),50            )51        yield52    finally:53        torch.nn.Module.register_parameter = old_register_parameter54        if include_buffers:55            torch.nn.Module.register_buffer = old_register_buffer56        for (57            torch_function_name,58            old_torch_function,59        ) in tensor_constructors_to_patch.items():60            setattr(torch, torch_function_name, old_torch_function)