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

11from typing import Callable
12
13import torch
14import torch.nn as nn
15from torch.utils.data import DataLoader, RandomSampler
16
17from labml import lab, monit, logger, tracker
18from labml.configs import option
19from labml.logger import Text
20from labml_helpers.datasets.text import TextDataset, SequentialDataLoader, SequentialUnBatchedDataset, TextFileDataset
21from labml_helpers.device import DeviceConfigs
22from labml_helpers.metrics.accuracy import Accuracy
23from labml_helpers.module import Module
24from labml_helpers.train_valid import TrainValidConfigs, hook_model_outputs, BatchIndex
25from labml_nn.optimizers.configs import OptimizerConfigs

හරස්එන්ට්රොපි නැතිවීම

28class CrossEntropyLoss(Module):
33    def __init__(self):
34        super().__init__()
35        self.loss = nn.CrossEntropyLoss()
37    def forward(self, outputs, targets):
38        return self.loss(outputs.view(-1, outputs.shape[-1]), targets.view(-1))

පුහුණුකරුමානකරණ

එන්එල්පීස්වයංක්රීය-ප්රතිගාමී කාර්ය පුහුණුව සඳහා මූලික වින්යාසයන් මෙයට ඇත. සියලුම ගුණාංග වින්යාසගත කළ හැකිය.

41class NLPAutoRegressionConfigs(TrainValidConfigs):

ප්රශස්තකරණය

52    optimizer: torch.optim.Adam

පුහුණුඋපාංගය

54    device: torch.device = DeviceConfigs()

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

57    model: Module

පෙළදත්ත කට්ටලය

59    text: TextDataset

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

61    batch_size: int = 16

අනුක්රමයේදිග, හෝ සන්දර්භය ප්රමාණය

63    seq_len: int = 512

වචනමාලාවේ ටෝකන් ගණන

65    n_tokens: int

ටෝකනයිසර්

67    tokenizer: Callable = 'character'

නියැදීම්ආරම්භ කිරීමට පෙළ විමසුම (නිදර්ශනය සඳහා)

70    prompt: str

නියැදීමේදීටෝකන් බෙදුම්කරු (අක්ෂර මට්ටමේ ටෝකනීකරණය සඳහා හිස්)

72    prompt_separator: str

වරින්වර ආකෘති සුරැකීමට යන්න

75    is_save_models = True

පාඩුශ්රිතය

78    loss_func = CrossEntropyLoss()

නිරවද්යතාශ්රිතය

80    accuracy = Accuracy()

ආදර්ශකාවැද්දීමේ ප්රමාණය

82    d_model: int = 512

ශ්රේණියේක්ලිපින්

84    grad_norm_clip: float = 1.0

පුහුණුදත්ත පැටවුම

87    train_loader: DataLoader = 'shuffled_train_loader'

වලංගුදත්ත පැටවුම

89    valid_loader: DataLoader = 'shuffled_valid_loader'

දත්තකාරකයන් ආදේශ කිරීම සමඟ මාරු වේ

92    dataloader_shuffle_with_replacement: bool = False

ආදර්ශපරාමිතීන් සහ අනුක්රමික ලඝු-සටහන යන්න (එක් එක් එක් එක් එක් වරක්). මේවා ස්ථරයකට සාරාංශගත සංඛ්යාන වේ, නමුත් එය තවමත් ඉතා ගැඹුරු ජාල සඳහා බොහෝ දර්ශක වලට හේතු විය හැකිය.

97    is_log_model_params_grads: bool = False

ආදර්ශසක්රිය කිරීම් ලොග් කළ යුතුද යන්න (එක් එක් ඊපෝච් එකකට වරක්). මේවා ස්ථරයකට සාරාංශගත සංඛ්යාන වේ, නමුත් එය තවමත් ඉතා ගැඹුරු ජාල සඳහා බොහෝ දර්ශක වලට හේතු විය හැකිය.

102    is_log_model_activations: bool = False

ආරම්භකකරණය

104    def init(self):

ට්රැකර්වින්යාසයන් සකසන්න

109        tracker.set_scalar("accuracy.*", True)
110        tracker.set_scalar("loss.*", True)
111        tracker.set_text("sampled", False)

මොඩියුලප්රතිදානයන් ලොග් කිරීමට කොක්කක් එක් කරන්න

