TDATR / TDATR_utils /models.py
aoyama's picture
Deploy TDATR ZeroGPU Space
a27dedf verified
Raw
History Blame Contribute Delete
5.56 kB
"""This code is copied fron NVIDIA apex:
https://github.com/NVIDIA/apex
with some changes. """
from typing import Optional, Union, Tuple
import numbers
import importlib
import torch
from torch.nn import init
from torch.nn.parameter import Parameter
from torch.cuda.amp import custom_fwd, custom_bwd
from TDATR.models.modules.linear_layer import LinearWithAsyncCommunication
from TDATR.models.modules.mappings import copy_to_tensor_model_parallel_region, gather_from_tensor_model_parallel_region
from TDATR_utils.global_context import global_context as gpc
from TDATR_utils.global_variables import ParallelMode
global hulk_layer_norm_cuda
hulk_layer_norm_cuda = None
class FusedLayerNormAffineFunction(torch.autograd.Function):
@staticmethod
@custom_fwd(cast_inputs=torch.float32)
def forward(ctx, input, weight, bias, normalized_shape, eps):
ctx.normalized_shape = normalized_shape
ctx.eps = eps
input_ = input.contiguous()
weight_ = weight.contiguous()
bias_ = bias.contiguous()
output, mean, invvar = hulk_layer_norm_cuda.forward_affine(
input_, ctx.normalized_shape, weight_, bias_, ctx.eps
)
ctx.save_for_backward(input_, weight_, bias_, mean, invvar)
return output
@staticmethod
@custom_bwd
def backward(ctx, grad_output):
input_, weight_, bias_, mean, invvar = ctx.saved_tensors
grad_input = grad_weight = grad_bias = None
grad_input, grad_weight, grad_bias = hulk_layer_norm_cuda.backward_affine(
grad_output.contiguous(),
mean,
invvar,
input_,
ctx.normalized_shape,
weight_,
bias_,
ctx.eps,
)
return grad_input, grad_weight, grad_bias, None, None
class MixedFusedLayerNorm(torch.nn.Module):
def __init__(
self,
normalized_shape: Union[int, Tuple[int]],
eps: float = 1e-5,
device: Optional[torch.device] = None,
dtype: Optional[torch.dtype] = None,
sequence_parallel: Optional[bool] = None,
):
super(MixedFusedLayerNorm, self).__init__()
global hulk_layer_norm_cuda
if hulk_layer_norm_cuda is None:
try:
hulk_layer_norm_cuda = importlib.import_module(
"TDATR_utils.layer_norm_cuda"
)
except ImportError as e:
raise RuntimeError(
f"import `MixedFusedLayerNorm`(cuda extensions) error: {e}."
)
if isinstance(normalized_shape, numbers.Integral):
normalized_shape = (normalized_shape,)
self.normalized_shape = torch.Size(normalized_shape)
self.eps = eps
self.apply_layernorm_1p = gpc.config.common.apply_layernorm_1p
self.weight = Parameter(
torch.empty(*normalized_shape, device=device, dtype=dtype)
)
self.bias = Parameter(
torch.empty(*normalized_shape, device=device, dtype=dtype)
)
self.sequence_parallel = sequence_parallel
if self.sequence_parallel is None:
self.sequence_parallel = gpc.config.model_parallel.sequence_parallel
# set sequence parallelism flag on weight and bias parameters
setattr(self.weight, "sequence_parallel", self.sequence_parallel)
setattr(self.bias, "sequence_parallel", self.sequence_parallel)
self.reset_parameters()
def reset_parameters(self):
if self.apply_layernorm_1p:
init.zeros_(self.weight)
init.zeros_(self.bias)
else:
init.ones_(self.weight)
init.zeros_(self.bias)
def forward(self, input):
weight = self.weight + 1 if self.apply_layernorm_1p else self.weight
outputs = FusedLayerNormAffineFunction.apply(
input.to(self.weight),
weight,
self.bias,
self.normalized_shape,
self.eps,
)
return outputs.to(input)
def __repr__(self):
return f"MixedFusedLayerNorm(normalized_shape={self.normalized_shape}, eps={self.eps})"
"""This code from NVIDIA Megatron
with some changes. """
import enum
import torch
import torch.nn as nn
def parallel_lm_logits(
inputs_parallel,
word_embeddings_weight,
parallel_output,
):
# [b, s, h] -> [s, b, h]
inputs_parallel = inputs_parallel.transpose(0, 1).contiguous()
async_tensor_model_parallel_allreduce = \
gpc.config.model_parallel.async_tensor_model_parallel_allreduce
sequence_parallel = gpc.config.model_parallel.sequence_parallel
if async_tensor_model_parallel_allreduce or sequence_parallel:
inputs_parallel = inputs_parallel
tensor_parallel = gpc.get_world_size(ParallelMode.TENSOR) > 1
async_grad_allreduce = async_tensor_model_parallel_allreduce and \
tensor_parallel and not sequence_parallel
else:
inputs_parallel = copy_to_tensor_model_parallel_region(inputs_parallel)
async_grad_allreduce = False
logits_parallel = LinearWithAsyncCommunication.apply(
inputs_parallel,
word_embeddings_weight,
None,
async_grad_allreduce,
sequence_parallel,
)
# [s, b, h] -> [b, s, h]
logits_parallel = logits_parallel.transpose(0, 1).contiguous()
if parallel_output:
return logits_parallel
return gather_from_tensor_model_parallel_region(logits_parallel)