16import torch
17from torch import nn
18
19from labml import experiment
20from labml.configs import option
21from labml_nn.experiments.nlp_autoregression import NLPAutoRegressionConfigs
22from labml_nn.transformers import TransformerConfigs, Encoder
23from labml_nn.transformers.utils import subsequent_mask26class AutoregressiveTransformer(nn.Module):encoder
是变压器编码器src_embed
是令牌嵌入模块(带有位置编码)generator
是给出 logit 的最后一个完全连接的层。30 def __init__(self, encoder: Encoder, src_embed: nn.Module, generator: nn.Module):37 super().__init__()
38 self.src_embed = src_embed
39 self.encoder = encoder
40 self.generator = generator掩码将在第一次调用时初始化
43 self.mask = None45 def forward(self, x: torch.Tensor):如果掩码未初始化或掩码大小不同,则创建后续掩码
48 if self.mask is None or self.mask.size(0) != len(x):后续的掩码,将掩盖令牌以免看到未来的代币
50 self.mask = subsequent_mask(len(x)).to(x.device)使用位置编码获取令牌嵌入
52 x = self.src_embed(x)变压器编码
54 x = self.encoder(x, self.mask)获取日志
56 x = self.generator(x)返回结果(第二个值用于状态,因为我们的训练器也与 RNN 一起使用)
60 return x, None63class Configs(NLPAutoRegressionConfigs):GPT 型号
72 model: AutoregressiveTransformer变压器
74 transformer: TransformerConfigs77@option(Configs.transformer, 'Transformer')
78def _transformer_configs(c: Configs):设置嵌入和生成 logit 的词汇量大小
87 conf.n_src_vocab = c.n_tokens
88 conf.n_tgt_vocab = c.n_tokens90 conf.d_model = c.d_model93 return conf创建 GPT 模型并初始化权重
96@option(Configs.model)
97def _model(c: Configs):101 m = AutoregressiveTransformer(c.transformer.encoder,
102 c.transformer.src_embed,
103 c.transformer.generator).to(c.device)
104
105 return m108def main():创建实验
110 experiment.create(name="transformer")创建配置
112 conf = Configs()覆盖配置
114 experiment.configs(conf, {使用角色等级分词器
116 'tokenizer': 'character',提示分隔符为空
118 'prompt_separator': '',开始采样提示
120 'prompt': 'It is ',使用小莎士比亚数据集
122 'text': 'tiny_shakespeare',使用上下文大小为
125 'seq_len': 512,训练 32 个时代
127 'epochs': 32,批量大小
129 'batch_size': 16,在训练和验证之间切换每个纪元的次数
132 'inner_iterations': 10,型号尺寸
135 'd_model': 256,
136 'transformer.n_heads': 16,
137 'transformer.ffn.d_ff': 1024,设置用于保存和加载的模型
145 experiment.add_pytorch_models({'model': conf.model})开始实验
148 with experiment.start():跑步训练
150 conf.run()154if __name__ == '__main__':
155 main()