docs/si/transformers/switch/experiment.html
මෙයස්විච් ට්රාන්ස්ෆෝමරයක් පුහුණු කිරීම සඳහා කරන ලද පයිටෝර්ච් අත්හදා බැලීමකි.
15importtorch16importtorch.nnasnn1718fromlabmlimportexperiment,tracker19fromlabml.configsimportoption20fromlabml\_helpers.moduleimportModule21fromlabml\_helpers.train\_validimportBatchIndex22fromlabml\_nn.experiments.nlp\_autoregressionimportNLPAutoRegressionConfigs
25classAutoregressiveModel(Module):
30def\_\_init\_\_(self,n\_vocab:int,d\_model:int,transformer:Module):31super().\_\_init\_\_()
ටෝකන්කාවැද්දීම මොඩියුලය
33self.src\_embed=nn.Embedding(n\_vocab,d\_model)
ට්රාන්ස්ෆෝමර්
35self.transformer=transformer
අවසන්ස්ථරය
37self.generator=nn.Linear(d\_model,n\_vocab)38self.mask=None
40defforward(self,x:torch.Tensor):
පසුකාලීනආවරණ ආරම්භ කරන්න
42ifself.maskisNoneorself.mask.size(0)!=len(x):43fromlabml\_nn.transformers.utilsimportsubsequent\_mask44self.mask=subsequent\_mask(len(x)).to(x.device)
ටෝකන්කාවැද්දීම්
46x=self.src\_embed(x)
ට්රාන්ස්ෆෝමරයහරහා එය ධාවනය කරන්න
48res,counts,route\_prob,n\_dropped,route\_prob\_max=self.transformer(x,self.mask)
ඊළඟටෝකනයේ පිවිසුම් ජනනය කරන්න
50res=self.generator(res)
52returnres,counts,route\_prob,n\_dropped,route\_prob\_max
මෙයවිහිදේ NLPAutoRegressionConfigs.
අපිඅත්හදා බැලීම ආරම්භ කරන විට පෙරනිමි වින්යාස කළ හැකි අතර එය අධික ලෙස ධාවනය වනු ඇත
55classConfigs(NLPAutoRegressionConfigs):
64model:AutoregressiveModel65transformer:Module
ටෝකන්කාවැද්දීමේ ප්රමාණය
68d\_model:int=128
අවධානයයොමු ප්රධානීන් ගණන
70heads:int=4
අතහැරදැමීමේ සම්භාවිතාව
72dropout:float=0.0
FFNසැඟවුණු ස්ථරයේ විශේෂාංග ගණන
74d\_ff:int=256
ට්රාන්ස්ෆෝමර්ස්ථර ගණන
76n\_layers:int=6
විශේෂඥයන්සංඛ්යාව
78n\_experts:int=4
පැටවුම්තුලනය කිරීමේ සංගුණකය
80load\_balancing\_loss\_ceof=0.01
රවුටින්සම්භාවිතාව අනුව තෝරාගත් විශේෂ expert ප්රතිදානයන් පරිමාණය කළ යුතුද යන්න
82is\_scale\_prob:bool=True
ටෝකනඅතහරින්න යන්න
84drop\_tokens:bool=False
එක්එක් ආකෘතියේ ධාරිතාව තීරණය කිරීම සඳහා ධාරිතා සාධකය
86capacity\_factor:float=1.0
88definit(self):89super().init()
ලුහුබැඳීමේදර්ශක ආරම්භ කරන්න
91tracker.set\_scalar("lb\_loss.\*",False)92tracker.set\_scalar("route.\*",False)93tracker.set\_scalar("dropped.\*",False)
95defstep(self,batch:any,batch\_idx:BatchIndex):
උපාංගයවෙත දත්ත ගෙනයන්න
101data,target=batch[0].to(self.device),batch[1].to(self.device)
පුහුණුප්රකාරයේදී ගෝලීය පියවර යාවත්කාලීන කරන්න (සැකසූ ටෝකන ගණන)
104ifself.mode.is\_train:105tracker.add\_global\_step(data.shape[0]\*data.shape[1])
ආකෘතිප්රතිදානයන් ග්රහණය කර ගත යුතුද යන්න
108withself.mode.update(is\_log\_activations=batch\_idx.is\_last):
ආදර්ශප්රතිදානයන් ලබා ගන්න.
110output,counts,route\_prob,n\_dropped,route\_prob\_max=self.model(data)
එන්ට්රොපිනැතිවීම ගණනය කර හරස් කරන්න
113cross\_entropy\_loss=self.loss\_func(output,target)
වත්මන්කණ්ඩායම තුළ සැකසූ මුළු ටෝකන ගණන TB
115total=counts.sum(dim=-1,keepdims=True)
එක්එක් විශේෂ expert යා වෙත යොමු කරන ලද ටෝකන වල භාගය fi=T1x∈B∑1{argmaxp(x),i} fi යනු ආගම්මැක්ස් සමාන p(x) වන ටෝකන ගණනයයි i.
119route\_frac=counts/total
මධ්යන්යමාර්ගගත කිරීමේ සම්භාවිතාව Pi=T1x∈B∑pi(x)
122route\_prob=route\_prob/total
බරතුලනය කිරීමේ අලාභය L=Ni=1∑Nfi⋅Pi L යනු තනි තට්ටුවක් සඳහා වන අලාභය වන අතර මෙහිදී අපි සියලු ස්ථර හරහා පාඩු එකතුව ගනිමු.
127load\_balancing\_loss=self.n\_experts\*(route\_frac\*route\_prob).sum()
සංඛ්යානලුහුබඳින්න
130tracker.add('dropped.',total.new\_tensor(n\_dropped)/total)131tracker.add('route.min.',route\_frac.min())132tracker.add('route.max.',route\_frac.max())133tracker.add('route.std.',route\_frac.std())134tracker.add('route.max\_prob.',route\_prob\_max)135tracker.add("loss.",cross\_entropy\_loss)136tracker.add("lb\_loss.",load\_balancing\_loss)
ඒකාබද්ධඅලාභය. බර තුලනය අලාභය වැනි කුඩා දෙයකට සකසා α ඇති සංගුණකය මගින් ගුණ කරනු α=0.01ලැබේ.
141loss=cross\_entropy\_loss+self.load\_balancing\_loss\_ceof\*load\_balancing\_loss
ගණනයකිරීම සහ ලොග් කිරීමේ නිරවද්යතාවය
144self.accuracy(output,target)145self.accuracy.track()
ආකෘතියපුහුණු කරන්න
148ifself.mode.is\_train:
අනුක්රමිකගණනය කරන්න
150loss.backward()
ක්ලිප්අනුක්රමික
152torch.nn.utils.clip\_grad\_norm\_(self.model.parameters(),max\_norm=self.grad\_norm\_clip)
ප්රශස්තිකරණපියවර ගන්න
154self.optimizer.step()
සෑමයුගලයකම අවසාන කණ්ඩායමේ ආදර්ශ පරාමිතීන් සහ අනුක්රමික ලොග් කරන්න
156ifbatch\_idx.is\_last:157tracker.add('model',self.model)
අනුක්රමිකඉවත්
159self.optimizer.zero\_grad()
ලුහුබැඳඇති ප්රමිතික සුරකින්න
162tracker.save()
165@option(Configs.model)166defautoregressive\_model(c:Configs):
170m=AutoregressiveModel(c.n\_tokens,c.d\_model,c.transformer)171returnm.to(c.device)
174@option(Configs.transformer)175defswitch\_transformer(c:Configs):
179fromlabml\_nn.transformers.switchimportSwitchTransformer,SwitchTransformerLayer,SwitchFeedForward180fromlabml\_nn.transformersimportMultiHeadAttention181fromlabml\_nn.transformers.feed\_forwardimportFeedForward182183returnSwitchTransformer(184SwitchTransformerLayer(d\_model=c.d\_model,185attn=MultiHeadAttention(c.heads,c.d\_model,c.dropout),186feed\_forward=SwitchFeedForward(capacity\_factor=c.capacity\_factor,187drop\_tokens=c.drop\_tokens,188is\_scale\_prob=c.is\_scale\_prob,189n\_experts=c.n\_experts,190expert=FeedForward(c.d\_model,c.d\_ff,c.dropout),191d\_model=c.d\_model),192dropout\_prob=c.dropout),193c.n\_layers)
196defmain():
අත්හදාබැලීම සාදන්න
201experiment.create(name="switch\_transformer",comment='')
වින්යාසසාදන්න
203conf=Configs()
වින්යාසයන්පූරණය කරන්න
205experiment.configs(conf,
අභිබවායාම සඳහා වින්යාසයන් පිළිබඳ ශබ්දකෝෂයක්
207{'tokenizer':'character',208'text':'tiny\_shakespeare',209'optimizer.learning\_rate':1.,210'optimizer.optimizer':'Noam',211'prompt':'It is',212'prompt\_separator':'',213214'transformer':'switch\_transformer',215'n\_experts':4,216217'drop\_tokens':True,218'capacity\_factor':1.2,219220'train\_loader':'shuffled\_train\_loader',221'valid\_loader':'shuffled\_valid\_loader',222223'seq\_len':64,224'epochs':128,225'batch\_size':32,226'inner\_iterations':25,227})
ඉතිරිකිරීම සහ පැටවීම සඳහා ආකෘති සකසන්න
230experiment.add\_pytorch\_models({'model':conf.model})
අත්හදාබැලීම ආරම්භ කරන්න
233withexperiment.start():
TrainValidConfigs.run
235conf.run()
239if\_\_name\_\_=='\_\_main\_\_':240main()