§
    �Štjß`  ã            
       óî  — d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZmZ ddlZdd
lmZ ddgZ ee¦  «        Z G d„ dee¦  «        Z ed¬¦  «         G d„ d¦  «        ¦   «         Zdeedf         dededz  deedf         fd„Z  ed¦  «        Z! ed¦  «        Z"dee!e"f         dededz  dee!e"f         fd„Z#dededdfd„Z$deedf         de%e         deedf         fd„Z&dede'ee(f         ddfd „Z)dedede%e         fd!„Z*de%e         ddfd"„Z+de%e         ddfd#„Z,dedede%e         fd$„Z-dede%e         fd%„Z.dede%e         fd&„Z/dede%e         fd'„Z0dede%e         fd(„Z1 ed)¦  «        Z2 ed*¦  «        Z3d+ee3         d,ee3ge2f         de'e2e%e3         f         fd-„Z4d.ede%e         fd/„Z5d.ede%e         fd0„Z6d1ede%e         fd2„Z7d1ede%e         fd3„Z8defd4„Z9dedefd5„Z:d1ede%e         fd6„Z;d1edefd7„Z<d8edefd9„Z=d1edefd:„Z>d;ede%e         fd<„Z?d=ee         defd>„Z@de%e         fd?„ZAd@ede%e         fdA„ZBde%e         fdB„ZCdS )CaÙ  
In NUMA (Non-Uniform Memory Access) systems, accessing memory on remote NUMA
nodes incurs additional latency. PyTorch provides NUMA binding utilities to
promote memory locality by binding worker processes to CPUs near their assigned GPUs.

In practice, NUMA binding typically results in 1-10% overall performance improvements,
but some workloads may obtain much greater benefits or none at all.

To enable NUMA binding, use the ``--numa-binding`` flag with :ref:`torchrun <launcher-api>`, e.g.:

.. code-block:: bash

    torchrun --numa-binding=node --nproc_per_node=8 train.py

Alternatively, pass :class:`NumaOptions` to ``LaunchConfig``
when using ``elastic_launch``.

See :class:`AffinityMode` for available binding modes.
é    N)Údefaultdict)ÚCallableÚIterable)ÚasdictÚ	dataclass)ÚEnum)Úwraps)Ú	getLogger)Ú	ParamSpecÚTypeVar)Úsignpost_eventÚAffinityModeÚNumaOptionsc                   ó$   — e Zd ZdZ	 dZ	 dZ	 dZdS )r   ÚnodeÚsocketÚ	exclusivezcore-complexN)Ú__name__Ú
__module__Ú__qualname__ÚNODEÚSOCKETÚ	EXCLUSIVEÚCORE_COMPLEX© ó    úP/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/numa/binding.pyr   r   ,   s=   € € € € € Ø€Dðð €Fðð €Ið	ð "€Lðð r   T)Úfrozenc                   ó(   — e Zd ZU eed<   dZeed<   dS )r   Úaffinity_modeFÚ!should_fall_back_if_binding_failsN)r   r   r   r   Ú__annotations__r!   Úboolr   r   r   r   r   Z   s3   € € € € € € àÐÐÑà.3Ð% tÐ3Ð3Ñ3ðð r   Úcommand_args.Ú	gpu_indexÚnuma_optionsÚreturnc                óð   — |€| S | |t          |¦  «        dœ}	 t          ||¬¦  «        }t          | |¬¦  «        }t          ddi |¥d|i¥¬¦  «         |S # t          $ r t          ||¬	¦  «         | cY S w xY w)
aú  
    Wraps command arguments with numactl to apply NUMA CPU binding.

    This function prepends numactl with appropriate CPU affinity flags to the
    provided command arguments, binding the process to CPUs associated with
    the specified GPU's NUMA node.

    Args:
        command_args: The original command arguments to wrap.
        gpu_index: The index of the GPU that will be used by the subprocess.
        numa_options: Configuration for NUMA binding behavior. If None, returns
            the original command_args unchanged.

    Returns:
        Tuple of command arguments, potentially wrapped with numactl for NUMA binding.
        Returns the original command_args if numa_options is None or if binding fails
        and fallback is enabled.
    N)r$   r%   r&   ©r%   r&   ©Úoriginal_command_argsÚlogical_cpu_indicesÚnuma_bindingÚapply_successÚwrapped_command©ÚcategoryÚnameÚ
parameters©r&   Úlogger_kwargs)r   Ú&_get_validated_logical_cpus_to_bind_toÚ_assemble_numactl_command_argsr   Ú	ExceptionÚ_handle_exception)r$   r%   r&   Úkwargsr,   Úwrapped_command_argss         r   Ú*_maybe_wrap_command_args_with_numa_bindingr<   h   sê   € ð0 ÐØÐð %ØÝ˜|Ñ,Ô,ðð €FðÝDØØ%ð
ñ 
ô 
Ðõ
  >Ø".Ø 3ð 
ñ  
ô  
Ðõ 	Ø#Ø ðØðà!Ð#7ðð ð	
ñ 	
ô 	
ð 	
ð $Ð#øÝð ð ð å |À6ÐJÑJÔJÐJØÐÐÐðøøøs   ™;A ÁA5Á4A5Ú_TParamsÚ_TReturnÚfuncc                óŒ   ‡ ‡‡— ‰€‰ S t          ‰ ¦  «        dt          j        dt          j        dt          fˆ ˆˆfd„¦   «         }|S )a“  
    Wraps a function to apply NUMA CPU binding before execution.

    This decorator applies NUMA CPU affinity to all threads in the current process
    before calling the wrapped function, binding them to CPUs associated with the
    specified GPU's NUMA node.

    Args:
        func: The function to wrap with NUMA binding.
        gpu_index: The index of the GPU that will be used.
        numa_options: Configuration for NUMA binding behavior. If None, returns
            the original function unchanged.

    Returns:
        A wrapped function that applies NUMA binding before execution, or the
        original function if numa_options is None.
    NÚargsr:   r'   c                  ó6   •— t          ‰‰¬¦  «          ‰| i |¤ŽS )Nr)   )Ú,_maybe_apply_numa_binding_to_current_process)rA   r:   r?   r%   r&   s     €€€r   Úwrappedz._maybe_wrap_with_numa_binding.<locals>.wrappedÀ   s7   ø€ å4Øà%ð	
ñ 	
ô 	
ð 	
ð
 ˆt�TÐ$˜VÐ$Ð$Ð$r   )r	   r=   rA   r:   r>   )r?   r%   r&   rD   s   ``` r   Ú_maybe_wrap_with_numa_bindingrE   ¦   sj   øøø€ ð. ÐØˆå
