මෙයස්විච් ට්රාන්ස්ෆෝමරයක් පුහුණු කිරීම සඳහා කරන ලද පයිටෝර්ච් අත්හදා බැලීමකි.
15import torch
16import torch.nn as nn
17
18from labml import experiment, tracker
19from labml.configs import option
20from labml_helpers.module import Module
21from labml_helpers.train_valid import BatchIndex
22from labml_nn.experiments.nlp_autoregression import NLPAutoRegressionConfigs25class AutoregressiveModel(Module):30 def __init__(self, n_vocab: int, d_model: int, transformer: Module):
31 super().__init__()ටෝකන්කාවැද්දීම මොඩියුලය
33 self.src_embed = nn.Embedding(n_vocab, d_model)ට්රාන්ස්ෆෝමර්
35 self.transformer = transformerඅවසන්ස්ථරය
37 self.generator = nn.Linear(d_model, n_vocab)
38 self.mask = None40 def forward(self, x: torch.Tensor):පසුකාලීනආවරණ ආරම්භ කරන්න
42 if self.mask is None or self.mask.size(0) != len(x):
43 from labml_nn.transformers.utils import subsequent_mask
44 self.mask = subsequent_mask(len(x)).to(x.device)ටෝකන්කාවැද්දීම්
46 x = self.src_embed(x)ට්රාන්ස්ෆෝමරයහරහා එය ධාවනය කරන්න
48 res, counts, route_prob, n_dropped, route_prob_max = self.transformer(x, self.mask)ඊළඟටෝකනයේ පිවිසුම් ජනනය කරන්න
50 res = self.generator(res)52 return res, counts, route_prob, n_dropped, route_prob_maxමෙයවිහිදේ NLPAutoRegressionConfigs
.
අපිඅත්හදා බැලීම ආරම්භ කරන විට පෙරනිමි වින්යාස කළ හැකි අතර එය අධික ලෙස ධාවනය වනු ඇත
55class Configs(NLPAutoRegressionConfigs):64 model: AutoregressiveModel
65 transformer: Moduleටෝකන්කාවැද්දීමේ ප්රමාණය
68 d_model: int = 128අවධානයයොමු ප්රධානීන් ගණන
70 heads: int = 4අතහැරදැමීමේ සම්භාවිතාව
72 dropout: float = 0.0FFNසැඟවුණු ස්ථරයේ විශේෂාංග ගණන
74 d_ff: int = 256ට්රාන්ස්ෆෝමර්ස්ථර ගණන
76 n_layers: int = 6විශේෂඥයන්සංඛ්යාව
78 n_experts: int = 4පැටවුම්තුලනය කිරීමේ සංගුණකය
80 load_balancing_loss_ceof = 0.01රවුටින්සම්භාවිතාව අනුව තෝරාගත් විශේෂ expert ප්රතිදානයන් පරිමාණය කළ යුතුද යන්න
82 is_scale_prob: bool = Trueටෝකනඅතහරින්න යන්න
84 drop_tokens: bool = Falseඑක්එක් ආකෘතියේ ධාරිතාව තීරණය කිරීම සඳහා ධාරිතා සාධකය
86 capacity_factor: float = 1.088 def init(self):
89 super().init()ලුහුබැඳීමේදර්ශක ආරම්භ කරන්න
91 tracker.set_scalar("lb_loss.*", False)
92 tracker.set_scalar("route.*", False)
93 tracker.set_scalar("dropped.*", False)95 def step(self, batch: any, batch_idx: BatchIndex):උපාංගයවෙත දත්ත ගෙනයන්න
101 data, target = batch[0].to(self.device), batch[1].to(self.device)පුහුණුප්රකාරයේදී ගෝලීය පියවර යාවත්කාලීන කරන්න (සැකසූ ටෝකන ගණන)
104 if self.mode.is_train:
105 tracker.add_global_step(data.shape[0] * data.shape[1])ආකෘතිප්රතිදානයන් ග්රහණය කර ගත යුතුද යන්න
108 with self.mode.update(is_log_activations=batch_idx.is_last):ආදර්ශප්රතිදානයන් ලබා ගන්න.
110 output, counts, route_prob, n_dropped, route_prob_max = self.model(data)එන්ට්රොපිනැතිවීම ගණනය කර හරස් කරන්න
113 cross_entropy_loss = self.loss_func(output, target)වත්මන්කණ්ඩායම තුළ සැකසූ මුළු ටෝකන ගණන
115 total = counts.sum(dim=-1, keepdims=True)එක්එක් විශේෂ expert යා වෙත යොමු කරන ලද ටෝකන වල භාගය යනු ආගම්මැක්ස් සමාන වන ටෝකන ගණනයයි .
119 route_frac = counts / totalමධ්යන්යමාර්ගගත කිරීමේ සම්භාවිතාව
122 route_prob = route_prob / totalබරතුලනය කිරීමේ අලාභය යනු තනි තට්ටුවක් සඳහා වන අලාභය වන අතර මෙහිදී අපි සියලු ස්ථර හරහා පාඩු එකතුව ගනිමු.
127 load_balancing_loss = self.n_experts * (route_frac * route_prob).sum()සංඛ්යානලුහුබඳින්න
130 tracker.add('dropped.', total.new_tensor(n_dropped) / total)
131 tracker.add('route.min.', route_frac.min())
132 tracker.add('route.max.', route_frac.max())
133 tracker.add('route.std.', route_frac.std())
134 tracker.add('route.max_prob.', route_prob_max)
135 tracker.add("loss.", cross_entropy_loss)
136 tracker.add("lb_loss.", load_balancing_loss)ඒකාබද්ධඅලාභය. බර තුලනය අලාභය වැනි කුඩා දෙයකට සකසා ඇති සංගුණකය මගින් ගුණ කරනු ලැබේ.
141 loss = cross_entropy_loss + self.load_balancing_loss_ceof * load_balancing_lossගණනයකිරීම සහ ලොග් කිරීමේ නිරවද්යතාවය
144 self.accuracy(output, target)
145 self.accuracy.track()ආකෘතියපුහුණු කරන්න
148 if self.mode.is_train:අනුක්රමිකගණනය කරන්න
150 loss.backward()ක්ලිප්අනුක්රමික
152 torch.nn.utils.clip_grad_norm_(self.model.parameters(), max_norm=self.grad_norm_clip)ප්රශස්තිකරණපියවර ගන්න
154 self.optimizer.step()සෑමයුගලයකම අවසාන කණ්ඩායමේ ආදර්ශ පරාමිතීන් සහ අනුක්රමික ලොග් කරන්න
156 if batch_idx.is_last:
157 tracker.add('model', self.model)අනුක්රමිකඉවත්
159 self.optimizer.zero_grad()ලුහුබැඳඇති ප්රමිතික සුරකින්න
162 tracker.save()165@option(Configs.model)
166def autoregressive_model(c: Configs):170 m = AutoregressiveModel(c.n_tokens, c.d_model, c.transformer)
171 return m.to(c.device)174@option(Configs.transformer)
175def switch_transformer(c: Configs):179 from labml_nn.transformers.switch import SwitchTransformer, SwitchTransformerLayer, SwitchFeedForward
180 from labml_nn.transformers import MultiHeadAttention
181 from labml_nn.transformers.feed_forward import FeedForward
182
183 return SwitchTransformer(
184 SwitchTransformerLayer(d_model=c.d_model,
185 attn=MultiHeadAttention(c.heads, c.d_model, c.dropout),
186 feed_forward=SwitchFeedForward(capacity_factor=c.capacity_factor,
187 drop_tokens=c.drop_tokens,
188 is_scale_prob=c.is_scale_prob,
189 n_experts=c.n_experts,
190 expert=FeedForward(c.d_model, c.d_ff, c.dropout),
191 d_model=c.d_model),
192 dropout_prob=c.dropout),
193 c.n_layers)196def main():අත්හදාබැලීම සාදන්න
201 experiment.create(name="switch_transformer", comment='')වින්යාසසාදන්න
203 conf = Configs()වින්යාසයන්පූරණය කරන්න
205 experiment.configs(conf,අභිබවායාම සඳහා වින්යාසයන් පිළිබඳ ශබ්දකෝෂයක්
207 {'tokenizer': 'character',
208 'text': 'tiny_shakespeare',
209 'optimizer.learning_rate': 1.,
210 'optimizer.optimizer': 'Noam',
211 'prompt': 'It is',
212 'prompt_separator': '',
213
214 'transformer': 'switch_transformer',
215 'n_experts': 4,
216
217 'drop_tokens': True,
218 'capacity_factor': 1.2,
219
220 'train_loader': 'shuffled_train_loader',
221 'valid_loader': 'shuffled_valid_loader',
222
223 'seq_len': 64,
224 'epochs': 128,
225 'batch_size': 32,
226 'inner_iterations': 25,
227 })ඉතිරිකිරීම සහ පැටවීම සඳහා ආකෘති සකසන්න
230 experiment.add_pytorch_models({'model': conf.model})අත්හදාබැලීම ආරම්භ කරන්න
233 with experiment.start():TrainValidConfigs.run
235 conf.run()239if __name__ == '__main__':
240 main()