docs/si/optimizers/adam_fp16.html
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