ˆ4�[„[ð%•x”}ð %µ´ð %ÅHð %ð %ð %ð %ð %ð %ð %ñ „[ð%ð €Nr   c           	      óü   — | t          |¦  «        dœ}	 t          | |¬¦  «        }t          |¬¦  «         t          ddi |¥dt	          |¦  «        i¥¬¦  «         d S # t
          $ r t          ||¬¦  «         Y d S w xY w)Nr)   ©r,   r-   r.   r,   r0   r4   )r   r6   Ú4_bind_all_threads_in_current_process_to_logical_cpusr   Ú_get_ranges_str_from_intsr8   r9   )r%   r&   r:   r,   s       r   rC   rC   Ì   sç   € ð Ý˜|Ñ,Ô,ðð €Fð
KÝDØØ%ð
ñ 
ô 
Ðõ
 	=Ø 3ð	
ñ 	
ô 	
ð 	
õ 	Ø#Ø ðØðà%Õ'@ÐATÑ'UÔ'Uðð ð	
ñ 	
ô 	
ð 	
ð 	
ð 	
øõ ð Kð Kð Kå |À6ÐJÑJÔJÐJÐJÐJÐJðKøøøs   ”AA ÁA;Á:A;r+   r,   c                 ó0   — ddt          |¦  «        › �g| ¢R S )NÚnumactlz--physcpubind=)rI   r*   s     r   r7   r7   ë   s5   € ð 	ØIÕ2Ð3FÑGÔGÐIÐIðð 
ðð ð r   r5   c                 óö   — t          ddi |¥dt          j        ¦   «         i¥¬¦  «         t                               d|¦  «         | j        r.t                               dt          j        ¦   «         ¦  «         d S ‚ )Nr-   Úapply_exceptionÚ	tracebackr0   z)Failed to apply NUMA binding for input=%rzHContinuing executing without applying NUMA binding, despite exception %s)r   rN   Ú
format_excÚloggerÚ	exceptionr!   Úwarningr4   s     r   r9   r9   õ   s›   € õ ØØð
Øð
à�Ô-Ñ/Ô/ð
ð 
ðñ ô ð õ ×ÒÐ@À-ÑPÔPÐPØÔ5ð Ý�ŠØVÝÔ Ñ"Ô"ñ	
ô 	
ð 	
ð 	ˆð 
r   c                 óH   — t          | |¬¦  «        }t          |¬¦  «         |S )Nr)   rG   )Ú_get_logical_cpus_to_bind_toÚ_raise_if_binding_invalid)r%   r&   r,   s      r   r6   r6     s8   € õ
 7Ø¨,ðñ ô Ðõ Ð2EÐFÑFÔFÐFàÐr   c                 ón   — t          j        d¦  «        €t          d¦  «        ‚| st          d¦  «        ‚d S )NrK   z(numactl CLI is required for NUMA bindingz+Must bind to a non-empty set of CPU indices)ÚshutilÚwhichÚRuntimeErrorrG   s    r   rU   rU     sG   € õ „|�IÑÔÐ&ÝÐEÑFÔFÐFàð JÝÐHÑIÔIÐIðJð Jr   c                 ó$  — t          j        d¦  «        }t          j        d| ¦  «         t          j        d¦  «        D ]Q}	 t	          |¦  «        }t          j        |¦  «        }||k    rt          j        || ¦  «         ŒB# t
          $ r Y ŒNw xY wd S )Nr   z/proc/self/task)ÚosÚsched_getaffinityÚsched_setaffinityÚlistdirÚintr8   )r,   Úoriginal_main_thread_affinityÚtid_strÚtidÚtid_affinitys        r   rH   rH   #  s²   € õ
 %'Ô$8¸Ñ$;Ô$;Ð!õ
 Ô˜Ð/Ñ0Ô0Ð0å”:Ð/Ñ0Ô0ð ð ˆð	Ý�g‘,”,ˆCåÔ/°Ñ4Ô4ˆLð Ð<Ò<Ð<åÔ$ SÐ*=Ñ>Ô>Ð>øøÝð 	ð 	ð 	àˆDð	øøøðð s   Á>B Â 
