ස්විච්ට්රාන්ස්ෆෝමර් අත්හදා බැලීම

මෙයස්විච් ට්රාන්ස්ෆෝමරයක් පුහුණු කිරීම සඳහා කරන ලද පයිටෝර්ච් අත්හදා බැලීමකි.

Open In Colab View Run

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 NLPAutoRegressionConfigs

ස්වයංක්රීයප්රතිගාමී ආකෘතිය

25class 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 = None
40    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.0

FFNසැඟවුණු ස්ථරයේ විශේෂාංග ගණන

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.0
88    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()