ජීපීටී

මෙය PyTorch හි OpenAI GPT ගෘහ නිර්මාණ ශිල්පය පිළිබඳ නිබන්ධනයක්/ක්රියාත්මක කිරීමකි. @karpathy විසින් MingPT වෙතින් ක්රියාත්මක කිරීමේ විස්තර රාශියක් අපට ලැබුණි. මෙම ක්රියාත්මක කිරීම අක්ෂර කුඩා ෂේක්ස්පියර් දත්ත කට්ටලය ද භාවිතා කරයි.

GPTආකෘතිය අත්යවශ්යයෙන්ම tweaks කිහිපයක් සහිත සම්මත ට්රාන්ස්ෆෝමරයක් වේ. GPT-2 සහ විශේෂයෙන් GPT-3 මාදිලි තරමක් විශාල වන අතර තනි GPU එකකට නොගැලපෙන අතර ආකෘති සමාන්තරකරණය අවශ්ය වේ. මෙම ක්රියාත්මක කිරීම දත්ත සමාන්තරකරණය පවා භාවිතා නොකරන අතර නිබන්ධනයක් වැඩි කිරීමට අදහස් කරයි.

සරලස්වයංක්රීය ප්රතිගාමී ට්රාන්ස්ෆෝමරයකට සාපේක්ෂව මෙහි ප්රධාන වෙනස්කම් වන්නේ පරාමිති ආරම්භය, බර ක්ෂය වීම සහ ඉගෙනුම් අනුපාත කාලසටහනයයි. ට්රාන්ස්ෆෝමරය සඳහා අපි දැනට පවතින labml/nn ට්රාන්ස්ෆෝමර් ක්රියාත්මක කිරීමනැවත භාවිතා කරමු.

කුඩාෂේක්ස්පියර් දත්ත කට්ටලය පිළිබඳ ජීපීටී ආකෘතියක් පුහුණු කිරීම සඳහා සටහන් පොතක් මෙන්න.

Open In Colab View Run

35import torch
36from torch import nn
37
38from labml import experiment
39from labml.configs import option
40from labml_helpers.module import Module
41from labml_nn.experiments.nlp_autoregression import NLPAutoRegressionConfigs
42from labml_nn.optimizers.configs import OptimizerConfigs
43from labml_nn.transformers import TransformerConfigs, Encoder
44from labml_nn.transformers.utils import subsequent_mask

GPTආකෘතිය

මෙයටෝකන් කාවැද්දීමේ ස්ථරයක්, ට්රාන්ස්ෆෝමර් එන්කෝඩරයක් සහ ටෝකන් පිවිසුම් ලබා දෙන අවසාන රේඛීය ස්ථරයකින් සමන්විත වේ.

47class GPT(Module):
55    def __init__(self, encoder: Encoder, src_embed: Module, generator: Module):
62        super().__init__()
63        self.src_embed = src_embed
64        self.encoder = encoder
65        self.generator = generator

පළමුඇමතුමෙන් වෙස්මුහුණ ආරම්භ කරනු ඇත

68        self.mask = None
70    def forward(self, x: torch.Tensor):

වෙස්මුහුණආරම්භ කර නොමැති නම් හෝ වෙස් මුහුණෙහි ප්රමාණය වෙනස් නම් පසුකාලීන වෙස්මුහුණක් සාදන්න

73        if self.mask is None or self.mask.size(0) != len(x):

පසුකාලීනවෙස්මුහුණ, අනාගත ටෝකන දැකීමෙන් ටෝකන වසං කරනු ඇත

75            self.mask = subsequent_mask(len(x)).to(x.device)

ස්ථානීයකේතන ක්රම සමඟ ටෝකන් කාවැද්දීම් ලබා ගන්න

77        x = self.src_embed(x)

ට්රාන්ස්ෆෝමර්එන්කෝඩරය

79        x = self.encoder(x, self.mask)

පිවිසුම්ලබා ගන්න

81        x = self.generator(x)

ප්රතිලාභප්රති results ල (දෙවන අගය රාජ්ය සඳහා වේ, මන්ද අපගේ පුහුණුකරු RNs සමඟ ද භාවිතා කරයි)

85        return x, None

වින්යාසකිරීම්

මෙයඋරුම වන්නේ NLPAutoRegressionConfigs

88class Configs(NLPAutoRegressionConfigs):

GPTආකෘතිය

97    model: GPT

ට්රාන්ස්ෆෝමර්

99    transformer: TransformerConfigs

සිරුරේබර ක්ෂය

101    weight_decay: float = 0.1

වම්අප්සඳහා ටෝකන ගණන

103    warmup_steps: int = 128 * 128 * 20

අභිරුචිප්රශස්තකරණය

106    optimizer = 'transformer_optimizer'

ට්රාන්ස්ෆෝමර්වින්යාසයන්

109@option(Configs.transformer, 'GPT')
110def _transformer_configs(c: Configs):
117    conf = TransformerConfigs()

කාවැද්දීම්සහ පිවිසුම් උත්පාදනය සඳහා වචන මාලාව ප්රමාණ සකසන්න

119    conf.n_src_vocab = c.n_tokens
120    conf.n_tgt_vocab = c.n_tokens

GPTස්ථානගත නැණවත් පෝෂණය සඳහා GELU සක්රිය කිරීම භාවිතා කරයි

122    conf.ffn.activation = 'GELU'

125    return conf

බරආරම්භ කරන්න

පෙරනිමිසේවියර් ආරම්භය වෙනුවට රේඛීය ස්ථර සහ කාවැද්දීමේ ස්ථර වල බර ආරම්භ කර ඇත.

128def _init_weights(module):
137    if not isinstance(module, (nn.Linear, nn.Embedding)):
138        return
139
140    module.weight.data.normal_(mean=0.0, std=0.02)

