§
    ‚Štj#  ã                   óÖ   — U 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 e
Zeed<   esej	                             ¦   «         rd dlmZ neZ ed¦  «        Z G d	„ d
¦  «        ZdS )é    N)Ú	timedelta)ÚTYPE_CHECKINGÚAnyÚTypeVaré   )ÚloggerÚdist)Ú
DeviceMeshÚTc                   óF  — e Zd ZdZdedz  dedz  ddfd„Zededz  ddfd„¦   «         Zededz  dedz  fd„¦   «         Z	de
fd	„Zdd
„Zdej        dej        fd„Zdededeeef         fd„Zddej        de
dej        fd„Zdedefd„Zdd„Zdedz  dej        ddfd„ZdS )ÚDistributedHelperzlA helper class to handle distributed-related operations. Notably, it does not crash when distributed is off.Údevice_meshNÚcpu_group_timeoutÚreturnc                 óf  — t                                ¦   «         ot                                ¦   «         | _        || _        |                      | j        ¦  «         |                      | j        ¦  «        }|�| j        st          d|›d�¦  «        ‚| j        rt                                ¦   «         nd| _	        | j        rt            
                    ¦   «         nd| _        |�Æ|                     ¦   «         | _        |                     ¦   «         | _        t                                | j        d¦  «        | _        |                     ¦   «         | _        t                                | j        ¦  «        }|€d nt+          |¬¦  «        }t                                |d|¬¦  «        | _        n#d| _        d | _        d| _        d| _        d | _        |                      ¦   «         | _        | j	        | j        z  | _        | j        | j        z  | _        t9          j        ddgt8          j        d¬	¦  «        | _        d S )
Nz.Distributed is off but received device_mesh = ú.r   r   )ÚsecondsÚgloo)ÚranksÚbackendÚtimeoutÚcpu©ÚdtypeÚdevice) r	   Úis_availableÚis_initializedÚdist_onr   Úcheck_device_mesh_for_cbÚextract_tp_meshÚ
ValueErrorÚget_rankÚglobal_rankÚget_world_sizeÚ
world_sizeÚsizeÚtp_sizeÚ	get_groupÚtp_groupÚget_global_rankÚtp_root_global_rankÚget_local_rankÚtp_local_rankÚget_process_group_ranksr   Ú	new_groupÚcpu_comm_groupÚinfer_if_tp_driverÚis_tp_driverÚdp_rankÚdp_sizeÚtorchÚtensorÚint64Ú_cpu_int_acc)Úselfr   r   Útp_meshÚtp_ranksr   s         úu/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/generation/continuous_batching/distributed.pyÚ__init__zDistributedHelper.__init__)   së  € Ý×(Ò(Ñ*Ô*ÐD­t×/BÒ/BÑ/DÔ/DˆŒØ&ˆÔð 	×%Ò% dÔ&6Ñ7Ô7Ð7à×&Ò& tÔ'7Ñ8Ô8ˆØÐ t¤|ÐÝÐQÀÐQÐQÐQÑRÔRÐRð /3¬lÐA�4Ÿ=š=™?œ?˜?ÀˆÔØ37´<ÐF�$×-Ò-Ñ/Ô/Ð/ÀQˆŒð ÐØ"Ÿ<š<™>œ>ˆDŒLØ#×-Ò-Ñ/Ô/ˆDŒMÝ'+×';Ò';¸D¼MÈ1Ñ'MÔ'MˆDÔ$Ø!(×!7Ò!7Ñ!9Ô!9ˆDÔå×3Ò3°D´MÑBÔBˆHØ/Ð7�d�d½YÐO`Ð=aÑ=aÔ=aˆGÝ"&§.¢.°xÈÐY` .Ñ"aÔ"aˆDÔÐàˆDŒLØ ˆDŒMØ'(ˆDÔ$Ø!"ˆDÔØ"&ˆDÔð !×3Ò3Ñ5Ô5ˆÔð Ô'¨4¬<Ñ7ˆŒØ”¨$¬,Ñ6ˆŒõ "œL¨!¨Q¨µu´{È5ÐQÑQÔQˆÔÐÐó    c                 ó˜   — | €dS | j         €dS d| j         v r1| d                              ¦   «         dk    rt          d| ›d�¦  «        ‚dS dS )z?Checks the validity of the device mesh for continuous batching.NÚfsdpr   zFFSDP is not compatible with continuous batching but got device_mesh = r   )Úmesh_dim_namesr&   r!   ©r   s    r<   r   z*DistributedHelper.check_device_mesh_for_cbT   sp   € ð ÐØ�4àÔ%Ð-Ø�4à�[Ô/Ð/Ð/°KÀÔ4G×4LÒ4LÑ4NÔ4NÐQRÒ4RÐ4RÝÐiÐXcÐiÐiÐiÑjÔjÐjð 0Ð/Ð4RÐ4Rr>   c                 ó²   — | €dS | j         €|                      ¦   «         dk    r| ndS d| j         v r&| d                              ¦   «         dk    r| d         S dS )zJExtracts the TP mesh from the device mesh if it exists and is non-trivial.Nr   Útp)rA   r&   rB   s    r<   r    z!DistributedHelper.extract_tp_mesha   sq   € ð ÐØ�4àÔ%Ð-Ø"-×"2Ò"2Ñ"4Ô"4°qÒ"8Ð"8�;�;¸dÐBà�;Ô-Ð-Ð-°+¸dÔ2C×2HÒ2HÑ2JÔ2JÈQÒ2NÐ2NØ˜tÔ$Ð$Øˆtr>   c                 ó   — | j         dk    S )Nr   )r-   ©r9   s    r<   r1   z$DistributedHelper.infer_if_tp_drivern   s   € ØÔ! QÒ&Ð&r>   c                 ód   — | j         �(t                               | j         ¦  «         d| _         dS dS )zDestroys the CPU comm group.N)r0   r	   Údestroy_process_grouprF   s    r<   Údestroy_cpu_comm_groupz(DistributedHelper.destroy_cpu_comm_groupq   s8   € àÔÐ*Ý×&Ò& tÔ':Ñ;Ô;Ð;Ø"&ˆDÔÐÐð +Ð*r>   Úvaluec                 ól   — | j         dk    r(t                               || j        d| j        ¬¦  «         |S )zPInside each TP group, broadcasts the given value from rank 0 to all other ranks.r   F)ÚsrcÚasync_opÚgroup)r'   r	   Ú	broadcastr+   r)   )r9   rJ   s     r<   Útp_broadcast_from_rank_0z*DistributedHelper.tp_broadcast_from_rank_0w   s5   € àŒ<˜!ÒÐÝ�NŠN˜5 dÔ&>ÈÐVZÔVcˆNÑdÔdÐdØˆr>   Úpayload_sizeÚstop_statusc                 óî   — | j         dk    rg|| j        d<   || j        d<   t                               | j        t          j        j        d| j        ¬¦  «         | j                             ¦   «         \  }}||fS )zâBroadcasts two information: 1. the size of the payload held by the TP driver (all other rank broadcast 0) and
        2. the requested stop status (all to all). These information are broadcasted through a MAX-reduce operation.r   r   F)ÚoprM   rN   )r'   r8   r	   Ú
