|
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_ |
|
|