නැඹුරුවආරම්භ කරන්න

143    if isinstance(module, nn.Linear) and module.bias is not None:
144        module.bias.data.zero_()

GPTආකෘතිය සාදන්න සහ බර ආරම්භ කරන්න

147@option(Configs.model)
148def _model(c: Configs):
152    m = GPT(c.transformer.encoder,
153            c.transformer.src_embed,
154            c.transformer.generator).to(c.device)

අභිරුචිබර ආරම්භ කිරීම යොදන්න

157    m.apply(_init_weights)
158
159    return m

බරක්ෂය වීමත් සමඟ අභිරුචි ප්රශස්තිකරණයක් සාදන්න

මෙමකේතය MingPTවෙතින් ගනු ලැබේ. මෙය රේඛීය ස්ථරවල බරට පමණක් බර ක්ෂය වීම අදාළ වේ.

162@option(NLPAutoRegressionConfigs.optimizer)
163def transformer_optimizer(c: NLPAutoRegressionConfigs):

බරක්ෂය වීම යෙදීම සඳහා පරාමිතීන්ගේ නම් එකතු කරන්න

171    decay = set()
172    for mn, m in c.model.named_modules():
173        for pn, p in m.named_parameters():
174            fpn = f'{mn}.{pn}' if mn else pn  # full param name
175
176            if fpn.endswith('weight') and isinstance(m, nn.Linear):
177                decay.add(fpn)

සියලුපරාමිතීන් ලබා ගන්න

180    param_dict = {pn: p for pn, p in c.model.named_parameters()}

දිරාපත්නොවන පරාමිතීන්

182    no_decay = set(param_dict.keys()) - decay

පයිටෝච්ප්රශස්තිකරණ වස්තුව සාදන්න

185    opt_groups = [
186        {"params": [param_dict[pn] for pn in sorted(list(decay))], "weight_decay": c.weight_decay},
187        {"params": [param_dict[pn] for pn in sorted(list(no_decay))], "weight_decay": 0.0},
188    ]

වින්යාසගත කළ හැකි ප්රශස්තිකරණයක්සාදන්න, එවිට වින්යාස ශබ්දකෝෂයක් සම්මත කිරීමෙන් අපට මේවා වෙනස් කළ හැකිය.

193    optimizer = OptimizerConfigs()

ප්රශස්තිකරණයසඳහා පරාමිති කණ්ඩායම් සකසන්න.

196    optimizer.parameters = opt_groups

කොසයින් ක්ෂය වීමේ ප්රශස්තකාරකයභාවිතා කරන්න. GPT භාවිතා කරන්නේ මෙයයි.

199    optimizer.optimizer = 'AdamWarmupCosineDecay'

Setආදර්ශ කාවැද්දීම ප්රමාණය, අපි ඝාතීය ක්ෂය ඇති Noam optimizer භාවිතා කරන්නේ නම් අවශ්ය.

202    optimizer.d_model = c.d_model

පෙරනිමිබර ක්ෂය වීම සකසන්න. පරාමිති කණ්ඩායම්වල බර ක්ෂය වීම නිසා මෙය අවශ්ය නොවේ.

205    optimizer.weight_decay = c.weight_decay

GPTඋපරිම ඉගෙනුම් අනුපාතය භාවිතා කරයි .

207    optimizer.learning_rate = 6e-4

209    optimizer.betas = (0.9, 0.95)

211    optimizer.eps = 1e-8

බරක්ෂය වීම අනුක්රමික සිට decoupled ඇත

213    optimizer.weight_decouple = True

ඉගෙනීමේඅනුපාතය කොසයින් ක්ෂය වීම සඳහා ප්රශස්තිකරණ පියවර ගණන

215    optimizer.total_steps = c.epochs * len(c.text.train) // (c.batch_size * c.seq_len)

උනුසුම්ප්රශස්තිකරණ පියවර ගණන

217    optimizer.warmup = c.warmup_steps // (c.batch_size * c.seq_len)
218
219    return optimizer
222def main():

අත්හදාබැලීම සාදන්න

224    experiment.create(name="gpt")

වින්යාසසාදන්න

226    conf = Configs()

වින්යාසයන්අභිබවා යන්න

228    experiment.configs(conf, {

අක්ෂරමට්ටමේ ටෝකනයිසර් භාවිතා කරන්න

230        'tokenizer': 'character',

කඩිනම්බෙදුම්කරු හිස් ය

232        'prompt_separator': '',

නියැදීමසඳහා විමසුමක් ආරම්භ කිරීම

234        'prompt': 'It is ',

කුඩාෂේක්ස්පියර් දත්ත කට්ටලය භාවිතා කරන්න

236        'text': 'tiny_shakespeare',

කසන්දර්භය ප්රමාණය භාවිතා

239        'seq_len': 128,

Epochs සඳහා දුම්රිය

241        'epochs': 32,

කණ්ඩායම්ප්රමාණය

243        'batch_size': 128,

එක් යුගයකට වරක් පුහුණුව සහ වලංගු කිරීම අතර මාරු වන්න

246        'inner_iterations': 10,

ට්රාන්ස්ෆෝමර්වින්යාසයන්

249        'transformer.d_model': 512,
250        'transformer.ffn.d_ff': 2048,
251        'transformer.n_heads': 8,
252        'transformer.n_layers': 6
253    })

ඉතිරිකිරීම සහ පැටවීම සඳහා ආකෘති සකසන්න

256    experiment.add_pytorch_models({'model': conf.model})

අත්හදාබැලීම ආරම්භ කරන්න

259    with experiment.start():

පුහුණුධාවනය

261        conf.run()

265if __name__ == '__main__':
266    main()