113        hook_model_outputs(self.mode, self.model, 'model')

රාජ්යමොඩියුලයක් ලෙස නිරවද්යතාව එක් කරන්න. RNs සඳහා පුහුණුව සහ වලංගු කිරීම අතර රාජ්යයන් ගබඩා කිරීම අදහස් කරන බැවින් නම බොහෝ විට ව්යාකූල වේ. මෙය පුහුණුව සහ වලංගු කිරීම සඳහා නිරවද්යතා මෙට්රික් සංඛ්යාන වෙනම තබා ගනී.

118        self.state_modules = [self.accuracy]

වෙනත්ප්රමිතික ගණනය කිරීමට හා ලොග් කිරීමට අභිබවා යන්න

120    def other_metrics(self, output: torch.Tensor, target: torch.Tensor):
122        pass

පුහුණුවහෝ වලංගු කිරීමේ පියවර

124    def step(self, batch: any, batch_idx: BatchIndex):

පුහුණු/evalමාදිලිය සකසන්න

130        self.model.train(self.mode.is_train)

උපාංගයවෙත දත්ත ගෙනයන්න

133        data, target = batch[0].to(self.device), batch[1].to(self.device)

පුහුණුප්රකාරයේදී ගෝලීය පියවර යාවත්කාලීන කරන්න (සැකසූ ටෝකන ගණන)

136        if self.mode.is_train:
137            tracker.add_global_step(data.shape[0] * data.shape[1])

ආකෘතිප්රතිදානයන් ග්රහණය කර ගත යුතුද යන්න

140        with self.mode.update(is_log_activations=batch_idx.is_last and self.is_log_model_activations):

ආදර්ශප්රතිදානයන් ලබා ගන්න. ආර්එන්එස් භාවිතා කරන විට එය ප්රාන්ත සඳහා ටූල් එකක් නැවත ලබා දෙයි. මෙය තවම ක්රියාත්මක කර නැත 😜

144            output, *_ = self.model(data)

ගණනයකිරීම සහ ලොග් වීම

147        loss = self.loss_func(output, target)
148        tracker.add("loss.", loss)

ගණනයකිරීම සහ ලොග් කිරීමේ නිරවද්යතාවය

151        self.accuracy(output, target)
152        self.accuracy.track()
153
154        self.other_metrics(output, target)

ආකෘතියපුහුණු කරන්න

157        if self.mode.is_train:

අනුක්රමිකගණනය කරන්න

159            loss.backward()

ක්ලිප්අනුක්රමික

161            torch.nn.utils.clip_grad_norm_(self.model.parameters(), max_norm=self.grad_norm_clip)

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

163            self.optimizer.step()

සෑමයුගලයකම අවසාන කණ්ඩායමේ ආදර්ශ පරාමිතීන් සහ අනුක්රමික ලොග් කරන්න

165            if batch_idx.is_last and self.is_log_model_params_grads:
166                tracker.add('model', self.model)

අනුක්රමිකඉවත්

168            self.optimizer.zero_grad()

ලුහුබැඳඇති ප්රමිතික සුරකින්න

171        tracker.save()

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

173    def sample(self):

විමසුමක්ආරම්භ කිරීම

179        prompt = self.prompt

මුද්රණයසඳහා ප්රතිදානය එකතු කරන්න

181        log = [(prompt, Text.subtle)]

සාම්පල25 ටෝකන

183        for i in monit.iterate('Sample', 25):

විමසුමටෝකෙන්කරන්න

185            data = self.text.text_to_i(prompt).unsqueeze(-1)
186            data = data.to(self.device)

ආදර්ශප්රතිදානය ලබා ගන්න

188            output, *_ = self.model(data)

ආදර්ශඅනාවැකිය ලබා ගන්න (කෑදර)

190            output = output.argmax(dim=-1).squeeze()

විමසුමටඅනාවැකිය එක් කරන්න

192            prompt += self.prompt_separator + self.text.itos[output[-1]]

ලොග්වීම සඳහා අනාවැකිය එක් කරන්න

194            log += [(self.prompt_separator + self.text.itos[output[-1]], Text.value)]
195
196        tracker.add({'sampled': prompt})

නියැදිප්රතිදානය මුද්රණය කරන්න