BÂBc                 óf  — |j         t          j        k    rt          | ¬¦  «        }nŠ|j         t          j        k    rt          | ¬¦  «        }nd|j         t          j        k    rt          | ¬¦  «        }n>|j         t          j        k    rt          | ¬¦  «        }nt          d|j         › d�¦  «        ‚|S )zã
    Args:
        gpu_index: The index of the GPU that will be used by the subprocess.
            Example: 0
        numa_options: See NumaOptions for details.

    Returns:
        Set of logical CPU indices to bind to.
    ©r%   zAffinity mode z not supported.)r    r   r   Ú!_node_get_logical_cpus_to_bind_tor   Ú#_socket_get_logical_cpus_to_bind_tor   Ú&_exclusive_get_logical_cpus_to_bind_tor   Ú)_core_complex_get_logical_cpus_to_bind_toÚ
ValueError)r%   r&   Úlogical_cpuss      r   rT   rT   ?  s³   € ð Ô!¥\Ô%6Ò6Ð6Ý8À9ÐMÑMÔMˆˆØ	Ô	#¥|Ô':Ò	:Ð	:Ý:ÀYÐOÑOÔOˆˆØ	Ô	#¥|Ô'=Ò	=Ð	=Ý=È	ÐRÑRÔRˆˆØ	Ô	#¥|Ô'@Ò	@Ð	@Ý@È9ÐUÑUÔUˆˆåÐU¨,Ô*DÐUÐUÐUÑVÔVÐVàÐr   c                 óB   — t          | ¬¦  «        }t          |¬¦  «        S )z-
    Core logic of 'node' numa strategy.
    re   ©Únuma_node_index)Ú"_get_numa_node_index_for_gpu_indexÚ._get_allowed_logical_cpu_indices_for_numa_node)r%   rn   s     r   rf   rf   [  s.   € õ 9À9ÐMÑMÔM€Oå9Ø'ðñ ô ð r   c                 óÒ   — t          | ¬¦  «        }t          |¬¦  «        }t          |¬¦  «        }t          ¦   «         }|D ]%}|                     t          |¬¦  «        ¦  «         Œ&|S )z/
    Core logic of 'socket' numa strategy.
    re   rm   )Úsocket_index)ro   Ú_get_socket_index_for_numa_nodeÚ'_get_numa_node_indices_for_socket_indexÚsetÚupdaterp   )r%   Únuma_node_index_of_gpurr   Únuma_node_indicesrk   rn   s         r   rg   rg   f  sœ   € õ @È)ÐTÑTÔTÐÝ2Ø.ðñ ô €Lõ @Ø!ðñ ô Ðõ ‘5”5€LØ,ð 
