මෙය PyTorch හි OpenAI GPT ගෘහ නිර්මාණ ශිල්පය පිළිබඳ නිබන්ධනයක්/ක්රියාත්මක කිරීමකි. @karpathy විසින් MingPT වෙතින් ක්රියාත්මක කිරීමේ විස්තර රාශියක් අපට ලැබුණි. මෙම ක්රියාත්මක කිරීම අක්ෂර කුඩා ෂේක්ස්පියර් දත්ත කට්ටලය ද භාවිතා කරයි.
GPTආකෘතිය අත්යවශ්යයෙන්ම tweaks කිහිපයක් සහිත සම්මත ට්රාන්ස්ෆෝමරයක් වේ. GPT-2 සහ විශේෂයෙන් GPT-3 මාදිලි තරමක් විශාල වන අතර තනි GPU එකකට නොගැලපෙන අතර ආකෘති සමාන්තරකරණය අවශ්ය වේ. මෙම ක්රියාත්මක කිරීම දත්ත සමාන්තරකරණය පවා භාවිතා නොකරන අතර නිබන්ධනයක් වැඩි කිරීමට අදහස් කරයි.
සරලස්වයංක්රීය ප්රතිගාමී ට්රාන්ස්ෆෝමරයකට සාපේක්ෂව මෙහි ප්රධාන වෙනස්කම් වන්නේ පරාමිති ආරම්භය, බර ක්ෂය වීම සහ ඉගෙනුම් අනුපාත කාලසටහනයයි. ට්රාන්ස්ෆෝමරය සඳහා අපි දැනට පවතින labml/nn ට්රාන්ස්ෆෝමර් ක්රියාත්මක කිරීමනැවත භාවිතා කරමු.
කුඩාෂේක්ස්පියර් දත්ත කට්ටලය පිළිබඳ ජීපීටී ආකෘතියක් පුහුණු කිරීම සඳහා සටහන් පොතක් මෙන්න.
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මෙයටෝකන් කාවැද්දීමේ ස්ථරයක්, ට්රාන්ස්ෆෝමර් එන්කෝඩරයක් සහ ටෝකන් පිවිසුම් ලබා දෙන අවසාන රේඛීය ස්ථරයකින් සමන්විත වේ.
47class GPT(Module):encoder
ට්රාන්ස්ෆෝමර් එන්කෝඩරය src_embed
යනු ටෝකන් කාවැද්දීමේ මොඩියුලය (ස්ථානීය කේතීකරණ සමඟ) generator
යනු පිවිසුම් ලබා දෙන අවසාන පූර්ණ සම්බන්ධිත ස්ථරයයි . 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 = None70 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, None88class 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_tokensGPTස්ථානගත නැණවත් පෝෂණය සඳහා GELU සක්රිය කිරීම භාවිතා කරයි
122 conf.ffn.activation = 'GELU'125 return conf128def _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_decayGPTඋපරිම ඉගෙනුම් අනුපාතය භාවිතා කරයි .
207 optimizer.learning_rate = 6e-4209 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 optimizer222def 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()