198        logger.log(log)
201@option(NLPAutoRegressionConfigs.optimizer)
202def _optimizer(c: NLPAutoRegressionConfigs):
207    optimizer = OptimizerConfigs()
208    optimizer.parameters = c.model.parameters()
209    optimizer.optimizer = 'Adam'
210    optimizer.d_model = c.d_model
211
212    return optimizer

ටෝකනගණන ලබා ගන්න

215@option(NLPAutoRegressionConfigs.n_tokens)
216def _n_tokens(c: NLPAutoRegressionConfigs):
220    return c.text.n_tokens

මූලිකඉංග්රීසි ටෝකනයිසර්

මෙමඅත්හදා බැලීමේදී අපි චරිත මට්ටමේ ටෝකනයිසර් භාවිතා කරමු. සැකසීමෙන් ඔබට මාරු විය හැකිය,

'tokenizer': 'basic_english',

අත්හදාබැලීම ආරම්භ කිරීමේදී වින්යාස කිරීමේ ශබ්දකෝෂයේ.

223@option(NLPAutoRegressionConfigs.tokenizer)
224def basic_english():
238    from torchtext.data import get_tokenizer
239    return get_tokenizer('basic_english')

අක්ෂරමට්ටමේ ටෝකනයිසර්

242def character_tokenizer(x: str):
246    return list(x)

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

249@option(NLPAutoRegressionConfigs.tokenizer)
250def character():
254    return character_tokenizer

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

නොමැතිනම් එය url එකෙන් බාගත කරනු ඇත

257@option(NLPAutoRegressionConfigs.text)
258def tiny_shakespeare(c: NLPAutoRegressionConfigs):
264    return TextFileDataset(
265        lab.get_data_path() / 'tiny_shakespeare.txt',
266        c.tokenizer,
267        url='https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt')

අනුක්රමිකපුහුණු දත්ත කාරකය

270@option(NLPAutoRegressionConfigs.train_loader)
271def sequential_train_loader(c: NLPAutoRegressionConfigs):
275    return SequentialDataLoader(text=c.text.train,
276                                dataset=c.text,
277                                batch_size=c.batch_size,
278                                seq_len=c.seq_len)

අනුක්රමිකවලංගු දත්ත කාරකය

281@option(NLPAutoRegressionConfigs.valid_loader)
282def sequential_valid_loader(c: NLPAutoRegressionConfigs):
286    return SequentialDataLoader(text=c.text.valid,
287                                dataset=c.text,
288                                batch_size=c.batch_size,
289                                seq_len=c.seq_len)

කණ්ඩායමසම්ප්රේෂණය

DataLoader පළමු මානය මත කණ්ඩායම් එකතු කරයි. අපි එය පළමුව අනුපිළිවෙලට සම්ප්රේෂණය කළ යුතුය.

292def transpose_batch(batch):
300    transposed_data = list(zip(*batch))

දෙවනමානය ඔස්සේ කණ්ඩායම ගොඩගසන්න dim=1

302    src = torch.stack(transposed_data[0], dim=1)
303    tgt = torch.stack(transposed_data[1], dim=1)
304
305    return src, tgt

මාරුකළ පුහුණු දත්ත පැටවුම

308@option(NLPAutoRegressionConfigs.train_loader)
309def shuffled_train_loader(c: NLPAutoRegressionConfigs):
313    dataset = SequentialUnBatchedDataset(text=c.text.train,
314                                         dataset=c.text,
315                                         seq_len=c.seq_len)
316    sampler = RandomSampler(dataset, replacement=c.dataloader_shuffle_with_replacement)
317
318    return DataLoader(dataset,
319                      batch_size=c.batch_size,
320                      collate_fn=transpose_batch,
321                      sampler=sampler)

මාරුකළ වලංගු දත්ත පැටවුම

324@option(NLPAutoRegressionConfigs.valid_loader)
325def shuffled_valid_loader(c: NLPAutoRegressionConfigs):
329    dataset = SequentialUnBatchedDataset(text=c.text.valid,
330                                         dataset=c.text,
331                                         seq_len=c.seq_len)
332    sampler = RandomSampler(dataset, replacement=c.dataloader_shuffle_with_replacement)
333
334    return DataLoader(dataset,
335                      batch_size=c.batch_size,
336                      collate_fn=transpose_batch,
337                      sampler=sampler)