docs/si/transformers/xl/experiment.html
මෙයට්රාන්ස්ෆෝමර් xl ආකෘතියක් පුහුණු කිරීම සඳහා කරන ලද පයිටෝර්ච් අත්හදා බැලීමකි.
11fromtypingimportList1213importtorch14importtorch.nnasnn15fromlabml.loggerimportText1617fromlabmlimportexperiment,tracker,monit,logger18fromlabml.configsimportoption19fromlabml\_helpers.metrics.simple\_stateimportSimpleStateModule20fromlabml\_helpers.moduleimportModule21fromlabml\_helpers.train\_validimportBatchIndex,hook\_model\_outputs22fromlabml\_nn.experiments.nlp\_autoregressionimportNLPAutoRegressionConfigs23fromlabml\_nn.transformers.xlimportTransformerXL,TransformerXLLayer
26classAutoregressiveModel(Module):
31def\_\_init\_\_(self,n\_vocab:int,d\_model:int,transformer:TransformerXL):32super().\_\_init\_\_()
ටෝකන්කාවැද්දීම මොඩියුලය
34self.src\_embed=nn.Embedding(n\_vocab,d\_model)
ට්රාන්ස්ෆෝමර්
36self.transformer=transformer
අවසන්ස්ථරය
38self.generator=nn.Linear(d\_model,n\_vocab)
වෙස්මුහුණු
40self.mask\_x=None41self.mask\_mem=None
43defforward(self,x:torch.Tensor,mem:List[torch.Tensor]):
මතකයේදිග
45m\_len=len(mem[0])ifmemelse0
ටෝකනසඳහා පසුකාලීන වෙස් මුහුණක් සාදන්න
47ifself.mask\_xisNoneorself.mask\_x.shape[0]\<len(x):48fromlabml\_nn.transformers.utilsimportsubsequent\_mask49self.mask\_x=subsequent\_mask(len(x)).to(x.device)
මතකයසඳහා සියලු (සම්පූර්ණ දෘශ්යතාව) වෙස්මුහුණක් සාදන්න
51ifself.mask\_memisNoneorself.mask\_mem.shape[1]\<m\_lenorself.mask\_mem.shape[0]\<len(x):52self.mask\_mem=self.mask\_x.new\_ones(len(x),m\_len,1)
මතකයක්තිබේ නම් වෙස් මුහුණු සංයුක්ත කරන්න
55ifm\_len:56mask=torch.cat((self.mask\_mem[:len(x),:m\_len],self.mask\_x[:len(x),:len(x)]),dim=1)
පසුකාලීනආවරණ වෙනත් ආකාරයකින් භාවිතා කරන්න
58else:59mask=self.mask\_x[:len(x),:len(x)]
ටෝකන්කාවැද්දීම්
62x=self.src\_embed(x)
ට්රාන්ස්ෆෝමරයහරහා එය ධාවනය කරන්න
64res,mem=self.transformer(x,mem,mask)
ඊළඟටෝකනයේ පිවිසුම් ජනනය කරන්න
66res=self.generator(res)
68returnres,mem
අපිඅත්හදා බැලීම ආරම්භ කරන විට පෙරනිමි වින්යාස කළ හැකි අතර එය අධික ලෙස ධාවනය වනු ඇත
71classConfigs(NLPAutoRegressionConfigs):
78model:AutoregressiveModel
ටෝකන්කාවැද්දීමේ ප්රමාණය
81d\_model:int=128
අවධානයයොමු ප්රධානීන් ගණන
83heads:int=4
අතහැරදැමීමේ සම්භාවිතාව
85dropout:float=0.0
FFNසැඟවුණු ස්ථරයේ විශේෂාංග ගණන
87d\_ff:int=256
ට්රාන්ස්ෆෝමර්ස්ථර ගණන
89n\_layers:int=6
තබාගත යුතු මතකයන් ගණන
91mem\_len:int=128
පුහුණුවසහ වලංගු කිරීම අතර මාරුවීමේදී මතකයන් පවත්වා ගැනීම සඳහා රාජ්ය මොඩියුලය
93memory=SimpleStateModule()
95definit(self):
ට්රැකර්වින්යාසයන් සකසන්න
97tracker.set\_scalar("accuracy.\*",True)98tracker.set\_scalar("loss.\*",True)
මොඩියුලප්රතිදානයන් ලොග් කිරීමට කොක්කක් එක් කරන්න
100hook\_model\_outputs(self.mode,self.model,'model')
මෙයපුහුණුව සහ වලංගු කිරීම සඳහා නිරවද්යතා මෙට්රික් සංඛ්යාන සහ මතකයන් වෙනම තබා ගනී.
102self.state\_modules=[self.accuracy,self.memory]
මතකයන්සංකෝචනය කර උපරිම මතකයන් තබා ගැනීම සඳහා පැරණි mem_len මතකයන් ඉවත් කරන්න.
104defmerge\_memory(self,old\_mem,new\_mem):
එයවින්යාස කර ඇත්නම් මතකය භාවිතා නොකිරීමට
111ifself.mem\_len==0:112return[]
පැරණිමතකය සමඟ සංයුක්ත වන්න
115ifold\_mem:116mem=[torch.cat((m,x),dim=0)form,xinzip(old\_mem,new\_mem)]117else:118mem=new\_mem
පැරණිමතකයන් ඉවත් කරන්න
121iflen(mem[0])\>self.mem\_len:122mem=[m[-self.mem\_len:]forminmem]
125returnmem
127defstep(self,batch:any,batch\_idx:BatchIndex):
උපාංගයවෙත දත්ත ගෙනයන්න
133data,target=batch[0].to(self.device),batch[1].to(self.device)
පුහුණුප්රකාරයේදී ගෝලීය පියවර යාවත්කාලීන කරන්න (සැකසූ ටෝකන ගණන)
136ifself.mode.is\_train:137tracker.add\_global\_step(data.shape[0]\*data.shape[1])
ආකෘතිප්රතිදානයන් ග්රහණය කර ගත යුතුද යන්න
140withself.mode.update(is\_log\_activations=batch\_idx.is\_last):
මතකයන්ලබා ගන්න
142mem=self.memory.get()
ආකෘතියධාවනය කරන්න
144output,new\_mem=self.model(data,mem)
මතකයඒකාබද්ධ කරන්න
146mem=self.merge\_memory(mem,new\_mem)
මතකයන්යාවත්කාලීන කරන්න
148self.memory.set(mem)
හරස්එන්ට්රොපි අලාභය ගණනය කර ලොග් කරන්න
151loss=self.loss\_func(output,target)152tracker.add("loss.",loss)
ගණනයකිරීම සහ ලොග් කිරීමේ නිරවද්යතාවය
155self.accuracy(output,target)156self.accuracy.track()
ආකෘතියපුහුණු කරන්න
159ifself.mode.is\_train:
අනුක්රමිකගණනය කරන්න
161loss.backward()
ක්ලිප්අනුක්රමික
163torch.nn.utils.clip\_grad\_norm\_(self.model.parameters(),max\_norm=self.grad\_norm\_clip)
ප්රශස්තිකරණපියවර ගන්න
165self.optimizer.step()
සෑමයුගලයකම අවසාන කණ්ඩායමේ ආදර්ශ පරාමිතීන් සහ අනුක්රමික ලොග් කරන්න
167ifbatch\_idx.is\_last:168tracker.add('model',self.model)
අනුක්රමිකඉවත්
170self.optimizer.zero\_grad()
ලුහුබැඳඇති ප්රමිතික සුරකින්න
173tracker.save()
175defsample(self):
විමසුමක්ආරම්භ කිරීම
181prompt=self.prompt
මුද්රණයසඳහා ප්රතිදානය එකතු කරන්න
183log=[(prompt,Text.subtle)]
මතකය
185mem=[]
සාම්පල25 ටෝකන
187foriinmonit.iterate('Sample',25):
විමසුමටෝකෙන්කරන්න
189data=self.text.text\_to\_i(prompt).unsqueeze(-1)
උපාංගයවෙත ගෙන යන්න
191data=data.to(self.device)
ආදර්ශප්රතිදානය ලබා ගන්න
193output,new\_mem=self.model(data,mem)
ආදර්ශඅනාවැකිය ලබා ගන්න (කෑදර)
195output=output.argmax(dim=-1).squeeze(1)
විමසුමටඅනාවැකිය එක් කරන්න
197prompt+=self.prompt\_separator+self.text.itos[output[-1]]
ඊළඟපුනරාවර්තනයේදී අවසාන චරිතය ආකෘතියට පමණක් පෝෂණය කරන්න, විවේකය මතකයන් ලෙස ඉදිරියට යනු ඇත
199prompt=prompt[-1:]
ලොග්වීම සඳහා අනාවැකිය එක් කරන්න
201log+=[(self.prompt\_separator+self.text.itos[output[-1]],Text.value)]
මතකයයාවත්කාලීන කරන්න
203mem=self.merge\_memory(mem,new\_mem)
නියැදිප්රතිදානය මුද්රණය කරන්න
206logger.log(log)
209@option(Configs.model)210defautoregressive\_model(c:Configs):
214fromlabml\_nn.transformers.xlimportRelativeMultiHeadAttention215fromlabml\_nn.transformers.feed\_forwardimportFeedForward216m=AutoregressiveModel(c.n\_tokens,c.d\_model,TransformerXL(217TransformerXLLayer(d\_model=c.d\_model,218self\_attn=RelativeMultiHeadAttention(c.heads,c.d\_model,c.dropout),219feed\_forward=FeedForward(c.d\_model,c.d\_ff,c.dropout),220dropout\_prob=c.dropout),c.n\_layers))221returnm.to(c.device)
224defmain():
අත්හදාබැලීම සාදන්න
229experiment.create(name="transformer\_xl",comment='')
වින්යාසසාදන්න
231conf=Configs()
වින්යාසයන්පූරණය කරන්න
233experiment.configs(conf,
අභිබවායාම සඳහා වින්යාසයන් පිළිබඳ ශබ්දකෝෂයක්
235{'tokenizer':'character',236'text':'tiny\_shakespeare',237'optimizer.learning\_rate':1.,238'optimizer.optimizer':'Noam',239'prompt':'It is',240'prompt\_separator':'',241242'train\_loader':'sequential\_train\_loader',243'valid\_loader':'sequential\_valid\_loader',244245'seq\_len':2,246'mem\_len':32,247'epochs':128,248'batch\_size':32,249'inner\_iterations':25,250})
ඉතිරිකිරීම සහ පැටවීම සඳහා ආකෘති සකසන්න
253experiment.add\_pytorch\_models({'model':conf.model})
අත්හදාබැලීම ආරම්භ කරන්න
256withexperiment.start():
TrainValidConfigs.run
258conf.run()
262if\_\_name\_\_=='\_\_main\_\_':263main()