Back to Annotated Deep Learning Paper Implementations

අඩක්නිරවද්යතාව පුහුණුව සඳහා ආදම් ප්රශස්තකරණය

docs/si/optimizers/adam_fp16.html

latest7.3 KB
Original Source

homeoptimizers

View code on Github

#

අඩක්නිරවද්යතාව පුහුණුව සඳහා ආදම් ප්රශස්තකරණය

10fromtypingimportDict,Tuple,Optional,Any1112importtorch13fromtorchimportnn14fromtorch.optimimportOptimizer15fromtorch.cuda.ampimportgrad\_scaler16fromcollectionsimportdefaultdict,abc1718fromlabml\_nn.optimizersimportWeightDecay19fromlabml\_nn.optimizers.adamimportAdam

#

අඩක්නිරවද්යතාව පුහුණුව සඳහා ආදම් ප්රශස්තකරණය

අපි ඇඩම් ඔප්ටිමයිසර් දීර් extend කරන නමුත් ශ්රේණි සහ මොහොත ගබඩා කිරීම සඳහා FP32 භාවිතා කරමු.

22classAdamFP16(Adam):

#

29def\_\_init\_\_(self,params,lr:float=1e-3,betas:Tuple[float,float]=(0.9,0.999),eps:float=1e-16,30weight\_decay:WeightDecay=WeightDecay(),optimized\_update:bool=True,31defaults:Optional[Dict[str,Any]]=None):

#

බිට්අනුක්රමික 32 ක් ගබඩා කිරීමේ පරාමිතිය. පහත GradScaler අර්ථ දක්වා ඇති පරිදි මෙය ජනාකීර්ණ වේ.

33self.grad\_fp32={}

#

ඇඩම් ප්රශස්තිකරණ ආරම්භකය අමතන්න

35super().\_\_init\_\_(params,lr,betas,eps,weight\_decay,optimized\_update,defaults)

#

පරාමිතිතත්වයක් ආරම්භ කරන්න

  • state පරාමිතිය ප්රශස්තකරණය රාජ්ය වේ (tensor)

  • group පරාමිති කණ්ඩායමේ ප්රශස්තිකරණ ගුණාංග ගබඩා කරයි

  • param පරාමිතිය tensor වේ θt−1​

සියලුමරාජ්ය ආතතීන් FP32 භාවිතා කරයි.

37definit\_state(self,state:Dict[str,any],group:Dict[str,any],param:nn.Parameter):

#

පරාමිතියමත ගෙන ඇති ප්රශස්තිකරණ පියවර ගණන මෙයයි, t

49state['step']=0

#

අනුක්රමිකක ඝාතීය වෙනස්වන සාමාන්යය, mt​

51state['exp\_avg']=torch.zeros\_like(param,memory\_format=torch.preserve\_format,dtype=torch.float)

#

වර්ගඵලය අනුක්රමික වටිනාකම් ඝාතීය වෙනස්වන සාමාන්යය, vt​

53state['exp\_avg\_sq']=torch.zeros\_like(param,memory\_format=torch.preserve\_format,dtype=torch.float)

#

පරාමිතීන්ගේFP32 පිටපතක් පවත්වා ගන්න

55state['fp32\_copy']=param.to(torch.float)

#

දීඇති පරාමිති ටෙන්සරයක් සඳහා යාවත්කාලීන පියවරක් ගන්න

  • state පරාමිතිය ප්රශස්තකරණය රාජ්ය වේ (tensor)

  • group පරාමිති කණ්ඩායමේ ප්රශස්තිකරණ ගුණාංග ගබඩා කරයි

  • grad පරාමිතිය gt​ සඳහා වත්මන් ඵලය අනුක්රමික tensor වේ θt−1​

  • param පරාමිතිය tensor වේ θt−1​

57defstep\_param(self,state:Dict[str,any],group:Dict[str,any],grad:torch.Tensor,param:torch.nn.Parameter):

#

FP32පරාමිතීන් ලබා ගන්න

68param\_fp32=state['fp32\_copy']

#

ලබාගත හැකි නම් FP32 අනුක්රමික ලබා ගන්න

70grad\_fp32=self.grad\_fp32.get(param,None)71ifgrad\_fp32isnotNone:72delself.grad\_fp32[param]73grad=grad\_fp3274else:

#

එසේනොමැතිනම්, ශ්රේණිය FP32 බවට පරිවර්තනය කරන්න

76grad=grad.to(torch.float)

#

බරක්ෂය වීම ගණනය කරන්න

79grad=self.weight\_decay(param\_fp32,grad,group)

#

ලබා mt​ ගන්න vt​

82m,v=self.get\_mv(state,group,grad)

#

ප්රශස්තිකරණපියවර ගණන වැඩි t කරන්න

85state['step']+=1

#

ආදම් යාවත්කාලීන කිරීම සිදු

88self.adam\_update(state,group,param\_fp32,m,v)

#

පරාමිතීන්සකසන්න

91param.data=param\_fp32.to(param.dtype)

#

අර්ධනිරවද්යතා අනුක්රමික සහිත ග්රේඩියන්ට් පරිමාණය

FP32ශ්රේණියේ භාවිතා කිරීම සඳහා අපි පයිටෝච් ශ්රේණියේ පරිමාණය දිගු කරමු.

94classGradScalerFP16(grad\_scaler.GradScaler):

#

101def\_unscale\_grads\_(self,optimizer:Optimizer,inv\_scale:torch.Tensor,found\_inf:torch.Tensor,102allow\_fp16:bool)-\>Dict[torch.device,torch.Tensor]:103per\_device\_inv\_scale=grad\_scaler.\_MultiDeviceReplicator(inv\_scale)104per\_device\_found\_inf=grad\_scaler.\_MultiDeviceReplicator(found\_inf)105106per\_device\_and\_dtype\_grads=defaultdict(lambda:defaultdict(list))# type: ignore[var-annotated]107108withtorch.no\_grad():

#

පරාමිතීන්හරහා ලූප්

110forgroupinoptimizer.param\_groups:111forparamingroup["params"]:

#

පුහුණුකළ නොහැකි පරාමිතීන් මඟ හරින්න

113ifparam.gradisNone:114continue

#

විරලආතතීන් සඳහා ක්රියාත්මක නොවේ

116ifparam.grad.is\_sparse:117raiseNotImplementedError

#

අපිFP32 ශ්රේණියේ AdamFP16 ප්රශස්තිකරණ කට්ටලය optimizer.grad_fp32[param] භාවිතා කරන්නේ නම්

120ifisinstance(optimizer,AdamFP16):121grad=param.grad.to(torch.float)122optimizer.grad\_fp32[param]=grad

#

එසේනොමැතිනම්, අනුක්රමික FP32 බවට පරිවර්තනය නොකරන්න

124else:125grad=param.grad126127per\_device\_and\_dtype\_grads[grad.device][grad.dtype].append(grad)

#

සියලුමඅනුක්රමික පරිමාණය කරන්න

130fordevice,per\_dtype\_gradsinper\_device\_and\_dtype\_grads.items():131forgradsinper\_dtype\_grads.values():132torch.\_amp\_foreach\_non\_finite\_check\_and\_unscale\_(grads,133per\_device\_found\_inf.get(device),134per\_device\_inv\_scale.get(device))

#

136returnper\_device\_found\_inf.\_per\_device\_tensors

Trending Research Paperslabml.ai