
    Αi`                     
   S SK r S SKrS SKrS SKJr  S SKrS SKJr  S SKJrJ	r	  S SK
JrJr  S SKJr  S SKJr  S SKJrJrJr  S S	KJrJr  S
SKJr  S
SKJr  S
SKJr  S
SKJrJ r    " S S\5      r! " S S5      r" " S S5      r#g)    N)defaultdict)core)not_to_static	to_static)ProgramTranslatorStaticFunction)as_not_paddle_func)Layer)	Parameterglobal_scopeprogram_guard)DEFAULT_AMP_OPTIONSprepare_op_amp_options   )	Converter)TensorDistAttr)get_world_process_group)
get_loggerto_listc                     ^  \ rS rSrSrU 4S jr\R                  R                  S 5       r	S r
S rS r\S 5       rS	 rS
 rS rS r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rSrU =r$ )
ProxyLayer)   z
ProxyLayer implements all logic for converting dygraph model into
static Program IR. Meanwhile, it provides conventional interfaces for
auto parallel to visit feed/fetch/loss/metric variables.
c                   > [         TU ]  5         Xl        X l        X0l        S U l        [        [        5      U l        [        [        5      U l	        [        [        5      U l
        [        [        5      U l        [        [        5      U l        [        [        5      U l        S H5  n[        [        R                   " ["        5      R$                   SU 35        M7     g )N)_train_eval_predict	call_losscall_metricsz.ProxyLayer.)super__init__inner_layer	loss_funcmetricsmoder   list_input_vars_label_vars_output_vars
_loss_vars_loss_names_metric_varsr	   inspect	getmoduler   __name__)selflayerr"   r#   fn_name	__class__s        n/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/distributed/auto_parallel/static/helper.pyr    ProxyLayer.__init__0   s     "	 't,&t,'-%d+&t,'-
G $$Z099:,wiP
    c                     [         R                  R                  R                  S5      n[         R                  R                  U R                  U   U5        X R                  U'   g )Nloss)paddleutilsunique_namegenerate_C_opsset_persistable_valuer)   r*   )r/   r$   names      r3   append_loss_to_shadow_output'ProxyLayer.append_loss_to_shadow_outputN   sG    ||''008++DOOD,A4H!%r5   c                    SnXR                   U'   X R                  U'   U R                  " U6 U R                  U'   U R	                  U R
                  U5      nU R                  U5      U R                  U'   [        R                  R                  R                  S5      S   (       a  U R                  U5        U R                  U5      U R                  U'   g)z>
Train process of inner_layer with forward/loss/metric logic.
trainFLAGS_enable_pir_apiNr&   r'   r!   r(   _prepareoutput_varsr   r)   r8   base	framework	get_flagsr?   r   r+   r/   inputslabelsr$   
new_inputss        r3   r   ProxyLayer._trainT   s    
 !'!' #'"2"2F";$ ]]4#3#3V<
 $z :;;  **+AB"
 --d3 #'"3"3J"?$r5   c                    SnXR                   U'   X R                  U'   U R                  " U6 U R                  U'   U R	                  U R
                  U5      nU R                  U5      U R                  U'   [        R                  R                  R                  S5      S   (       a  U R                  U5        U R                  U5      U R                  U'   g)zA
Evaluate process of inner_layer with forward/loss/metric logic.
evalrC   NrD   rJ   s        r3   r   ProxyLayer._evalk   s     !'!' #'"2"2F";$ ]]4#3#3V<
 $z :;;  **+AB"
 --d3 #'"3"3J"?$r5   c                 x    SnXR                   U'   X R                  U'   U R                  " U6 U R                  U'   g)z4
Predict process of inner_layer with forward logic.
predictN)r&   r'   r!   r(   )r/   rK   rL   r$   s       r3   r   ProxyLayer._predict   sB    
 !'!' #'"2"2F";$r5   c                 0    [        U5      [        U5      -   $ )ze
Concat outputs and labels as a single list

NOTE(dev): We use @not_to_static to avoid AST Analysis.
)r   )r/   outputsrL   s      r3   rE   ProxyLayer._prepare   s     w'&/11r5   c                 B    / nU R                   b  U R                   " U6 nU$ )zg
Apply Loss Function on outputs and labels.

Args:
    inputs: List[Variable]

Returns: List[Variable]
)r"   )r/   rK   ress      r3   r   ProxyLayer.call_loss   s&     >>%..&)C
r5   c                 ~    / nU R                    H*  nUR                  [        UR                  " U6 5      5        M,     U$ )zj
Apply Metrics Function on outputs and labels.

Args:
    inputs: List[Variable]

Returns: List[Variable]
)r#   appendr   compute)r/   rK   outsmetrics       r3   r   ProxyLayer.call_metrics   s8     llFKK 789 # r5   c                 $    Xl         US:H  U l        g )NrB   )r$   trainingr/   r$   s     r3   set_modeProxyLayer.set_mode   s    	r5   c                 X    [        U R                  U R                  U R                  5      $ N)r   r!   r"   r#   r/   s    r3   cloneProxyLayer.clone   s    $**DNNDLLIIr5   c                 4    U R                   U R                     $ rg   )r&   r$   rh   s    r3   
input_varsProxyLayer.input_vars       		**r5   c                 4    U R                   U R                     $ rg   )r'   r$   rh   s    r3   
label_varsProxyLayer.label_vars   rn   r5   c                 4    U R                   U R                     $ rg   )r(   r$   rh   s    r3   rF   ProxyLayer.output_vars         ++r5   c                 4    U R                   U R                     $ rg   )r)   r$   rh   s    r3   	loss_varsProxyLayer.loss_vars   s    tyy))r5   c                 4    U R                   U R                     $ rg   )r*   r$   rh   s    r3   
loss_namesProxyLayer.loss_names   rn   r5   c                 4    U R                   U R                     $ rg   )r+   r$   rh   s    r3   metric_varsProxyLayer.metric_vars   rt   r5   c                 6    U R                   R                  5       $ rg   )r!   _startup_programrh   s    r3   startup_programProxyLayer.startup_program   s    0022r5   )r&   r'   r*   r)   r+   r(   r!   r"   r#   r$   rb   )r.   
__module____qualname____firstlineno____doc__r    r8   jitr   r?   r   r   r   rE   r   r   rd   ri   propertyrl   rp   rF   rv   ry   r|   r   __static_attributes____classcell__)r2   s   @r3   r   r   )   s    < ZZ& &
@.@4
< 2 2(J + + + + , , * * + + , , 3 3r5   r   c                   0    \ rS rSrS rSS jrS rS rSrg)		BuildInfo   c                 $    U R                  5         g rg   )clearrh   s    r3   r    BuildInfo.__init__   s    

r5   c                 T    U R                   U   nU(       a  U R                  U5        U$ rg   )statescache)r/   r$   updateis_caches       r3   	has_cacheBuildInfo.has_cache   s$    ;;t$JJtr5   c                 "    SU R                   U'   g )NTr   rc   s     r3   r   BuildInfo.cache   s     Dr5   c                 ,    [        [        5      U l        g rg   )r   boolr   rh   s    r3   r   BuildInfo.clear   s    !$'r5   r   N)F)	r.   r   r   r   r    r   r   r   r    r5   r3   r   r      s    !(r5   r   c                       \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS rSrg)ProgramHelper   zX
A Helper class for Engine to provides different Program IR according specified 'mode'.
c                     [        XU5      U l        X@l        XPl        [	        5       U l        [        [        R                  5      U l	        SU l
        0 U l        g )NF)r   proxy_layerinputs_speclabels_specr   
build_infor   loggingINFO_logger	lazy_init_all_params_dist_attr)r/   r0   r"   r#   r   r   s         r3   r    ProgramHelper.__init__   sG     &e@&&#+!',,/%'"r5   c                 v    U R                   R                  5         U R                  R                  5       U l        g)z$
Reset all state of current Object.
N)r   r   r   ri   rh   s    r3   resetProgramHelper.reset   s+     	++113r5   c                    US;   d   eU R                   R                  U5        U R                  R                  US5      (       a   U R                  R                  SU S35        gU R                  R                  SU S35        U R                  U R                  /n[        U R                  5       USS9nS	U-   n[        U R                   XC5        [        U R                   U5      R                  n[        R                  R                  R!                  S
5      S
   (       d8  [#        UR$                  [&        R(                  " 5       R*                  [,        5        U R/                  5         g)z/
Convert dygraph model into static Program IR.
rB   rP   rS   Tz"Already build program with mode = z, use cached program.Nz"start to build program for mode = .)
input_spec
full_graph_rC   )r   rd   r   r   r   infor   r   r   static_funcsetattrgetattrconcrete_programr8   rG   rH   rI   r   main_programr   get_instance_amp_recordsr   _build_startup_program)r/   r$   r   r   	func_namer   s         r3   build_programProgramHelper.build_program  s=    3333!!$'??$$T400LL4TF:OP >tfAFG&&(8(89
:$
 $J	  )9 #4#3#3Y?PP
 {{$$../EF"
 # --!..0==#
 	##%r5   c                 R   U R                   n[        UR                  5       R                  5      S:  a  SU l        gU R
                  R                   HR  n[        UR                  UUR                  UR                  UR                  UR                  UR                  5       S9  MT     g)z2
Create and Sync parameters into startup program.
r   TN)r>   desctypeshapedtypestop_gradientblock)r   lenglobal_blockopsr   r   
parametersr   r>   r   r   r   r   )r/   r   params      r3   r   $ProgramHelper._build_startup_program,  s     ..++-112Q6!DN**55EZZZZkkkk#11%224 6r5   c                 h   U R                  U5        U R                  R                  S[        U5      R                  5        UR
                  nSUl        [        U R                  U R                  5         UR                  U R                  S   5      nSSS5        X!l        W$ ! , (       d  f       N= f)z4
Append backward and generate optimizer operations.
zstart to apply optimizer: %s Nr   )_verify_optimizerr   r   r   r.   _parameter_listr   r   r   minimizerv   )r/   	optimizeroriginal_paramsrY   s       r3   apply_optimizerProgramHelper.apply_optimizer@  s     	y)+T)_-E-E	
 $33$(	!4,,d.B.BC$$T^^A%67C D %4!
 DCs   4B##
B1c                    Uc   e[        US5      (       d   S5       eU R                  R                  S:X  d   SU R                  R                   S35       e[        U R                  5      S:X  d   S[        U R                  5       35       eg )Nr   z&Optimizer must have minimize() method.rB   z(Required mode == 'train', but received ''r   z<Required len(loss_vars) == 1, but received len(loss_vars) = )hasattrr   r$   r   rv   )r/   r   s     r3   r   ProgramHelper._verify_optimizerR  s    $$$y*-- 	
4	
- $$/ 	
6t7G7G7L7L6MQO	
/ 4>>"a' 	
J3t~~K^J_`	
'r5   c                     US;   d   e[        U R                  SU-   5      n[        U[        5      (       d   S5       eU R                  R	                  U5        g)z3
Switch underly proxy layer mode into target mode.
r   r   (Please call build_program(mode) firstly.N)r   r   
isinstancer   rd   )r/   r$   funcs      r3   toProgramHelper.to^  s\     3333t''t4$// 	
6	
/ 	!!$'r5   c                     U R                   R                  S;   d   S5       eSU R                   R                  -   n[        U R                   U5      $ )z:
Return StaticFunction instance with underly target mode.
r   r   r   )r   r$   r   )r/   r   s     r3   r   ProgramHelper.static_funci  s\     $$ )
 
 	6 6		6 

 $**///	t''33r5   c                 	   UR                  5       R                  5       n0 n0 nU H  nXdUR                  '   M     U R                  R                  S   nU R                  R                  S   n[        [        U5      5       H5  n	X   R                  U;   d  M  UU	   R                  XWU	   R                  '   M7     Sn