all_reduceÚReduceOpÚMAXr0   Útolist)r9   rQ   rR   s      r<   Útp_all_reduce_statez%DistributedHelper.tp_all_reduce_state}   su   € ð Œ<˜!ÒÐØ#/ˆDÔ˜aÑ Ø#.ˆDÔ˜aÑ Ý�OŠO˜DÔ-µ$´-Ô2CÈeÐ[_Ô[nˆOÑoÔoÐoØ(,Ô(9×(@Ò(@Ñ(BÔ(BÑ%ˆL˜+Ø˜[Ð(Ð(r>   FÚon_cpuc                 ó”   — | j         dk    r<|r| j        n| j        }t                               |t          j        j        |¬¦  «         |S )z›Inside each TP group, all-reduces a tensor with the MIN op. No-op when TP is off. If the tensor is on CPU,
        it is all-reduced on the CPU comm group.r   )rT   rN   )r'   r0   r)   r	   rU   rV   ÚMIN)r9   rJ   rZ   rN   s       r<   Útp_all_reduce_minz#DistributedHelper.tp_all_reduce_min‡   sG   € ð Œ<˜!ÒÐØ+1ÐD�DÔ'Ð'°t´}ˆEÝ�OŠO˜E¥d¤mÔ&7¸uˆOÑEÔEÐEØˆr>   Úobjc                 óº   — | j         dk    r|S | j        r|gndg}t                               || j        | j        t          j        d¦  «        ¬¦  «         |d         S )aI  Inside each TP group, broadcasts an arbitrary picklable Python object from TP-rank 0 to all other ranks.
        Used to keep request ingress and cancellations consistent across TP workers without requiring all ranks to
        receive the same external request stream. Uses a dedicated CPU (gloo) `cpu_comm_group` for broadcast.r   Nr   )rL   rN   r   r   )r'   r2   r	   Úbroadcast_object_listr+   r0   r5   r   )r9   r^   Úholders      r<   Útp_broadcast_object_from_rank_0z1DistributedHelper.tp_broadcast_object_from_rank_0�   sp   € ð Œ<˜1ÒÐØˆJØÔ+Ð7�#��°$°ˆÝ×"Ò"Ø˜Ô0¸Ô8KÕTYÔT`ÐafÑTgÔTgð 	#ñ 	
