File size: 1,401 Bytes
f8bd6fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
"""Transformers implementation used to package Pollock SwiGLU checkpoints."""

import torch.nn as nn
import torch.nn.functional as F
from transformers import GPT2Config, GPT2LMHeadModel
from transformers.pytorch_utils import Conv1D


class PollockConfig(GPT2Config):
    model_type = "pollock"

    def __init__(self, mlp_variant="swiglu", **kwargs):
        super().__init__(**kwargs)
        self.mlp_variant = mlp_variant


class PollockSwiGLU(nn.Module):
    def __init__(self, config):
        super().__init__()
        n_inner = config.n_inner or 4 * config.hidden_size
        self.c_fc = Conv1D(2 * n_inner, config.hidden_size)
        self.c_proj = Conv1D(config.hidden_size, n_inner)
        self.dropout = nn.Dropout(config.resid_pdrop)

    def forward(self, hidden_states):
        gate, value = self.c_fc(hidden_states).chunk(2, dim=-1)
        hidden_states = F.silu(gate) * value
        return self.dropout(self.c_proj(hidden_states))


class PollockForCausalLM(GPT2LMHeadModel):
    config_class = PollockConfig

    def __init__(self, config):
        if config.mlp_variant != "swiglu":
            raise ValueError(
                f"PollockForCausalLM requires SwiGLU, got {config.mlp_variant!r}"
            )
        super().__init__(config)
        for block in self.transformer.h:
            block.mlp = PollockSwiGLU(config)
            block.mlp.apply(self._init_weights)