U GH  nUR                  5       (       a  U R                  UR                     u  p[        5       nXl
        Xl        Sn
[        R                  " 5          [        R                  R                  R!                  X5      nS S S 5        WR#                  5       (       a.  UR%                  5       R'                  UR%                  5       5        O UR%                  5       R)                  5         S nUc  M  UR                  U;  a!  UR%                  5       R)                  5         GM,  UR#                  5       (       d  GMD  UR+                  5       (       Ga  X[R                     nUU   nUR-                  5       (       d   SUR                   S35       eUR/                  5       R                  UR/                  5       R                  R0                  UR/                  5       R                  R2                  S.n[5        5       R7                  U5      R%                  5       n[8        R:                  " UR=                  5       U5      nUR?                  UU5        UR%                  5       R)                  5         GMx  UR                  5       (       d  GM  X[R                     nUU   n[5        5       R7                  U5      R%                  5       nUR'                  UR%                  5       R%                  5       5        UR%                  5       R)                  5         GM     [A        5       nU
(       a  URB                  S:  a  [        RD                  RG                  5       S:  a  [        RH                  " 5         [        RJ                  " S/SSS	9n[        RL                  R                  RO                  5       (       d"  [        RP                  RS                  UUS
S5        [        RT                  " 5         g g g g ! , (       d  f       GNm= f)Nr   r   FTzparam [z] is not dist tensor typedims_mappingprocess_shapeprocess_groupint32r   ring_id)+r   all_parametersr>   r   r   ranger   is_distr   r   process_meshr   r8   no_gradrG   r   reshard_is_initialized
get_tensor_share_data_with_clearis_denseis_dist_dense_tensor_type	dist_attrr   process_idsr   varr   slice_with_dist_attrnumpysetr   nranksdistributedget_world_sizedisable_staticfullrH   is_compiled_with_xpu_legacy_C_opsbarrierenable_static)r/   r   placeparam_valuesvalue_name_to_valuedy_param_name_to_pir_param_namevalue	dy_params	pir_paramiis_commr   r   r   var_dist_attrtmp
value_namer   pir_scope_paramsliced_paramworld_groupbarrier_tensors                         r3   init_pirProgramHelper.init_piru  s   #002AAC *,'!E.3

+ " ))44Q7	))44Q7	s9~&A|  $77ENF$ 0!0A0AB ' E}}-1-G-GJJ.* !/ 0-9*-9*^^% ++**225HC &&&(($$&778HI $$&--/ E }zz!@@  "))+((**~~<ZZH
+J76688 ejj\)BC8 %*OO$5$B$B%*__%6%C%C%I%I%*__%6%C%C%O%O	 #/."4"4Z"@"K"K"M(==KKM9   ##L%8  "))+<ZZH
+J7".."4"4Z"@"K"K"M00$$&113   "))+q t ./""Q&""113a7!!##[[!aw?N##((==??$$,,"NIq   " 8 ' g &%s   *R..
R=	c           	         U R                   (       a  g UR                  R                  n[        R                  " UR                  5       5      nUR                  =(       a    US   S;   nSnU R                  R                   GH&  nUR                  5       (       a  U R                  R                  n	U	R                  5       R                  UR                     n
UR                  U
5      nSn[        R                   " 5          [        R"                  R$                  R'                  X5      nS S S 5        WR)                  5       (       a.  UR+                  5       R-                  UR+                  5       5        O UR+                  5       R/                  5         S n[        R0                  R3                  5         Uc  GM7  UR                  UR                  5       R                  ;  a!  UR+                  5       R/                  5         GM  UR)                  5       (       d  GM  UR5                  5       (       Ga  UR                  5       R                  UR                     n
UR                  U
5      nUR6                  UR8                  R:                  UR8                  R<                  S.n[?        5       RA                  UR                  5      R+                  5       n[B        RD                  " URG                  5       U5      nURI                  X5        U(       d!  UR+                  5       R/                  5         GM  GM  UR                  5       (       d  GM  [?        5       RA                  UR                  5      R+                  5       nUR-                  UR+                  5       R+                  5       5        GM)     U(       Ga  U R                  R                   GH  nUS   n[?        5       RK                  UR                  5      nU(       d  M5  URL                  [        RN                  [        RP                  4;   a  Me  [?        5       RA                  UR                  5      R+                  5       nU(       a  UR)                  5       (       d   SUR                   S35       eUnUR5                  5       (       Ga  UR                  5       R                  UR                     n
UR                  U
5      nUR6                  UR8                  R:                  UR8                  R<                  S.n[B        RD                  " URG                  5       U5      n[        R"                  RR                  RU                  5          [        RV                  " XRX                  S	9nS S S 5        UR+                  5       R/                  5         [        R"                  RR                  RU                  5          US
:X  a  [        R                   " 5          [        R"                  RZ                  R]                  US	9   UR_                  [$        R`                  Rb                  Rd                  S9nS S S 5        S S S 5        OUS:X  a  [        R                   " 5          [        R"                  RZ                  R]                  US	9   UR_                  [$        R`                  Rb                  Rf                  S9nS S S 5        S S S 5        UR+                  5       R/                  5         WR                  5       (       a.  UR-                  UR+                  5       R+                  5       5        OUR-                  UR+                  5       5        S S S 5        GM     [i        5       nU(       a  URj                  S:  a  [        Rl                  Ro                  5       S:  a  [        Rp                  " 5         [        Rr                  " S/SSS9n[        RZ                  R$                  Ru                  5       (       d"  [        Rv                  Ry                  UUSS5        [        Rz                  " 5         g g g g ! , (       d  f       GN!= f! , (       d  f       GN= f! , (       d  f       GN%= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GM  = f)Nlevel)o2o3FTr   r   zParameter: z1 is not put into global_scope or not initialized.)r  float16r   bfloat16r   r   r   r   )>r   strategyampcopydeepcopyto_dictenabler   r   r   r   r   varsr>    get_tensor_dist_attr_for_programr8   r   rG   r   r   r   r   r   r   devicesynchronizer   r   r   r   r   r   r   r   r   r   r   find_varr   r  r  dygraphguard	to_tensorr  rH   _dygraph_place_guardcastVarDescVarTypeFP16BF16r   r   r   r   r   r   r  r  r  r  )r/   r   r  dist_contextamp_strategy
amp_configneed_cast_parameterr  r   serial_main_programr   r  r  r   param_tensorr  dense_tensor	amp_dtype	scope_varscope_tensor
param_usedt_castedr  r  s                           r3   initProgramHelper.init  s   >>#,,00]]<#7#7#9:
*11 
j6I N
 7
 **55E}}&*&;&;&H&H#)668==ejjI , M M! ^^% ++**225HC &&&(($$&778HI $$&--/ EMM%%' }zz!:!:!<!A!AA  "))+((**~~"//166uzzB , M M! %2$>$>%2%?%?%E%E%2%?%?%K%K	  ,~11%**=HHJ(==KKM9    5*$$&--/ ++~11%**=HHJ--e.>.>.@.K.K.MNe 6j ..99&w/	(N33EJJ?	 ;;6>>6??"CC+~11%**=HHJ \%A%A%C%C !%**-^_C #
 >>##&335::5::FC$EEcJ " )6(B(B)6)C)C)I)I)6)C)C)O)O!I $-#A#Ay$L  ,,224%+%5%5(&
 5 $$&--/[[((..0 I-"NN,"KK11FF&+ G  (2&*ll&:&:&?&? (7 (H	 -, #j0"NN,"KK11FF&+ G  (2&*ll&:&:&?&? (7 (H	 - ))+224''))$55$//1<<> %55h6I6I6KL= 10I :H ./""Q&""113a7!!##[[!aw?N##((==??$$,,"NIq   " 8 ' g &%X 54  -,  -, 10s   >*a%ab..(a82a&	a8$b.4(b2b
	bBb.
a	
a#	&
a50a88
bb.

bb
b+&b..
b>	c                     U HO  nUR                  5       nU(       d  M  UR                  nUR                  nUU/U R                  UR                  '   MQ     g rg   )r   r   r   r   r>   )r/   
all_paramsparam_valuer   r   r   s         r3   cache_whole_graph_dist_attr)ProgramHelper.cache_whole_graph_dist_attrd  sT    %K#--/Iy(55(55  @**;+;+;< &r5   c                 6    U R                  5       R                  $ rg   )r   r   rh   s    r3   r   ProgramHelper.concrete_programo  s    !222r5   c                 .    U R                   R                  $ rg   )r   r   rh   s    r3   r   ProgramHelper.main_programs  s    $$111r5   c                      U R                   R                  $ ! [         aR  nU R                  R	                  S5        [        U[        5      (       a  U R                  R                  s S nA$ UeS nAff = f)Nz0The startup_program is not built by `lazy init`.)r   r   	Exceptionr   warningr   AssertionErrorr   )r/   errs     r3   r   ProgramHelper.startup_programw  sd    	##333 	LL  B #~..,,<<<I	s!    
A4AA/'A4-A//A4c                 @    [        U R                  R                  5      $ rg   )r   r   rl   rh   s    r3   rl   ProgramHelper.input_vars      t''2233r5   c                 @    [        U R                  R                  5      $ rg   )r   r   rF   rh   s    r3   rF   ProgramHelper.output_vars      t''3344r5   c                 @    [        U R                  R                  5      $ rg   )r   r   rp   rh   s    r3   rp   ProgramHelper.label_vars  rP  r5   c                 @    [        U R                  R                  5      $ rg   )r   r   rv   rh   s    r3   rv   ProgramHelper.loss_vars  s    t''1122r5   c                 @    [        U R                  R                  5      $ rg   )r   r   ry   rh   s    r3   ry   ProgramHelper.loss_names  rP  r5   c                 @    [        U R                  R                  5      $ rg   )r   r   r|   rh   s    r3   r|   ProgramHelper.metric_vars  rS  r5   c                     U R                  5       nUR                  U R                  U R                  5      S   nUR                   Vs0 s H  o3R
                  U_M     sn$ s  snf )N)r   get_concrete_programr   r   _paramsr>   )r/   r   partial_programr   s       r3   named_parametersProgramHelper.named_parameters  sb    &&(%::d..

 0?/F/FG/Fe

E!/FGGGs   A!)r   r   r   r   r   r   r   N)r.   r   r   r   r   r    r   r   r   r   r   r   r   r  r=  rB  r   r   r   r   rl   rF   rp   rv   ry   r|   ra  r   r   r5   r3   r   r      s    (4%&N($

	(
4Y#vR#h	 3 3 2 2 	 	 4 4 5 5 4 4 3 3 4 4 5 5Hr5   r   )$r  r,   r   collectionsr   r8   r   
paddle.jitr   r   'paddle.jit.dy2static.program_translatorr   r   paddle.jit.dy2static.utilsr	   	paddle.nnr
   paddle.staticr   r   r   paddle.static.amp.fp16_utilsr   r   	converterr   dist_attributer   r   r   r9   r   r   r   r   r   r   r5   r3   <module>rl     si       #   / :  @ @
 ! * 2 &o3 o3d( ("uH uHr5   