
    Ng=                     @   d Z ddlZddlmZ ddlmZmZmZ ddlZddl	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0  ej1        e2          Z3dhZ4	 	 d6de
j5        fdZ6d Z7d7dZ8	 	 	 	 	 d8de
j5        d#e9d$ee:         d%e9d&ee9         d'e;fd(Z<d) Z=d9d+Z>	 	 	 	 	 	 	 	 d:d/e:d0ee9         d#e9d1e9d2ee;         d3e;d%ee9         d4ee         fd5Z?dS );z\ Optimizer Factory w/ Custom Weight Decay
Hacked together by / Copyright 2021 Ross Wightman
    N)islice)OptionalCallableTuple)group_parameters   )	AdaBelief)	Adafactor)
Adahessian)AdamP)Adan)Lamb)Lars)Lion)	Lookahead)MADGRAD)Nadam)NAdamW)
NvNovoGrad)RAdam)	RMSpropTF)SGDP)SGDWlionh㈵> modelc                    t          |          }g }g }|                                 D ]\\  }}|j        s|j        dk    s|                    d          s||v r|                    |           G|                    |           ]|dd||dgS )Nr   z.bias        )paramsweight_decay)setnamed_parametersrequires_gradndimendswithappend)r   r!   no_weight_decay_listdecayno_decaynameparams          T/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/optim/optim_factory.pyparam_groups_weight_decayr.   *   s    
 344EH--//    e" 	:??dmmG44?@T8T8TOOE""""LL R00,779 9    c                 L     t                      t           fdd          S )Nc                  >    t          t                               S N)tupler   itsizes   r-   <lambda>z_group.<locals>.<lambda>B   s    fR..// r/   r   )iterr4   s   ``r-   _groupr9   @   s,    	bB/////444r/      c                    d }t          | di                               dd           }g }g }|                                 D ];\  }} |||          r|                    |          n|                    |           <t	          |          }	||	| z   }t          t          ||                    }t	          |          d t          |          D             }
|
                    fd|D                        |
S )Nc                      |sdS t          |t          t          f          rt           fd|D                       S                      |          S )NTc                 :    g | ]}                     |          S r   )
startswith).0hpins     r-   
<listcomp>z0_layer_map.<locals>._in_head.<locals>.<listcomp>J   s%    888cS))888r/   )
isinstancer3   listanyr>   )rA   hps   ` r-   _in_headz_layer_map.<locals>._in_headF   s[     	$4UDM** 	$8888R888999<<###r/   pretrained_cfg
classifierc                 $    i | ]\  }}|D ]}||S r   r   )r?   ilrA   s       r-   
<dictcomp>z_layer_map.<locals>.<dictcomp>[   s+    DDD$!Q!DDQADDDDr/   c                     i | ]}|S r   r   )r?   rA   num_trunk_groupss     r-   rM   z_layer_map.<locals>.<dictcomp>\   s    >>>aa)>>>r/   )	getattrgetr#   r'   lenrD   r9   	enumerateupdate)r   layers_per_group
num_groupsrG   head_prefixnames_trunk
names_headrA   _num_trunk_layers	layer_maprO   s              @r-   
_layer_mapr]   E   s/   $ $ $ %!1266::<NNKKJ&&(( T T1 (K 8 8S
!k>P>PQR>S>S ;''-*<=vk+;<<==K;''DD)K"8"8DDDI>>>>:>>>???r/   皙?      ?Fr!   r(   layer_decayend_layer_decayverbosec                 |   t          |          }i }i }t          | d          r't          | |                     d          d          }nt	          |           }t          |                                          dz   }	|	dz
  t          fdt          |	          D                       }
| 	                                D ]\  }}|j
        s|j        dk    s||v rd}d	}nd
}|}|                    |          }d||fz  }||vr|
|         }||g d||<   ||g d||<   ||         d                             |           ||         d                             |           |r6ddl}t                              d|                    |d          z             t          |                                          S )z
    Parameter groups for layer-wise lr decay & weight decay
    Based on BEiT: https://github.com/microsoft/unilm/blob/master/beit/optim_factory.py#L58
    group_matcherF)coarseT)reverser   c              3   (   K   | ]}|z
  z  V  d S r2   r   )r?   rK   r`   	layer_maxs     r-   	<genexpr>z+param_groups_layer_decay.<locals>.<genexpr>x   s,      RR1	A6RRRRRRr/   r*   r   r)   zlayer_%d_%s)lr_scaler!   param_names)rj   r!   r    rk   r    r   Nzparameter groups: 