ð 
ˆØ×ÒÝ:Ø /ðñ ô ñ	
ô 	
ð 	
ð 	
ð Ðr   c                 óÔ  — t          | ¬¦  «        }t          |¬¦  «        }t          |¦  «        }|                     | ¦  «        }t	          |¬¦  «        }t          |d„ ¦  «        }t          t          |                     ¦   «         ¦  «        ¦  «        }t          |¦  «        t          |¦  «        z  }t          |¦  «        t          |¦  «        z  }|dk     r7t          dt          |¦  «        › d|›d�dt          |¦  «        › d	�z   ¦  «        ‚||z  t          ||¦  «        z   }||z   ||k     rdnd
z   }	d„ t          |                     ¦   «         ¦  «        ||	…         D ¦   «         }
|
S )z2
    Core logic of 'exclusive' numa strategy.
    re   rm   c                 ó<   — t          t          | ¬¦  «        ¦  «        S ©N©Úlogical_cpu_index)ÚminÚ6_get_logical_cpu_indices_sharing_same_physical_core_asr|   s    r   ú<lambda>z8_exclusive_get_logical_cpus_to_bind_to.<locals>.<lambda>�  s%   € ¥#ÝBØ"3ðñ ô ñ#
ô #
€ r   é   zThere are only z# physical cores on numa_node_index=ú,z but there are z% GPUs associated with this NUMA node.r   c                 ó   — h | ]	}|D ]}|’ŒŒ
S r   r   )Ú.0r,   r}   s      r   ú	<setcomp>z9_exclusive_get_logical_cpus_to_bind_to.<locals>.<setcomp>¸  sA   € ð ,ð ,ð ,àð "5ð,ð ,ð
 ð	 	ð,ð ,ð ,ð ,r   )ro   Ú_get_gpu_indices_for_numa_nodeÚsortedÚindexrp   Ú	_group_byÚdictÚitemsÚlenrY   r~   ÚlistÚvalues)r%   rn   Úgpu_indicesÚoriginal_gpu_relative_indexÚallowed_logical_cpu_indicesÚ,physical_core_to_allowed_logical_cpu_indicesÚnum_physical_cores_per_gpuÚ(num_gpus_to_give_one_extra_physical_coreÚstartÚendÚ$logical_cpu_indices_for_original_gpus              r   rh   rh   }  sì  € õ 9À9ÐMÑMÔM€Oå0ÀÐQÑQÔQ€KÝ˜Ñ%Ô%€KØ"-×"3Ò"3°IÑ">Ô">Ðå"PØ'ð#ñ #ô #Ðõ 4=Ø#ð	
ð 	
ñ4ô 4Ð0õ 48ÝÐ;×AÒAÑCÔCÑDÔDñ4ô 4Ð0õ "%Ø4ñ"ô "å	ˆ[Ñ	Ô	ñ"Ðõ
 03Ø4ñ0ô 0åˆKÑÔñ0Ð,ð " AÒ%Ð%ÝØw�cÐ"NÑOÔOÐwÐwÐdsÐwÐwÐwØW¥ KÑ 0Ô 0ÐWÐWÐWñXñ
ô 
ð 	
ð (Ð*DÑDÅsØ#Ð%MñHô Hñ €Eð 	Ø
$ñ	%ð +Ð-UÒUÐUð ˆAàñ	
ð ð,ð ,å#'Ø8×?Ò?ÑAÔAñ$
ô $
à
�ˆ)ô$ð,ñ ,ô ,Ð(ð 0Ð/r   c                 ó¤  — t          | ¬¦  «        }t          |¬¦  «        }t          |¦  «        }|                     | ¦  «        }t	          |¬¦  «        }t          |d„ ¦  «        }t          t          |                     ¦   «         d„ ¬¦  «        ¦  «        }|t          |¦  «        z  }t          | 
                    ¦   «         ¦  «        |         }|S )z§
    Core logic of 'core-complex' numa strategy.

    Each GPU is assigned a full core complex (group of cores sharing L3 cache)
    within its affined NUMA node.
    re   rm   c                 ó<   — t          t          | ¬¦  «        ¦  «        S r{   )r~   Ú1_get_logical_cpus_sharing_same_max_level_cache_asr|   s    r   r€   z;_core_complex_get_logical_cpus_to_bind_to.<locals>.<lambda>Ø  s%   € ¥#Ý=Ø"3ðñ ô ñ#
