Spaces:
Configuration error
Configuration error
"""GPT Blocks used for the GPT Model.""" | |
from typing import Any, Optional | |
import torch | |
import torch.nn as nn | |
from .fc import FC_CLASS_REGISTRY | |
try: | |
import transformer_engine.pytorch as te | |
except: | |
te = None | |
class MPTMLP(nn.Module): | |
def __init__(self, d_model: int, expansion_ratio: int, fc_type: str='torch', device: Optional[str]=None): | |
super().__init__() | |
fc_kwargs = {} | |
if fc_type != 'te': | |
fc_kwargs['device'] = device | |
self.up_proj = FC_CLASS_REGISTRY[fc_type](d_model, expansion_ratio * d_model, **fc_kwargs) | |
self.act = nn.GELU(approximate='none') | |
self.down_proj = FC_CLASS_REGISTRY[fc_type](expansion_ratio * d_model, d_model, **fc_kwargs) | |
self.down_proj._is_residual = True | |
def forward(self, x: torch.Tensor) -> torch.Tensor: | |
return self.down_proj(self.act(self.up_proj(x))) | |
FFN_CLASS_REGISTRY = {'mptmlp': MPTMLP} | |
if te is not None: | |
te.LayerNormMLP._has_norm = True | |
FFN_CLASS_REGISTRY['te_ln_mlp'] = te.LayerNormMLP | |
def build_ffn(d_model: int, expansion_ratio: int, fc_type: str='torch', device: Optional[str]=None, **kwargs: Any) -> nn.Module: | |
ffn_type = kwargs.pop('ffn_type') | |
if ffn_type == 'mptmlp': | |
if len(kwargs) > 0: | |
raise ValueError(f'MPTMLP got an unexpected keyword argument: {kwargs}') | |
return MPTMLP(d_model=d_model, expansion_ratio=expansion_ratio, fc_type=fc_type, device=device) | |
elif ffn_type == 'te_ln_mlp': | |
assert te is not None | |
return te.LayerNormMLP(hidden_size=d_model, ffn_hidden_size=d_model * expansion_ratio, **kwargs) | |
raise ValueError(f'ffn_type={ffn_type!r} not recognized.') |