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 OptimizerConfigs28class 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 = False104 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 pass124 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_tokenizer257@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, tgt308@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)