Back to Annotated Deep Learning Paper Implementations

සම්පීඩ්යතාට්රාන්ස්ෆෝමර් අත්හදා බැලීම

docs/si/transformers/compressive/experiment.html

latest18.7 KB
Original Source

hometransformerscompressive

View code on Github

#

සම්පීඩ්යතාට්රාන්ස්ෆෝමර් අත්හදා බැලීම

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

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()

Trending Research Paperslabml.ai