
    9iM                     
   S SK r S SKJrJr  S SKrS SKrS SKJr  SSK	J
r
  \R                  " 5       rS\\\4   4S jrSS jrS r\R$                  " 5       SS	\S
\S\4S jj5       r\R$                  " 5       SS	\4S jj5       rg)    N)AnyUnion   )device_guardsizec                 p   [        U [        5      (       a  U $ U R                  5       R                  S5      (       a  [        U SS 5      S-  $ U R                  5       R                  S5      (       a  [        U SS 5      S-  $ U R                  5       R                  S5      (       a  [        U SS 5      S-  $ U R                  5       R                  S	5      (       a.  [        U SS
 5      S-  nU R                  S5      (       a  US-  $ U$ U R                  5       R                  S5      (       a.  [        U SS
 5      S-  nU R                  S5      (       a  US-  $ U$ U R                  5       R                  S5      (       a.  [        U SS
 5      S-  nU R                  S5      (       a  US-  $ U$ [	        S5      e)z
Converts a size expressed as a string with digits an unit (like `"5MB"`) to an integer (in bytes).
Args:
    size (`int` or `str`): The size to convert. Will be directly returned if an `int`.
GIBNi   @MIBi   KIBi   GBi ʚ;b   MBi@B KBi  zR`size` is not in a valid format. Use an integer followed by the unit, e.g., '5GB'.)
isinstanceintupperendswith
ValueError)r   int_sizes     o/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/paddlex/inference/models/common/vlm/distributed.pyconvert_file_size_to_intr      s    $zz|U##49~''zz|U##49~''zz|U##49~''zz|T""tCRy>U+ $c 2 2x1}@@zz|T""tCRy>U+ $c 2 2x1}@@zz|T""tCRy>U+ $c 2 2x1}@@
\     c              #     #    U R                   [        R                  :X  a!  [        R                  " U R
                  5      nO-[        [        R                  " U 5      R                  5       5      n[        U5      nU R                  S/5        U[        U R                   5      -  n[        SX#5       H&  nX[        X$U-   5       nXT[        X$U-   5      44v   M(     g 7f)Nr   )dtypepaddleint8npprodshaper   numelitemr   reshape_dtype_byte_sizerangemin)tensorbuffer_sizer$   	send_sizexpart_tensors         r   reduce_tensorr/   7   s     ||v{{"%FLL(--/0*;7K
OORDv||<<I1e'U	M!:;s5i-8999 (s   CCc                     U [         R                  :X  a  g[        R                  " S[	        U 5      5      nUc  [        SU  S35      e[        UR                  5       S   5      nUS-  $ )zH
Returns the size (in bytes) occupied by one parameter of type `dtype`.
g      ?z[^\d](\d+)$z`dtype` is not a valid dtype: .r   r   )r   boolresearchstrr   r   groups)r   
bit_searchbit_sizes      r   r'   r'   F   sd     >3u:6J9%BCC:$$&q)*Hq=r   r*   dstreturnc                   ^^^  [        U [        [        45      (       a  [        U 5      " UUU4S jU  5       5      $ [        U [        5      (       a2  U R                  5        VVs0 s H  u  pEU[        UTTT5      _M     snn$ S nT[        R                  " TS9:H  nU(       a  T(       a.  [        [        R                  " TS95       Vs/ s H  n/ PM     nnOq[        [        R                  " TS95       Vs/ s H  n[        R                  " U 5      PM     nnU V	s/ s H#  n	[        U	R                  5      S:  a  U	OU	S    PM%     nn	T(       Ga  U R                  n
U R                  S/5        [!        U 5       GH  u  pS n[        R                  " TS9T:X  aA  [        [        R                  " TS95       Vs/ s H  n[        R                  " U5      PM     nn[        R                  R"                  R$                  R'                  UUT(       a  TR(                  T   OTTSSS9  U(       d  M  [        [        U5      5       H4  nXn   R+                  X   R-                  5       R/                  5       5        M6     GM     U R                  U
5        U(       a[  [1        S5         / nU H;  n[2        R4                  " U5      n	U	R7                  U
5      n	UR+                  U	5        M=     UnS S S 5        U$  U$ [        R                  R"                  R$                  R'                  U UT(       a  TR(                  T   OTTSSS9  U$ s  snnf s  snf s  snf s  sn	f s  snf ! , (       d  f       U$ = f! [8         a    [9        S	5      ef = f)
Nc              3   @   >#    U  H  n[        UTTT5      v   M     g 7fN)distributed_gather).0tr9   groupoffloads     r   	<genexpr>%distributed_gather.<locals>.<genexpr>W   s#       DJq"1c5'::Fs   rA   r   r   TF)r9   rA   sync_opuse_calc_streamcpu(Not currently using distributed training)r   tuplelisttypedictitemsr>   distributedget_rankr(   get_world_sizer   
empty_likelenr#   r&   r/   communicationstreamgatherranksappendrH   numpyr   r!   concatenatereshapeAssertionError)r*   r9   rA   rB   kvoutput_tensorsis_dst_r@   origin_shapeslice_tensorindexslice_output_tensorsinew_output_tensorsr-   s    ```             r   r>   r>   S   sX   JIfudm,,<  DJ    fd##JP,,.JX$!%aeW==.  ,,599 %k&@&@u&M N" N1B N  " #;#=#=E#JK"K %%f-K  "
 AO"@N1QWW)Aqw6  " !<<LOORD!'4V'<#'+$''e4; "'{'A'A'N!O,!OA )),7!O ) , ""0077>> (,1C(s $) ?  6"3~#67&)001E1H1L1L1N1T1T1VW 8# (=( OOL)!%()+&+NN1-IIl3*11!4 , &8N )$ ' &  ,,33::(-EKK$3 % ;  C""",& )($  IGHHIs   7M2 (M2 %M M2 AM2 
M"M2 8 MM2 *MA2M2 : MAM2 1A4M2 %AM +	M2 5M2 8AM2 M2  
M/*M2 /M2 2Nc           
        ^^  [        U [        [        45      (       a  [        U 5      " UU4S jU  5       5      $ [        U [        5      (       a1  U R                  5        VVs0 s H  u  p4U[        UTT5      _M     snn$ / nT(       aX  [        S5         [        [        R                  " T5      5       Vs/ s H  n[        R                  " U 5      PM     nnSSS5        OC[        [        R                  " T5      5       Vs/ s H  n[        R                  " U 5      PM     nnU Vs/ s H#  n[        UR                  5      S:  a  UOUS   PM%     nnT(       Ga  U R                  nU R                  S/5        U H  n	U	R                  S/5        M     [!        U 5       H  u  p[        [        R                  " T5      5       Vs/ s H  n[        R                  " U
5      PM     nn[        R"                  " XTS9  [%        X5       H1  u  p[        S5         U	R'                  5       XS   US   & SSS5        M3     M     U R                  U5        U H  n	U	R                  U5        M     U$ [        R"                  " XP5        U$ s  snnf s  snf ! , (       d  f       GN|= fs  snf s  snf s  snf ! , (       d  f       M  = f! [(         a    [)        S5      ef = f)	a  nested all gather function with offload

Args:
    tensor (Any): the desired tensor, list of tensor, dict of tensor to allgather.
    group (_type_, optional): the communication group. Defaults to None.
    offload (bool, optional): If True, we offload the received tensor to cpu/(numpy). Defaults to False.

Raises:
    AssertionError: Unexpected errors.

Returns:
    tensor list: list of all gathered tensors
c              3   >   >#    U  H  n[        UTT5      v   M     g 7fr=   )distributed_allgather)r?   r@   rA   rB   s     r   rC   (distributed_allgather.<locals>.<genexpr>   s!       BHQ%a88&s   rH   Nr   r   rE   r   rI   )r   rJ   rK   rL   rM   rN   rj   r   r(   rO   rQ   r   rR   rS   r#   r&   r/   
all_gatherziprH   r\   )r*   rA   rB   r]   r^   r_   ra   r@   rb   r-   rc   rd   re   ys    ``           r   rj   rj      s   4Ifudm,,<  BH    fd##HNHV(E7;;  e$ #;#=#=e#DE"E %%f-E  " %$ {99%@AAA !!&)A  
 GUUns177|a/!QtW<nU!<<LOORD!#

B4  $ (5V'<# #;#=#=e#DE(E %%l3E % ( &&';QVW 4EDA%e,12(U1X. -, F (= OOL)#

<( $  "">:W" %$
 V( -,  IGHHIs   6K (K #J=K K "J7 JJ*K  J$#K )*J)A4K  J.'2K J32<K /K K J
J!K 3
K=K K)32MiB)r   NF)NF)r3   typingr   r   rY   r!   r   paddle.distributedrO   utilsr   rQ   
world_sizer   r5   r   r/   r'   no_gradr>   rj    r   r   <module>rv      s    
    ( '')
5c? 8:
 KIs KI KIPS KI KI\ BI# BI BIr   