ô 	
ð 	
ð �aŒyÐr>   c                 óš   — | j         dk    }t          j                             d¦  «        dk    }|r|rt	          j        d¦  «         dS dS dS )a  Throws a warning if TP is on and NCCL's graph mixing support was supposed to be disabled but isn't. That can
        happen if the distributed group is created before graph mixing is disabled. Typically, if the model is
        initialized before the ContinuousBatchingConfig is created.r   ÚNCCL_GRAPH_MIXING_SUPPORTÚ0a  NCCL_GRAPH_MIXING_SUPPORT was not set to '0' before init_process_group: performance will be harmed. Construct your `ContinuousBatchingConfig(...)` BEFORE calling `from_pretrained(tp_plan='auto')`, or set NCCL_GRAPH_MIXING_SUPPORT=0 in the launch environment.N)r'   ÚosÚenvironÚgetr   Úwarning)r9   Útp_onÚgraph_mixing_not_disableds      r<   Úmaybe_warn_nccl_graph_mixingz.DistributedHelper.maybe_warn_nccl_graph_mixing›   ss   € ð ”˜qÒ ˆÝ$&¤J§N¢NÐ3NÑ$OÔ$OÐSVÒ$VÐ!Øð 	Ð.ð 	ÝŒNðMñô ð ð ð ð	ð 	ð 	ð 	r>   ÚseedÚmodel_devicec                 óh  — |€$t          j        dddt           j        |¬¦  «        }n!t          j        |t           j        |¬¦  «        }|                      |¦  «        }|                     ¦   «         }| j        dk    r|€t          j        d|› d�¦  «         t          j	        || j
        z   ¦  «         d S )Nr   l   ÿÿ )r   r   zHFound no user-specified seed in the config. Setting the config seed to: r   )r5   Úrandintr7   r6   rP   Úitemr#   r   ÚinfoÚmanual_seedr3   )r9   rm   rn   Útp_seed_tensorÚtp_seeds        r<   Úset_tp_seedzDistributedHelper.set_tp_seed¨   s¯   € àˆ<Ý"œ]¨1¨i¸ÅUÄ[ÐYeÐfÑfÔfˆNˆNå"œ\¨$µe´kÈ,ÐWÑWÔWˆNà×6Ò6°~ÑFÔFˆØ ×%Ò%Ñ'Ô'ˆØÔ˜qÒ Ð  T \ÝŒKÐmÐcjÐmÐmÐmÑnÔnÐnåÔ˜' D¤LÑ0Ñ1Ô1Ð1Ð1Ð1r>   )r   N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   Úfloatr=   Ústaticmethodr   r    Úboolr1   rI   r5   ÚTensorrP   ÚintÚtuplerY   r]   r   rb   rl   r   rv   © r>   r<   r   r   &   sç  € € € € € ØvÐvð)R J°Ñ$5ð )RÈ%ÐRVÉ,ð )RÐ[_ð )Rð )Rð )Rð )RðV ð
k¨j¸4Ñ.?ð 
kÀDð 
kð 
kð 
kñ „\ð
kð ð
 Z°$Ñ%6ð 
¸:ÈÑ;Lð 
ð 
ð 
ñ „\ð
ð' Dð 'ð 'ð 'ð 'ð'ð 'ð 'ð 'ð¨e¬lð ¸u¼|ð ð ð ð ð)°ð )À#ð )È%ÐPSÐUXÐPXÌ/ð )ð )ð )ð )ðð  u¤|ð ¸Tð ÈeÌlð ð ð ð ð
°1ð 
¸ð 
ð 
ð 
ð 
ðð ð ð ð2  d¡
ð 2¸%¼,ð 2È4ð 2ð 2ð 2ð 2ð 2ð 2r>   r   )rf   Údatetimer   Útypingr   r   r   r5   Útorch.distributedÚdistributedÚ_distÚrequestsr   r	   Ú__annotations__r   Útorch.distributed.device_meshr
   Úobjectr   r   r�   r>   r<   ú<module>r‹      s  ðð 
€	€	€	€	Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .à €€€Ø !Ð !Ð !Ð !Ð !Ð !à Ð Ð Ð Ð Ð ð
 €€cÐ Ð Ñ ð ð �EÔ%×2Ò2Ñ4Ô4ð Ø8Ð8Ð8Ð8Ð8Ð8Ð8à€Jð €GˆC�L„L€ðN2ð N2ð N2ð N2ð N2ñ N2ô N2ð N2ð N2ð N2r>   