|
from operator import itemgetter
|
|
from typing import Any, Dict, Iterable, Optional, Tuple, Union
|
|
import math
|
|
import torch
|
|
|
|
|
|
def attention_mask_func(attention_scores, attention_mask):
|
|
attention_scores.masked_fill_(attention_mask, -10000.0)
|
|
return attention_scores
|
|
|
|
|
|
@torch.jit.script
|
|
def gelu_impl(x):
|
|
"""OpenAI's gelu implementation."""
|
|
return 0.5 * x * (1.0 + torch.tanh(0.7978845608028654 * x * (1.0 + 0.044715 * x * x)))
|
|
|
|
|
|
def openai_gelu(x):
|
|
return gelu_impl(x)
|
|
|
|
|
|
@torch.jit.script
|
|
def bias_gelu(bias, y):
|
|
x = bias + y
|
|
return x * 0.5 * (1.0 + torch.tanh(0.79788456 * x * (1 + 0.044715 * x * x)))
|
|
|
|
|
|
|
|
|
|
|
|
@torch.jit.script
|
|
def bias_gelu_back(g, bias, y):
|
|
x = bias + y
|
|
tanh_out = torch.tanh(0.79788456 * x * (1 + 0.044715 * x * x))
|
|
|
|
ff = 0.5 * x * ((1 - tanh_out * tanh_out) * (0.79788456 + 0.1070322243 * x * x)) + 0.5 * (
|
|
1 + tanh_out
|
|
)
|
|
return ff * g
|
|
|
|
|
|
class GeLUFunction(torch.autograd.Function):
|
|
@staticmethod
|
|
|
|
def forward(ctx, input, bias):
|
|
ctx.save_for_backward(input, bias)
|
|
return bias_gelu(bias, input)
|
|
|
|
@staticmethod
|
|
def backward(ctx, grad_output):
|
|
input, bias = ctx.saved_tensors
|
|
tmp = bias_gelu_back(grad_output, bias, input)
|
|
return tmp, tmp
|
|
|
|
|
|
bias_gelu_impl = GeLUFunction.apply
|
|
|
|
|
|
|
|
|
|
@torch.jit.script
|
|
def erf_gelu(x):
|
|
return (
|
|
x * 0.5 * (torch.erf(x / 1.41421).to(dtype=x.dtype) + torch.ones_like(x).to(dtype=x.dtype))
|
|
)
|
|
|
|
|
|
def init_method_normal(sigma):
|
|
|
|
def init_(tensor):
|
|
return torch.nn.init.normal_(tensor, mean=0.0, std=sigma)
|
|
|
|
return init_
|
|
|
|
|
|
def scaled_init_method_normal(sigma, num_layers):
|
|
std = sigma / math.sqrt(2.0 * num_layers)
|
|
|
|
def init_(tensor):
|
|
return torch.nn.init.normal_(tensor, mean=0.0, std=std)
|
|
|
|
return init_
|
|
|