
    pj                         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	  SSK
Jr  SSKJr  S r " S S	5      r " S
 S\	5      rg)    N)
MethodType)PyLayer   )in_auto_dp_mode)FullyShardFusionc                 x   [        USS5      (       a  g SUl        U  GH  u  p4UR                  UU/5        UR                  nUR                  UR                  R                  5       ;   a%  UR                  UR                     nUR                  nUR                  R                  5        H  nUR                  U   U   nUR                  5       (       a  M,  UR                  n	SU;  a!  [        R                  " UR                  5      n
OK[        [        UR                  R                  5      5       Vs/ s H  n[        R                   " 5       PM     n
n[        R"                  " UUR                  U
S9UR                  U   U'   U	UR                  U   U   l        M     GM     S n[%        X5      Ul        g s  snf )N_has_sharded_accumulatorsFTbeta)mesh
placementsc                 \    [        U[        5      (       d  US   nU H  u  p4S Ul        M     g )Nparams)
isinstancelist	main_grad)selfblockparameters_and_gradsparam_s        h/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/paddle/distributed/auto_parallel/fully_shard.py_finish_update_impl/shard_accumulators.<locals>._finish_update_impl>   s.    .55#7#A ,HE"EO -    )getattrr	   _create_accumulatorsname_master_weightskeys_accumulatorsis_distcopydeepcopyr   rangelenprocess_meshshapedist	Replicateshard_tensorr   _finish_update)r   	optimizertarget_blockr   r   target_namemaster_weightkeyaccumulatororigin_accumulator_namer   r   s               r   shard_accumulatorsr3      s   y5u==*.I'(&&G	
 jj::227799%55ejjAM',,K**//1C#11#6{CK""$$&1&6&6#S !]]5+;+;<
 #3u'9'9'?'?#@AA NN$A   9=8I8I''%9I##C(5 - ##C() 2 )>#  **=II's   2F7c                   .    \ rS rSrSS jrS rSS jrSrg)	FullyShardAutoG   c                    U(       a  [        X5        g Xl        X l        [        R                  " SU R                  5      U l        U R                  R                  5        HQ  nSUl        U R
                  R                  U5        [        5       (       a  M6  U R
                  R                  U5        MS     [        5       (       a  U R                  U R                  5        S[        R                  S'   g )Nr   T1skip_sharding3_output_reshard)r   modelr   r(   ShardingStage3	_shard_fn
parameters_need_shard_auto_shard_parameterr   _register_hook_for_param_grad_register_comm_hookosenviron)r   r:   r    enable_tensor_fusion_and_overlapr   s        r   __init__FullyShardAuto.__init__H   s    +U)JI!00DII>DN..0)-&//6&((NN@@G	 1
   ((4:=BJJ67r   c                 (   S nS nS nUR                  SS9 H3  u  pVUR                  U" U5      5        UR                  U" U5      5        M5     UR                  5        H  nUR                  (       d  M  U" U5        M      U R                  U5        g )Nc                 V   ^  [         R                  R                  5       U 4S j5       nU$ )Nc                    > [         R                  R                  5       R                  R	                  S5      nTR
                  R                  5        H  u  p#UR                  U   [         R                  " 5       :w  d  M-  [        R                  " UR                  5      n[         R                  " 5       XA'   [         R                  " X3R                  U5      nUR                  5       R                  UR                  5       5        M     g Ndp)r(   auto_parallelget_mesh	dim_namesindex_parametersitemsr   r)   r"   r#   reshardr&   
get_tensor_share_data_with)r   dp_axisr0   r   new_placementsreplicate_param	sublayerss         r   gather_commRFullyShardAuto._register_comm_hook.<locals>._pre_forward_hook.<locals>.gather_comm[   s    ,,557AAGGM"+"7"7"="="?JC''0DNN4DD)-u7G7G)H26..2B/*.,,!#5#5~+ ((*;;+668 #@r   paddleautogradno_grad)rX   rY   s   ` r   _pre_forward_hook=FullyShardAuto._register_comm_hook.<locals>._pre_forward_hookZ   s*    __$$& ' r   c                 V   ^  [         R                  R                  5       U 4S j5       nU$ )Nc                  <  > [         R                  R                  5       R                  R	                  S5      nTR
                  R                  5        H  u  p#UR                  (       d  M  UR                  U   [         R                  " 5       :X  d  M@  [        R                  " UR                  5      n[         R                  " U5      XA'   [         R                  " X3R                  U5      nUR                  5       R!                  UR                  5       5        M     g rJ   )r(   rL   rM   rN   rO   rP   rQ   	trainabler   r)   r"   r#   ShardrR   r&   rS   rT   )r   rU   r0   r   rV   shard_paramrX   s         r   
shard_commRFullyShardAuto._register_comm_hook.<locals>._post_forward_hook.<locals>.shard_comml   s    ,,557AAGGM"+"7"7"="="?JC!,,W59II)-u7G7G)H26**W2E/&*ll!#5#5~' ((*;;'224 #@r   r[   )rX   rf   s   ` r   _post_forward_hook>FullyShardAuto._register_comm_hook.<locals>._post_forward_hookk   s*    __$$& '  r   c                 4   ^  U 4S jnT R                  U5        g )Nc                   > [         R                  R                  5       R                  R	                  S5      nTR
                  U   [         R                  " 5       :X  a  [        R                  " TR
                  5      n[         R                  " U5      X!'   [         R                  " TTR                  U5      nTR                  5       R                  UR                  5       5        U $ rJ   )r(   rL   rM   rN   rO   r   r)   r"   r#   rd   rR   r&   rS   rT   )gradrU   rV   re   r   s       r   rf   SFullyShardAuto._register_comm_hook.<locals>._post_backward_hook.<locals>.shard_comm   s    ,,557AAGGM##G,0@@%)]]53C3C%DN.2jj.AN+"&,,u11>#K $$&77#..0 r   )register_hook)r   rf   s   ` r   _post_backward_hook?FullyShardAuto._register_comm_hook.<locals>._post_backward_hook   s     
+r   T)include_self)named_sublayersregister_forward_pre_hookregister_forward_post_hookr=   rc   _register_layer_hooks)r   r:   r_   rh   ro   r   rX   r   s           r   rA   "FullyShardAuto._register_comm_hookY   s    	"	(	,"  %44$4GOD//0A)0LM001CI1NO  H
 %%'E#E* (
 	""5)r   c                     S nUR                  SS9(       a  UR                  U5        UR                  5        H  u  p$U R                  XB5        M     g )Nc                 *    [         R                  UU S9$ )Nlayer)	LayerHookapply)rz   inputsoutputss      r   _forward_post_hook@FullyShardAuto._register_layer_hooks.<locals>._forward_post_hook   s    ?? #  r   Finclude_sublayers)r=   rt   named_childrenru   )r   rz   r   r   	sub_layers        r   ru   $FullyShardAuto._register_layer_hooks   sL    	 e4,,-?@$335OD&&y7  6r   )r<   r   r:   N)T)
last_layer)__name__
__module____qualname____firstlineno__rE   rA   ru   __static_attributes__ r   r   r5   r5   G   s    >"A*F
8r   r5   c                   4    \ rS rSr\S 5       r\S 5       rSrg)r{      c                     X l         U$ )Nry   )ctxr}   rz   s      r   forwardLayerHook.forward   s    	r   c                 8   U R                   n[        R                  R                  5       R                  R                  S5      nUR                  SS9 H  nUR                  (       d  M  UR                  U   [        R                  " 5       :w  d  M>  [        R                  " UR                  5      n[        R                  " 5       XS'   [        R                  " XDR                  U5      nUR                  5       R                  UR                  5       5        M     U$ )NrK   Fr   )rz   r(   rL   rM   rN   rO   r=   rc   r   r)   r"   r#   rR   r&   rS   rT   )r   argsrz   rU   r   rV   rW   s          r   backwardLayerHook.backward   s    		$$--/99??E%%%>E$$W-1AA!%u/?/?!@*...*:'"&,,--~#   "33#..0 ? r   r   N)r   r   r   r   staticmethodr   r   r   r   r   r   r{   r{      s(       r   r{   )r"   rB   typesr   r\   paddle.distributeddistributedr(   paddle.autogradr   auto_dp_utilsr   fully_shard_fusionr   r3   r5   r{   r   r   r   <module>r      s?     	   ! # * 0)JX_8 _8D r   