ô #
€ r   c                 ó>   — t          | d         ¦  «         | d         fS )Nr�   r   )rŒ   )Úitems    r   r€   z;_core_complex_get_logical_cpus_to_bind_to.<locals>.<lambda>ä  s   € �s 4¨¤7™|œ|˜m¨T°!¬WÐ5€ r   )Úkey)ro   r†   r‡   rˆ   rp   r‰   rŠ   r‹   rŒ   r�   rŽ   )r%   rn   r�   r�   r‘   Ú.max_level_cache_to_allowed_logical_cpu_indicesÚcache_index_for_original_gpur—   s           r   ri   ri   Ã  s  € õ 9À9ÐMÑMÔM€Oå0ÀÐQÑQÔQ€KÝ˜Ñ%Ô%€KØ"-×"3Ò"3°IÑ">Ô">Ðå"PØ'ð#ñ #ô #Ðõ 6?Ø#ð	
ð 	
ñ6ô 6Ð2õ 6:ÝØ:×@Ò@ÑBÔBð 6Ð5ð		
ñ 	
ô 	
ñ6ô 6Ð2ð $?ÅØ6ñBô Bñ $Ð õ ,0Ø6×=Ò=Ñ?Ô?ñ,ô ,à"ô,$Ð(ð 0Ð/r   ÚKÚVrŽ   Úget_keyc                 ó„   — t          t          ¦  «        }| D ](} ||¦  «        }||                              |¦  «         Œ)|S )z2
    Groups elements with same key into sets.
    )r   ru   Úadd)rŽ   r¢   Úkey_to_valuesÚvaluer�   s        r   r‰   r‰   ö  sO   € õ -8½Ñ,<Ô,<€MØð &ð &ˆØˆg�e‰nŒnˆØ�cÔ×Ò˜uÑ%Ô%Ð%Ð%ØÐr   r}   c                 ó¢   — d| › d�}t          |¦  «        5 }t          |                     ¦   «         ¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )Nú/sys/devices/system/cpu/cpuz/topology/thread_siblings_list)ÚopenÚ_get_set_of_int_from_ranges_strÚread)r}   Ú"thread_siblings_list_absolute_pathÚfs      r   r   r     sž   € ð 	XÐ&7ÐWÐWÐWð 'õ 