%s   )indent)r"   hasattrr   rd   r]   maxvaluesrD   ranger#   r$   r%   rQ   r'   json_loggerinfodumps)r   r!   r(   r`   ra   rb   param_group_namesparam_groupsr\   
num_layerslayer_scalesr+   r,   g_decay
this_decaylayer_id
group_name
this_scalerr   rh   s      `               @r-   param_groups_layer_decayr   `   s    344Luo&& &$UE,?,?u,?,M,MW[\\\		 u%%	Y%%''((1,JQIRRRRRj@Q@QRRRRRL--// 9 9e" 	 :??d&::: GJJG%J==y11"h%88
\))%h/J& *!- -j) ' *( (L$ 	*%m4;;DAAAZ *11%8888 Y-

;LUV
0W0WWXXX##%%&&&r/   c                    t          | j        | j        | j        | j                  }t          | dd          
| j        |d<   t          | dd          
| j        |d<   t          | dd          
| j        |d<   t          | dd          |	                    | j
                   t          | d	d          
| j        |d
<   |S )z cfg/argparse to kwargs helper
    Convert optimizer args in argparse args or cfg like object to keyword args for updated create fn.
    )optlrr!   momentumopt_epsNeps	opt_betasbetasr`   opt_argsopt_foreachforeach)dictr   r   r!   r   rP   r   r   r`   rT   r   r   )cfgkwargss     r-   optimizer_kwargsr      s     G6%	  F sIt$$0usK&&2-wsM4((4 #}sJ%%1cl###sM4((4OyMr/   Tc                 @    t          |fi t          |           d|iS )zk Legacy optimizer factory for backwards compatibility.
    NOTE: Use create_optimizer_v2 for new code.
    )r   filter_bias_and_bn)create_optimizer_v2r   )argsr   r   s      r-   create_optimizerr      sE      
t
$
$
$  .   r/   sgdr   ?r   r   r   r   r   param_group_fnc	                 r   t          | t          j                  ryi }
t          | d          r|                                 }
|r ||           }nG|t          | |||
          }d}n/|r|rt          | ||
          }d}n|                                 }n| }|                                }|	                    d          }|d         }|
                    d          rL	 dd	lm}m}m}m} d
}n# t           $ r d}Y nw xY w|rt"          j                                        s
J d            |
                    d          rD	 ddl}d
}n# t           $ r d}Y nw xY w|rt"          j                                        s
J d            t+          d\d|i|	}||                    d|           | |t.          v r|                    dd
           n||d<   |dk    s|dk    r-|                    dd           t3          j        |f|d
