docs/si/transformers/compressive/experiment.html
මෙයසම්පීඩ්යතා ට්රාන්ස්ෆෝමර් ආකෘතියක් පුහුණු කිරීම සඳහා කරන ලද පයිටෝච් අත්හදා බැලීමකි.
11fromtypingimportList,Tuple,NamedTuple1213importtorch14importtorch.nnasnn1516fromlabmlimportexperiment,tracker,monit,logger17fromlabml.configsimportoption18fromlabml.loggerimportText19fromlabml\_helpers.metrics.simple\_stateimportSimpleStateModule20fromlabml\_helpers.moduleimportModule21fromlabml\_helpers.train\_validimportBatchIndex,hook\_model\_outputs22fromlabml\_nn.experiments.nlp\_autoregressionimportNLPAutoRegressionConfigs23fromlabml\_nn.transformers.compressiveimportCompressiveTransformer,AttentionReconstructionLoss,\24CompressiveTransformerLayer,Conv1dCompression
27classCompressedMemory(NamedTuple):28mem:List[torch.Tensor]29c\_mem:List[torch.Tensor]
32classAutoregressiveModel(Module):
37def\_\_init\_\_(self,n\_vocab:int,d\_model:int,transformer:CompressiveTransformer):38super().\_\_init\_\_()
ටෝකන්කාවැද්දීම මොඩියුලය
40self.src\_embed=nn.Embedding(n\_vocab,d\_model)
ට්රාන්ස්ෆෝමර්
42self.transformer=transformer
අවසන්ස්ථරය
44self.generator=nn.Linear(d\_model,n\_vocab)
වෙස්මුහුණු
46self.mask\_x=None47self.mask\_mem=None
49defforward(self,x:torch.Tensor,mem:CompressedMemory):
මතකයසහ සම්පීඩිත මතකය ලබා ගන්න
51ifmemisnotNone:52mem,c\_mem=mem.mem,mem.c\_mem53else:54mem=[]55c\_mem=[]
මතකයේමුළු දිග සහ සම්පීඩිත මතකයේ (වෙස් මුහුණු සඳහා)
58m\_len=len(mem[0])ifmemelse059ifc\_mem:60m\_len+=len(c\_mem[0])
ටෝකනසඳහා පසුකාලීන වෙස් මුහුණක් සාදන්න
63ifself.mask\_xisNoneorself.mask\_x.shape[0]\<len(x):64fromlabml\_nn.transformers.utilsimportsubsequent\_mask65self.mask\_x=subsequent\_mask(len(x)).to(x.device)
මතකයසඳහා සියලු (සම්පූර්ණ දෘශ්යතාව) වෙස්මුහුණක් සාදන්න
67ifself.mask\_memisNoneorself.mask\_mem.shape[1]\<m\_lenorself.mask\_mem.shape[0]\<len(x):68self.mask\_mem=self.mask\_x.new\_ones(len(x),m\_len,1)
මතකයක්තිබේ නම් වෙස් මුහුණු සංයුක්ත කරන්න
71ifm\_len:72mask=torch.cat((self.mask\_mem[:len(x),:m\_len],self.mask\_x[:len(x),:len(x)]),dim=1)
වෙනත්ආකාරයකින් පසුකාලීන ආවරණ පමණක් භාවිතා කරන්න
74else:75mask=self.mask\_x[:len(x),:len(x)]
ටෝකන්කාවැද්දීම්
78x=self.src\_embed(x)
ට්රාන්ස්ෆෝමරයහරහා එය ධාවනය කරන්න
80res,mem=self.transformer(x,mem,c\_mem,mask)
ඊළඟටෝකනයේ පිවිසුම් ජනනය කරන්න
82res=self.generator(res)
84returnres,mem
පෙරනිමිවින්යාසයන් අප අත්හදා බැලීම ආරම්භ කරන විට පෙරනිමි වින්යාසයන් ඉක්මවා යා හැකිය.
87classConfigs(NLPAutoRegressionConfigs):
94model:AutoregressiveModel
ටෝකන්කාවැද්දීමේ ප්රමාණය
97d\_model:int=128
අවධානයයොමු ප්රධානීන් ගණන
99heads:int=4
අතහැරදැමීමේ සම්භාවිතාව
101dropout:float=0.0
FFNසැඟවුණු ස්ථරයේ විශේෂාංග ගණන
103d\_ff:int=256
ට්රාන්ස්ෆෝමර්ස්ථර ගණන
105n\_layers:int=6
තබාගත යුතු මතකයන් ගණන
107mem\_len:int=8
පුහුණුවසහ වලංගු කිරීම අතර මාරුවීමේදී මතකයන් පවත්වා ගැනීම සඳහා රාජ්ය මොඩියුලය
109memory=SimpleStateModule()
අවධානයප්රතිසංස්කරණ අලාභය
111attention\_reconstruction\_loss:AttentionReconstructionLoss
සම්පීඩනඅනුපාතය
113compression\_rate:int=4
සම්පීඩිතමතක දිග
115c\_mem\_len:int=128
117definit(self):
ට්රැකර්වින්යාසයන් සකසන්න
119tracker.set\_scalar("accuracy.\*",True)120tracker.set\_scalar("loss.\*",True)
පර්යන්තයේඅවධානය ප්රතිනිර්මාණය කිරීමේ අලාභය මුද්රණය නොකරන්න
122tracker.set\_scalar("ar\_loss.\*",False)
මොඩියුලප්රතිදානයන් ලොග් කිරීමට කොක්කක් එක් කරන්න
124hook\_model\_outputs(self.mode,self.model,'model')
මෙයපුහුණුව සහ වලංගු කිරීම සඳහා නිරවද්යතා මෙට්රික් සංඛ්යාන සහ මතකයන් වෙනම තබා ගනී.
126self.state\_modules=[self.accuracy,self.memory]
නවමතකයන් සංයුක්ත කර පැරණිතම මතකයන් සම්පීඩනය කරන්න.
[email protected]\_grad()129defmerge\_compress\_memory(self,mem:CompressedMemory,new\_mem:List[torch.Tensor])\130-\>Tuple[CompressedMemory,List[torch.Tensor]]:
වින්යාසයන්මතකය භාවිතා නොකිරීමට නියම කරන්නේ නම්
136ifself.mem\_len==0andself.c\_mem\_len==0:137returnCompressedMemory([],[]),[]
මතකයසහ සම්පීඩිත මතකය ලබා ගන්න
140ifmemisnotNone:141mem,c\_mem=mem.mem,mem.c\_mem142else:143mem,c\_mem=[],[]
පැරණිමතකය සමඟ නව මතකයන් සංයුක්ත කරන්න
146ifmem:147mem=[torch.cat((m,x),dim=0)form,xinzip(mem,new\_mem)]148else:149mem=new\_mem
වඩාමතකයන් තිබේ නම් පැරණිතම මතකයන් සම්පීඩනය කරන්න mem_len
152iflen(mem[0])\>self.mem\_len:
සෑදීමටසම්පීඩිත මතකයන් ගණන ගණනය කරන්න ncm=⌈cnm′−Nm⌉, අප සතුව ඇති මතකයන් ගණන nm′ කොතැනද සහ Nm අප නඩත්තු කරන උපරිම මතකයන් ගණන ( mem_len ).
156n\_c\_mem=(len(mem[0])-self.mem\_len+self.compression\_rate-1)//self.compression\_rate
සම්පීඩනයකිරීමට මතකයන් ගණන cncm
158n\_old=n\_c\_mem\*self.compression\_rate
එක්එක් ස්ථරයක් සඳහා සම්පීඩනය කළ යුතු මතකයන් තබා ගැනීමට ලැයිස්තුවක්.
160mem\_to\_compress=[]
එක්එක් ස්ථරයක් සඳහා සම්පීඩිත නොවන මතකයන් තබා ගැනීමට ලැයිස්තුවක්.
162uncompressed\_mem=[]
එක්එක් ස්ථරයේ මතකයන් හරහා ගමන් කරන්න.
164forminmem:
දීමතකයන් බෙදන්න cncm
166cm,m=torch.split(m,[n\_old,len(m)-n\_old])
සම්පීඩනයකිරීමට මතකයන් එකතු කරන්න
168mem\_to\_compress.append(cm)
ඉතිරිමතකයන් එකතු කරන්න
170uncompressed\_mem.append(m)
මතකයන්යාවත්කාලීන කරන්න
172mem=uncompressed\_mem
මතකයන්සංකෝචනය කරන්න
175new\_c\_mem=[]176fori,layerinenumerate(self.model.transformer.layers):177new\_c\_mem.append(layer.compress(mem\_to\_compress[i]))
පැරණිසම්පීඩිත මතකයන් සමඟ අලුතින් සම්පීඩිත මතකයන් සංයුක්ත කරන්න
180ifc\_mem:181c\_mem=[torch.cat((m,nm),dim=0)form,nminzip(c\_mem,new\_c\_mem)]
පැරණිසම්පීඩිත මතකයන් නොමැති නම්
183else:184c\_mem=new\_c\_mem
පැරණිමතකයන් ඉවත් කරන්න
187iflen(c\_mem[0])\>self.c\_mem\_len:188c\_mem=[m[-self.c\_mem\_len:]forminc\_mem]
මතකයන්ගණන අඩු නම් කිසිදු මතකයන් සම්පීඩිත නොවේ mem_len
190else:191mem\_to\_compress=[]
මතකයන්සහ සම්පීඩිත මතකයන් නැවත ලබා දෙන්න. සම්පීඩිත බව මතකයන් ප්රතිසංස්කරණය අහිමි ගණනය කිරීම සඳහා අවශ්ය වේ.
195returnCompressedMemory(mem,c\_mem),mem\_to\_compress
197defstep(self,batch:any,batch\_idx:BatchIndex):
උපාංගයවෙත දත්ත ගෙනයන්න
203data,target=batch[0].to(self.device),batch[1].to(self.device)
පුහුණුප්රකාරයේදී ගෝලීය පියවර යාවත්කාලීන කරන්න (සැකසූ ටෝකන ගණන)
206ifself.mode.is\_train:207tracker.add\_global\_step(data.shape[0]\*data.shape[1])
ආකෘතිප්රතිදානයන් ග්රහණය කර ගත යුතුද යන්න
210withself.mode.update(is\_log\_activations=batch\_idx.is\_last):
මතකයන්ලබා ගන්න
212mem=self.memory.get()
ආකෘතියධාවනය කරන්න
214output,new\_mem=self.model(data,mem)
මතකයඒකාබද්ධ කර සම්පීඩනය කරන්න
216mem,mem\_to\_compress=self.merge\_compress\_memory(mem,new\_mem)
මතකයන්යාවත්කාලීන කරන්න
218self.memory.set(mem)
හරස්එන්ට්රොපි අලාභය ගණනය කර ලොග් කරන්න
221loss=self.loss\_func(output,target)222tracker.add("loss.",loss)
මතකයන්මෙම පියවර සම්පීඩිත නම් අවධානය ප්රතිසංස්කරණය අහිමි ගණනය
225ifmem\_to\_compress:
අවධානයයොමු ප්රතිසංස්කරණය අහිමි ලබා ගන්න
227ar\_loss=self.attention\_reconstruction\_loss(new\_mem,mem\_to\_compress)
ධාවනඅවධානය ප්රතිසංස්කරණ අලාභය
229tracker.add("ar\_loss.",ar\_loss)
අලාභයටඅවධානය ප්රතිසංස්කරණ අලාභය එකතු කරන්න
231loss=loss+ar\_loss
ගණනයකිරීම සහ ලොග් කිරීමේ නිරවද්යතාවය
234self.accuracy(output,target)235self.accuracy.track()
ආකෘතියපුහුණු කරන්න
238ifself.mode.is\_train:
අනුක්රමිකගණනය කරන්න
240loss.backward()
ක්ලිප්අනුක්රමික
242torch.nn.utils.clip\_grad\_norm\_(self.model.parameters(),max\_norm=self.grad\_norm\_clip)
ප්රශස්තිකරණපියවර ගන්න
244self.optimizer.step()
සෑමයුගලයකම අවසාන කණ්ඩායමේ ආදර්ශ පරාමිතීන් සහ අනුක්රමික ලොග් කරන්න
246ifbatch\_idx.is\_last:247tracker.add('model',self.model)
අනුක්රමිකඉවත්
249self.optimizer.zero\_grad()
ලුහුබැඳඇති ප්රමිතික සුරකින්න
252tracker.save()
254defsample(self):
විමසුමක්ආරම්භ කිරීම
260prompt=self.prompt
මුද්රණයසඳහා ප්රතිදානය එකතු කරන්න
262log=[(prompt,Text.subtle)]
මතකය
264mem=CompressedMemory([],[])
සාම්පල25 ටෝකන
266foriinmonit.iterate('Sample',25):
විමසුමටෝකෙන්කරන්න
268data=self.text.text\_to\_i(prompt).unsqueeze(-1)
උපාංගයවෙත ගෙන යන්න
270data=data.to(self.device)
ආදර්ශප්රතිදානය ලබා ගන්න
272output,new\_mem=self.model(data,mem)
ආදර්ශඅනාවැකිය ලබා ගන්න (කෑදර)
274output=output.argmax(dim=-1).squeeze(1)
විමසුමටඅනාවැකිය එක් කරන්න
276prompt+=self.prompt\_separator+self.text.itos[output[-1]]
ඊළඟපුනරාවර්තනයේදී අවසාන චරිතය ආකෘතියට පමණක් පෝෂණය කරන්න, විවේකය මතකයන් ලෙස ඉදිරියට යනු ඇත
278prompt=prompt[-1:]
ලොග්වීම සඳහා අනාවැකිය එක් කරන්න
280log+=[(self.prompt\_separator+self.text.itos[output[-1]],Text.value)]
මතකයයාවත්කාලීන කිරීම සහ සම්පීඩනය කිරීම
282mem,\_=self.merge\_compress\_memory(mem,new\_mem)
නියැදිප්රතිදානය මුද්රණය කරන්න
285logger.log(log)
288@option(Configs.model)289defautoregressive\_model(c:Configs):
293fromlabml\_nn.transformers.xlimportRelativeMultiHeadAttention294fromlabml\_nn.transformers.feed\_forwardimportFeedForward295m=AutoregressiveModel(c.n\_tokens,c.d\_model,CompressiveTransformer(296CompressiveTransformerLayer(d\_model=c.d\_model,297self\_attn=RelativeMultiHeadAttention(c.heads,c.d\_model,c.dropout),298feed\_forward=FeedForward(c.d\_model,c.d\_ff,c.dropout),299dropout\_prob=c.dropout,300compress=Conv1dCompression(c.compression\_rate,c.d\_model)),c.n\_layers))301returnm.to(c.device)
304@option(Configs.attention\_reconstruction\_loss)305defattention\_reconstruction\_loss(c:Configs):
309returnAttentionReconstructionLoss(c.model.transformer.layers)
312defmain():
අත්හදාබැලීම සාදන්න
317experiment.create(name="compressive\_transformer",comment='')
වින්යාසසාදන්න
319conf=Configs()
වින්යාසයන්පූරණය කරන්න
321experiment.configs(conf,
අභිබවායාම සඳහා වින්යාසයන් පිළිබඳ ශබ්දකෝෂයක්
323{'tokenizer':'character',324'text':'tiny\_shakespeare',325'optimizer.learning\_rate':2.5e-4,326'optimizer.optimizer':'AdamW',327'prompt':'It is',328'prompt\_separator':'',329330'train\_loader':'sequential\_train\_loader',331'valid\_loader':'sequential\_valid\_loader',332333'seq\_len':8,334'mem\_len':8,335'epochs':128,336'batch\_size':32,337'inner\_iterations':25,338'compression\_rate':2,339})
ඉතිරිකිරීම සහ පැටවීම සඳහා ආකෘති සකසන්න
342experiment.add\_pytorch\_models({'model':conf.model})
අත්හදාබැලීම ආරම්භ කරන්න
345withexperiment.start():
TrainValidConfigs.run
347conf.run()
351if\_\_name\_\_=='\_\_main\_\_':352main()