Ð0Ñ	1Ô	1ð 9°QÝ.¨q¯vªv©x¬xÑ8Ô8ð9ð 9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð 9s   –!AÁAÁAc                 ó¶  — d| › d�}d}t          ¦   «         }t          j        |¦  «        D �]¬}|                     d¦  «        r|dd …                              ¦   «         sŒ5t          j                             ||¦  «        }t          j                             |d¦  «        }t          |¦  «        5 }|                     ¦   «          	                    ¦   «         dvr	 d d d ¦  «         Œº	 d d d ¦  «         n# 1 swxY w Y   t          j                             |d¦  «        }t          |¦  «        5 }	t          |	                     ¦   «         ¦  «        }
d d d ¦  «         n# 1 swxY w Y   |
|k    r�ŒB|
}t          j                             |d	¦  «        }t          |¦  «        5 }t          |                     ¦   «         ¦  «        }d d d ¦  «         n# 1 swxY w Y   �Œ®|S )
Nr¨   z/cacheéÿÿÿÿrˆ   é   Útype>   ÚDataÚUnifiedÚlevelÚshared_cpu_list)ru   r[   r^   Ú
startswithÚ	isdecimalÚpathÚjoinr©   r«   Ústripr_   rª   )r}   Úcpu_cache_dir_absolute_pathÚ	max_levelÚ$logical_cpus_sharing_max_level_cacheÚentryÚcache_index_absolute_pathÚtype_absolute_pathÚ	type_fileÚlevel_absolute_pathÚ
level_filer´   Úshared_cpu_list_absolute_pathÚshare_cpu_list_files                r   rš   rš     s   € ð 	@Ð&7Ð?Ð?Ð?ð  ð €IÝ+.©5¬5Ð(Ý”Ð7Ñ8Ô8ð ñ ˆØ×Ò Ñ(Ô(ð 	°°a°b°b´	×0CÒ0CÑ0EÔ0Eð 	ØÝ$&¤G§L¢LÐ1LÈeÑ$TÔ$TÐ!õ  œWŸ\š\Ð*CÀVÑLÔLÐÝÐ$Ñ%Ô%ð 	¨Ø�~Š~ÑÔ×%Ò%Ñ'Ô'Ð/BÐBÐBØð	ð 	ð 	ñ 	ô 	ð 	ð 	ØBð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ !œgŸlšlÐ+DÀgÑNÔNÐÝÐ%Ñ&Ô&ð 	+¨*Ý˜
ŸšÑ)Ô)Ñ*Ô*ˆEð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+à�IÒÐÙàˆ	Ý(*¬¯ªØ%Ð'8ñ)
ô )
Ð%õ Ð/Ñ0Ô0ð 	Ð4GÝ3RØ#×(Ò(Ñ*Ô*ñ4ô 4Ð0ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ùð
 0Ð/s6   Â/*C2Ã2C6	Ã9C6	Ä,"EÅE	Å!E	Æ"GÇG	ÇG	rn   c                 óH   — t          | ¬¦  «        }t          ¦   «         }||z  S ©Nrm   )Ú0_get_cpu_indices_for_numa_node_MAYBE_NOT_ALLOWEDÚ+_get_allowed_cpu_indices_for_current_thread)rn   Úall_cpu_indicesÚallowed_cpu_indicess      r   rp   rp   1  s4   € ÝFØ'ðñ ô €Oõ FÑGÔGÐØÐ0Ñ0Ð0r   c                 óò   — d| › d�}	 t          |¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   n&# t          $ r}t          d| ›d�¦  «        |‚d}~ww xY wt	          |¦  «        S )z­
    Returns:
        Indices of all CPUs associated with numa_node_index. However, the list
        is not filtered based on whether the thread is allowed to use them.
    z/sys/devices/system/node/nodez/cpulistNz:Could not determine CPUs corresponding to numa_node_index=ú.)r©   r«   ÚFileNotFoundErrorrY   rª   )rn   Úcpulist_absolute_pathr­   Úcpu_range_strÚes        r   rÈ   rÈ   9  sÜ   € ð V¸OÐUÐUÐUÐðÝÐ'Ñ(Ô(ð 	%¨AØŸFšF™HœHˆMð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%øøåð ð ð ÝØL¸ÐLÐLÐLñ
ô 
àð	øøøøðøøøõ +¨=Ñ9Ô9Ð9s3   ˆA —8¬A ¸<¼A ¿<Á A Á
A'ÁA"Á"A'c                  ó>   — t           j                             ¦   «         S )N)ÚtorchÚcudaÚdevice_countr   r   r   Ú_get_gpu_countrÖ   L  s   € ÝŒ:×"Ò"Ñ$Ô$Ð$r   c                 óf  — t           j                             | ¦  «        }|j        }|j        }|j        }|d›d|d›d|d›d�}d|› d�}t          |¦  «        5 }t          t          | 	                    ¦   «          
                    ¦   «         ¦  «        d¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )NÚ04xú:Ú02xz.0z/sys/bus/pci/devices/z
/numa_noder   )rÓ   rÔ   Úget_device_propertiesÚpci_domain_idÚ
pci_bus_idÚpci_device_idr©   Úmaxr_   r«   rº   )r%   Údevice_propertiesÚdomainÚbusÚdeviceÚpci_addrÚpci_numa_node_absolute_pathr­   s           r   ro   ro   P  s  € Ýœ
×8Ò8¸ÑCÔCÐàÔ,€FØ
Ô
&€CØÔ,€Fð Ð7Ð7Ð7˜sÐ7Ð7Ð7¨Ð7Ð7Ð7Ð7€Hà"N¸(Ð"NÐ"NÐ"NÐÝ	Ð)Ñ	*Ô	*ð -¨aõ •3�q—v’v‘x”x—~’~Ñ'Ô'Ñ(Ô(¨!Ñ,Ô,ð	-ð -ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s   ÁAB&Â&B*Â-B*c                 óR   ‡ — ˆ fd„t          t          ¦   «         ¦  «        D ¦   «         S )Nc                 ó<   •— h | ]}t          |¬ ¦  «        ‰k    ¯|’ŒS )re   )ro   )r„   r%   rn   s     €r   r…   z1_get_gpu_indices_for_numa_node.<locals>.<setcomp>c  s9   ø€ ð ð ð àÝ-¸	ÐBÑBÔBÀoÒUÐUð 	àUÐUÐUr   )ÚrangerÖ   rm   s   `r   r†   r†   b  s<   ø€ ðð ð ð å�~Ñ/Ô/Ñ0Ô0ðñ ô ð r   c                 óB   — t          | ¬¦  «        }t          |¬¦  «        S ©Nrm   )Ú	cpu_index)Ú._get_arbitrary_allowed_cpu_index_for_numa_nodeÚ_get_socket_index_for_cpu)rn   Úarbitrary_cpu_indexs     r   rs   rs   j  s.   € ÝHØ'ðñ ô Ðõ %Ð/BÐCÑCÔCÐCr   rë   c                 ó  — d| › d�}	 t          |¦  «        5 }t          |                     ¦   «                              ¦   «         ¦  «        cd d d ¦  «         S # 1 swxY w Y   d S # t          $ r}t          d| ›�¦  «        |‚d }~ww xY w)Nr¨   z/topology/physical_package_idz)Could not determine socket for cpu_index=)r©   r_   r«   rº   rÎ   rY   )rë   Úpackage_id_absolute_pathr­   rÑ   s       r   rí   rí   r  så   € àN iÐNÐNÐNð ðRÝÐ*Ñ+Ô+ð 	)¨qÝ�q—v’v‘x”x—~’~Ñ'Ô'Ñ(Ô(ð	)ð 	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øåð Rð Rð RÝÐI¸YÐIÐIÑJÔJÐPQÐQøøøøðRøøøs:   ˆA$ —3AÁ
A$ ÁAÁA$ ÁAÁA$ Á$
BÁ.BÂBc                 ó<   — t          t          | ¬¦  «        ¦  «        S rÇ   )r~   rp   rm   s    r   rì   rì   }  s"   € ÝÝ6ÀÐWÑWÔWñô ð r   Ú
ranges_strc                 ó†  — t          ¦   «         }|                      d¦  «        D ]œ}|                     ¦   «         }|sŒd|v r]|                     d¦  «        \  }}t          |¦  «        t          |¦  «        }}|                     t          ||dz   ¦  «        ¦  «         Œz|                     t          |¦  «        ¦  «         Œ�|S )z¦
    Util for parsing a string of int ranges, as in a sysfs file.

    Args:
        ranges_str: E.g., "0-2,4,6-7"

    Returns:
        E.g., {0, 1, 2, 4, 6, 7}
    r‚   ú-r�   )ru   Úsplitrº   r_   rv   rè   r¤   )rò   ÚintsÚ	range_strÚ	start_strÚend_strr•   r–   s          r   rª   rª   ƒ  s½   € õ ‘U”U€DØ×%Ò% cÑ*Ô*ð 	%ð 	%ˆ	Ø—O’OÑ%Ô%ˆ	Øð 	ØØ�)ÐÐØ!*§¢°Ñ!5Ô!5ÑˆI�wÝ˜Y™œ­¨W©¬�3ˆEØ�KŠK�˜e S¨1¡WÑ-Ô-Ñ.Ô.Ð.Ð.à�HŠH•S˜‘^”^Ñ$Ô$Ð$Ð$Ø€Kr   rö   c                 ó€  — | sdS t          | ¦  «        }g }|d         x}}|dd…         D ]I}||dz   k    r|}Œ||k    r|                     |› ¦  «         n|                     |› d|› �¦  «         |x}}ŒJ||k    r|                     |› ¦  «         n|                     |› d|› �¦  «         d                     |¦  «        S )zž
    Convert a set of integers to a compact string with ranges.

    Args:
        ints: E.g., {0, 1, 2, 4, 6, 7}

    Returns:
        E.g., "0-2,4,6-7"
    Ú r   r�   Nrô   r‚   )r‡   Úappendr¹   )rö   Úsorted_intsÚrangesr•   ÚprevÚnums         r   rI   rI   ›  sú   € ð ð Øˆrå˜‘,”,€KØ€FØ˜q”>Ð!€EˆDà˜1˜2˜2Œð ð ˆØ�$˜‘(Š?ˆ?ØˆDˆDà˜Š}ˆ}Ø—’ ˜jÑ)Ô)Ð)Ð)à—’ Ð/Ð/¨Ð/Ð/Ñ0Ô0Ð0ØÐˆE�D�Dð �‚}€}Ø�Š˜�jÑ!Ô!Ð!Ð!à�Š˜Ð'Ð' Ð'Ð'Ñ(Ô(Ð(à�8Š8�FÑÔÐr   c                  ó–   — t          d¦  «        5 } |                      ¦   «         }d d d ¦  «         n# 1 swxY w Y   t          |¦  «        S )Nz!/sys/devices/system/node/possible)r©   r«   rª   )r­   Úpossible_nodes_strs     r   Ú!_get_systemwide_numa_node_indicesr  ¿  s‚   € Ý	Ð1Ñ	2Ô	2ð &°aØŸVšV™XœXÐð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &õ +Ð+=Ñ>Ô>Ð>s   �1±5¸5rr   c                 óº   — t          ¦   «         }t          ¦   «         }|D ];}t          |¬¦  «        }| t          |¬¦  «        k    r|                     |¦  «         Œ<|S rê   )r  ru   rì   rí   r¤   )rr   Úsystemwide_numa_node_indicesÚmatching_numa_node_indicesrn   rî   s        r   rt   rt   Æ  st   € Ý#DÑ#FÔ#FÐ å!$¡¤ÐØ7ð <ð <ˆÝLØ+ð
ñ 
ô 
Ðð Õ4Ð?RÐSÑSÔSÒSÐSØ&×*Ò*¨?Ñ;Ô;Ð;øà%Ð%r   c                  ó*   — t          j        d¦  «        S )Nr   )r[   r\   r   r   r   rÉ   rÉ   Ô  s   € õ Ô Ñ"Ô"Ð"r   )DÚ__doc__r[   rW   rN   Úcollectionsr   Úcollections.abcr   r   Údataclassesr   r   Úenumr   Ú	functoolsr	   Úloggingr
   Útypingr   r   rÓ   Útorch._utils_internalr   Ú__all__r   rP   Ústrr   r   Útupler_   r<   r=   r>   rE   rC   ru   r7   rŠ   Úobjectr9   r6   rU   rH   rT   rf   rg   rh   ri   r    r¡   r‰   r   rš   rp   rÈ   rÖ   ro   r†   rs   rí   rì   rª   rI   r  rt   rÉ   r   r   r   ú<module>r     sÁ  ððð ð( 
€	€	€	Ø €€€Ø Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ð Øð€ð
 
ˆ�8Ñ	Ô	€ð+ð +ð +ð +ð +�3˜ñ +ô +ð +ð\ €�$ÐÑÔð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ Ôð
ð7Ø˜˜S˜”/ð7ð ð7ð  Ñ$ð	7ð
 ˆ3�ˆ8„_ð7ð 7ð 7ð 7ðt ˆ9�ZÑ Ô €Øˆ7�:ÑÔ€ð#Ø
�8˜XÐ%Ô
&ð#ð ð#ð  Ñ$ð	#ð
 ˆh˜Ð Ô!ð#ð #ð #ð #ðLKØðKØ%0ðKà	ðKð Kð Kð Kð>Ø# C¨ HœoðØDGÈÄHðà
ˆ3�ˆ8„_ðð ð ð ð
Ø ð
Ø15°c¸6°kÔ1Bð
à	ð
ð 
ð 
ð 
ð.
àð
ð ð
ð 	ˆ„Xð	
ð 
ð 
ð 
ðJ°c¸#´hð JÀ4ð Jð Jð Jð JðØ œHðà	ðð ð ð ð8àðð ðð 	ˆ„Xð	ð ð ð ð8°Cð ¸CÀ¼Hð ð ð ð ð°cð ¸cÀ#¼hð ð ð ð ð.C0¸ð C0ÀÀSÄð C0ð C0ð C0ð C0ðL,0¸Cð ,0ÀCÈÄHð ,0ð ,0ð ,0ð ,0ð^ €GˆC�L„L€Ø€GˆC�L„L€ð�h˜q”kð ¨H°a°S¸!°VÔ,<ð ÀÀaÈÈQÌÀiÄð ð ð ð ð9Øð9àˆ„Xð9ð 9ð 9ð 9ð#0Øð#0àˆ„Xð#0ð #0ð #0ð #0ðL1Àsð 1ÈsÐSVÌxð 1ð 1ð 1ð 1ð:Øð:àˆ„Xð:ð :ð :ð :ð&%˜ð %ð %ð %ð %ð-°Sð -¸Sð -ð -ð -ð -ð$°sð ¸sÀ3¼xð ð ð ð ðD¸ð DÀð Dð Dð Dð DðR¨Cð R°Cð Rð Rð Rð RðÀsð Èsð ð ð ð ð°ð ¸¸C¼ð ð ð ð ð0! H¨S¤Mð !°cð !ð !ð !ð !ðH?¨3¨s¬8ð ?ð ?ð ?ð ?ð&¸Sð &ÀSÈÄXð &ð &ð &ð &ð#°S¸´Xð #ð #ð #ð #ð #ð #r   