d|}n|dk    r-|                    dd           t3          j        |f|dd|}n|dk    rt7          |f|d
d|}n|dk    s|dk    r(|                    dd           t9          |f|d
d|}n|dk    r(|                    dd           t9          |f|dd|}nU|dk    rt3          j        |fi |}n;|dk    rt3          j        |fi |}n!|dk    rt?          |fdd
d|}n	|d k    r3	 t3          j         |fi |}n# tB          $ r tA          |fi |}Y nw xY w|d!k    rtE          |fi |}n|d"k    rtG          |fi |}n|d#k    rt3          j$        |fi |}n|d$k    rtK          |fd%di|}nu|d&k    rtK          |fd%d
i|}n^|d'k    rt3          j&        |fi |}nD|d(k    r*|                    dd)           t3          j'        |fi |}n|d*k    rtQ          |fi |}n|d+k    rtS          |fd,di|}n|d-k    rtS          |fd,d
i|}n|d.k    rtU          |fi |}n|d/k    rtU          |fd0d
i|}n|d1k    rtW          |f|d
d2|}n|d3k    rtW          |fd|i|}nv|d4k    rtW          |f|d
d
d5|}n]|d6k    rtW          |f|d
d|}nE|d7k    rtY          |fd|i|}n.|d8k    rtY          |f|d
d9|}n|d:k    s|d;k    rt[          |fi |}n|d<k    rt3          j.        |fd=|d>|}n|d?k    rt_          |fd=|d>|}n|d@k    r%|                    dd           ta          |fi |}n|dAk    rtc          |fi |}n|dBk    r$|                    dd            ||f|d
d|}n\|dCk    r$|                    dd            ||f|dd|}n2|dDk    r ||fdEdi|}n|dFk    r ||fdEd
i|}n|dGk    r ||fi |}n|dHk    r!|                    dIdJ            ||fi |}n|dKk    r.|                    dd            |j        j        |f|d
d|}n|dLk    r.|                    dd            |j        j2        |f|d
d|}nl|dMk    r-|                    dd            |j        j        |fd|i|}n9|dNk    r-|                    dd            |j        j2        |fd|i|}n|dOk    r |j        j        |fi |}n|dPk    r |j        j3        |fi |}n|dQk    r |j        j        |fi |}n|dRk    r |j        j4        |fi |}n|dSk    r |j        j5        |fi |}n|dTk    r |j        j6        |fi |}nj|dUk    r |j        j7        |fi |}nP|dVk    r |j        j6        |fi |}n6|dWk    r |j        j0        |fi |}n|dXk    r |j        j8        |fi |}nJ tu          |          dZk    r|d         d[k    rtw          |          }|S )]a   Create an optimizer.

    TODO currently the model is passed in and all parameters are selected for optimization.
    For more general use an interface that allows selection of parameters to optimize and lr groups, one of:
      * a filter fn interface that further breaks params into groups in a weight_decay compatible fashion
      * expose the parameters interface and leave it up to caller

    Args:
        model_or_params (nn.Module): model containing parameters to optimize
        opt: name of optimizer to create
        lr: initial learning rate
        weight_decay: weight decay to apply in optimizer
        momentum:  momentum for momentum based optimizers (others may use betas via kwargs)
        foreach: Enable / disable foreach (multi-tensor) operation if True / False. Choose safe default if None
        filter_bias_and_bn:  filter out bias, bn and other 1d params from weight decay
        **kwargs: extra optimizer specific kwargs to pass through

    Returns:
        Optimizer
    no_weight_decayN)r!   r`   r(   r   rZ   fusedr   )FusedNovoGrad	FusedAdam	FusedLAMBFusedSGDTFz+APEX and CUDA required for fused optimizersbnbz1bitsandbytes and CUDA required for bnb optimizersr!   r   r   r   nesterovr   )r   r   r   sgdpsgdw	nesterovw	momentumwadamadamwadampg{Gz?)wd_ratior   nadamnadamwradamadamax	adabeliefrectify
radabeliefadadeltaadagradg:0yE>	adafactoradanpno_proxadanwlamblambc
trust_cliplarc)r   r   larsnlarc)r   r   r   nlarsmadgradmadgradw)r   decoupled_decaynovograd
nvnovogradrmspropr   )alphar   	rmsproptfr   
adahessianfusedsgdfusedmomentum	fusedadamadam_w_mode
fusedadamw	fusedlambfusednovogradr   )gffffff?g\(\?bnbsgd
bnbsgd8bitbnbmomentumbnbmomentum8bitbnbadambnbadam8bitbnbadamwbnbadamw8bitbnblambbnblamb8bitbnblarsbnblarsb8bitbnblionbnblion8bitzInvalid optimizerr   	lookaheadr   )<rC   nnModulern   r   r   r.   
parameterslowersplitr>   apex.optimizersr   r   r   r   ImportErrortorchcudais_availablebitsandbytesr   
setdefault_DEFAULT_FOREACHpopoptimSGDr   r   AdamAdamWr   r   AttributeErrorr   r   Adamaxr	   AdadeltaAdagradr
   r   r   r   r   r   RMSpropr   r   r   SGD8bitAdam8bit	AdamW8bitLAMBLAMB8bitLARSLion8bit
ValueErrorrR   r   )model_or_paramsr   r   r!   r   r   r   r`   r   r   r   r   	opt_lower	opt_splitr   r   r   r   has_apexr   has_bnbr   	optimizers                          r-   r   r      s   @ /29-- %?$566 	@-==??O 	6'88JJ$1)'%4	  J LL 	60 	62?LRabbJLL(3355JJ %
		I$$I"IG$$ e	UUUUUUUUUUUUHH 	 	 	HHH	dEJ3355dd7ddddE"" j	&&&&GG 	 	 	GGG	i5:2244ii6iiii88888H	~D"%%%"""	4000% EY*44UD!!!IjW8dWWhWW			j	 	 UD!!!IjX8eXXxXX			f		RhRRRR			f			[ 8 8UD!!!RhRRRR			k	!	!UD!!!ShSS(SS		 
f		Jz66X66			g		K
77h77			g		*OtdOOhOO			g			6J;;(;;II 	6 	6 	6j55H55III	6	h		:2222			g		*1111			h		L88x88			k	!	!jDD%D8DD			l	"	"jCC$C(CC			j	 	 N:::::			i		E4(((M*9999			k	!	!j55H55			g		??U?h??			g		>>T>X>>			f		00x00			g		AAAAA			f		Th4TT8TT			f		CChC(CC			g		ch4RVccZbcc			g		RhRRRR			i		JFFFXFF			j	 	 J\4\\S[\\			j	 	 I$=$=z66X66			i		M*WC(WWhWW			k	!	!jShSS(SS			f		UD!!!00x00		 
l	"	"z66X66		 
j	 	 UD!!!HZV(TVVXVV			o	%	%UD!!!HZW(UWWhWW			k	!	!IjHHeHxHH			l	"	"IjGGdGhGG			k	!	!Ij55H55			o	%	%G\222!M*9999		 
h		UD!!!!CIM*[x$[[RZ[[			l	"	"UD!!!%CI%j_8d__V^__			m	#	#UD!!!!CIM*LLxL8LL			'	'	'UD!!!%CI%jPP8PxPP			i		"CIN:::::			m	#	#&CI&z>>X>>			j	 	 #CIOJ;;(;;			n	$	$'CI'
??h??			i		"CIN:::::			m	#	#&CI&z>>X>>			i		"CIN:::::			n	$	$&CI&z>>X>>			i		"CIN:::::			m	#	#&CI&z>>X>>		 	-, 9~~Q<;&&!),,Is6   C, ,C;:C;>E EEL L65L6)r   r   )r:   N)r^   r   r_   NF)T)r   Nr   r   NTNN)@__doc__logging	itertoolsr   typingr   r   r   r   torch.nnr   torch.optimr   timm.modelsr   r   r	   r   r
   r   r   r   r   adanr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
rmsprop_tfr   r   r   r   r   	getLogger__name__rs   r   r   r.   r9   r]   floatstrboolr   r   r   r   r   r/   r-   <module>r     se           , , , , , , , , , ,              ( ( ( ( ( (                         " " " " " "                                                             " " " " " "       ! ! ! ! ! !             '
H
%
%
   9 9y9 9 9 9,5 5 5
   : #+- +/=' ='y='=' $Cj=' 	='
 "%=' =' =' =' ='@  .    " "&#''+-1e ee UOe 	e
 e $e !e e_e !*e e e e e er/   