
    9jN                    l   d dl mZ d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
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mZmZmZ erd d	lmZmZ d
ZdZdZdZdZ G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d de      Z$ G d de      Z% G d de      Z& G d de      Z'd!dZ(y )"    )annotations)TYPE_CHECKING)tabulate)DebugHandler	fetch_allformat_fetch_summaryformat_jsonNavLinkResponseRoute)tcpstore_client)build_db)	JobConfig)
CollectiveDatabaseGroup
MembershipNCCLCall)FrontendServerHTTPRequestHandlerz
{% extends "base.html" %}
{% block header %}
  <h1>{% block title %}Index{% endblock %}</h1>
{% endblock %}
{% block content %}
Hi
{% endblock %}
    aQ  
{% extends "base.html" %}
{% block header %}
    <h1>{% block title %}py-spy Stack Traces{% endblock %}</h1>
{% endblock %}
{% block content %}
    <form action="" method="get">
        <input type="checkbox" id="native" name="native" value="1"/>
        <label for="native">Native</label>
        <input type="checkbox" id="subprocesses" name="subprocesses" value="1"/>
        <label for="subprocesses">Subprocesses</label>
        <input type="submit" value="Submit">
    </form>

    {% for i, (addr, resp) in enumerate(zip(addrs, resps)) %}
        <h2>Rank {{ i }}: {{ addr }}</h2>
        {% if resp.status_code != 200 %}
            <p>Failed to fetch: status={{ resp.status_code }}</p>
            <pre>{{ resp.text }}</pre>
        {% else %}
            <pre>{{ resp.text }}</pre>
        {% endif %}
    {% endfor %}
{% endblock %}
    a  
{% extends "base.html" %}
{% block header %}
    <h1>{% block title %}{{ title }}{% endblock %}</h1>
{% endblock %}
{% block content %}
    {% if fetch_summary %}<pre>{{ fetch_summary }}</pre>{% endif %}
    <h2>Groups</h2>
    {{ groups | safe }}
    <h2>Memberships</h2>
    {{ memberships | safe }}
    <h2>Collectives</h2>
    {{ collectives | safe }}
    <h2>NCCL Calls</h2>
    {{ ncclcalls | safe }}
{% endblock %}
    a  
{% extends "base.html" %}
{% block header %}
    <h1>{% block title %}torch.profiler{% endblock %}</h1>
{% endblock %}

{% block content %}
    <form action="" method="get">
        <label for="duration">Duration (seconds):</label>
        <input type="number" id="duration" name="duration" value="{{ duration }}" min="1" max="60">
        <input type="submit" value="Submit">
    </form>

    <script>
    function stringToArrayBuffer(str) {
        const encoder = new TextEncoder();
        return encoder.encode(str).buffer;
    }
    async function openPerfetto(data) {
        const ui = window.open('https://ui.perfetto.dev/#!/');
        if (!ui) { alert('Popup blocked. Allow popups for this page and click again.'); return; }

        // Perfetto readiness handshake: PING until we receive PONG
        await new Promise((resolve, reject) => {
        const onMsg = (e) => {
            if (e.source === ui && e.data === 'PONG') {
            window.removeEventListener('message', onMsg);
            clearInterval(pinger);
            resolve();
            }
        };
        window.addEventListener('message', onMsg);
        const pinger = setInterval(() => { try { ui.postMessage('PING', '*'); } catch (_e) {} }, 250);
        setTimeout(() => { clearInterval(pinger); window.removeEventListener('message', onMsg); reject(); }, 20000);
        }).catch(() => { alert('Perfetto UI did not respond. Try again.'); return; });

        ui.postMessage({
        perfetto: {
            buffer: stringToArrayBuffer(JSON.stringify(data)),
            title: "torch profiler",
            fileName: "trace.json",
        }
        }, '*');
    }
    </script>

    {% for i, (addr, resp) in enumerate(zip(addrs, resps)) %}
        <h2>Rank {{ i }}: {{ addr }}</h2>
        {% if resp.status_code != 200 %}
            <p>Failed to fetch: status={{ resp.status_code }}</p>
            <pre>{{ resp.text }}</pre>
        {% else %}
            <script>
            function run{{ i }}() {
                var data = {{ resp.text | safe }};
                openPerfetto(data);
            }
            </script>

            <button onclick="run{{ i }}()">View {{ i }}</button>
        {% endif %}
    {% endfor %}
{% endblock %}
    a  
{% extends "base.html" %}
{% block header %}
    <h1>{% block title %}TCPStore Keys{% endblock %}</h1>
{% endblock %}
{% block content %}
    <pre>
    {% for k, v in zip(keys, values) -%}
{{ k }}: {{ v | truncate(100) }}
    {% endfor %}
    </pre>
{% endblock %}
    c                  ,    e Zd ZddZddZddZd	dZy)
IndexHandlerc                0    t        d| j                        gS )N/r   _handleselfs    g/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/distributed/debug/_debug_handlers.pyrouteszIndexHandler.routes   s    c4<<())    c                    t        dd      gS )Nr   Homer
   r   s    r   	nav_linkszIndexHandler.nav_links   s    V$%%r!   c                    dt         iS Nz
index.html)INDEX_TEMPLATEr   s    r   	templateszIndexHandler.templates   s    n--r!   c                8    |j                   j                  d      S r'   )frontendrender_template)r   reqs     r   r   zIndexHandler._handle   s    ||++L99r!   Nreturnzlist[Route]r/   zlist[NavLink]r/   zdict[str, str]r-   r   r/   bytes__name__
__module____qualname__r    r%   r)   r    r!   r   r   r      s    *&.:r!   r   c                  4    e Zd ZddZddZd	dZd
dZddZy)StacksHandlerc                0    t        d| j                        gS )N/stacksr   r   s    r   r    zStacksHandler.routes   s    i.//r!   c                    t        dd      gS )Nr<   zPython Stack Tracesr$   r   s    r   r%   zStacksHandler.nav_links   s    	#89::r!   c                t    t        d| j                        \  }}|j                  j                  dd||      S )Ndump_tracebacktimeoutzraw_resp.htmlStackstitleaddrsrespsr   fetch_timeoutr+   r,   r   r-   rE   rF   s       r   r   zStacksHandler._handle   s>     !14;M;MNu||++85 , 
 	
r!   c                   t        d| j                        \  }}g }t        ||      }|r"|j                  |       |j                  d       t	        t        ||            D ]Y  \  }\  }}|j                  d| d| d       |j                  |j                  dk(  r|j                  nd|j                          [ d	j                  |      S )
Nr?   r@    	=== Rank :  ===   Error: 
	r   rH   r   append	enumeratezipstatus_codetextjoinr   rE   rF   partssummaryiaddrresps           r   dumpzStacksHandler.dump   s     !14;M;MNu&ue4LL!LL(UE):; 	OA|dLL9QCr$t45LL!--4		GDDTDTCU:V	
 yyr!   c                     y)Nstacksr8   r   s    r   dump_filenamezStacksHandler.dump_filename   s    r!   Nr.   r0   r2   r/   z
str | Noner/   strr5   r6   r7   r    r%   r   r_   rb   r8   r!   r   r:   r:      s    0;
 r!   r:   c                  <    e Zd ZddZd	dZd
dZddZddZddZy)PySpyHandlerc                0    t        d| j                        gS )N/pyspy_dumpr   r   s    r   r    zPySpyHandler.routes   s    mT\\233r!   c                    t        dd      gS )Nrj   zpy-spy Stacksr$   r   s    r   r%   zPySpyHandler.nav_links   s    788r!   c                    dt         iS )Npyspy_dump.html)PYSPY_DUMP_TEMPLATEr   s    r   r)   zPySpyHandler.templates   s    !#677r!   c                    |j                         }d|vr	|rd| nd}t        d|| j                        \  }}|j                  j	                  d||      S )Nnonblockingznonblocking=1&nonblocking=1
pyspy_dumpr@   rm   rE   rF   )get_raw_queryr   rH   r+   r,   )r   r-   queryrE   rF   s        r   r   zPySpyHandler._handle   se    !!#%05nUG,?E ud>P>PQu||++ , 
 	
r!   c                   t        dd| j                        \  }}g }t        ||      }|r"|j                  |       |j                  d       t	        t        ||            D ]Y  \  }\  }}|j                  d| d| d       |j                  |j                  dk(  r|j                  nd	|j                          [ d
j                  |      S )Nrr   rq   r@   rK   rL   rM   rN   rO   rP   rQ   rR   rY   s           r   r_   zPySpyHandler.dump   s     /43E3E
u &ue4LL!LL(UE):; 	OA|dLL9QCr$t45LL!--4		GDDTDTCU:V	
 yyr!   c                     y)Nrr   r8   r   s    r   rb   zPySpyHandler.dump_filename  s    r!   Nr.   r0   r1   r2   rc   rd   	r5   r6   r7   r    r%   r)   r   r_   rb   r8   r!   r   rh   rh      s     498	
  r!   rh   c                  ~    e Zd ZddZddZddZedd       Z	 	 	 	 	 	 	 	 ddZddZ	ddZ
ddZdd	Zdd
ZddZy)FlightRecorderHandlerc                    t        d| j                        t        d| j                        t        d| j                        t        d| j                        gS )N	/fr_trace/fr_trace_json/fr_trace_nccl/fr_trace_nccl_json)r   _handle_fr_trace_handle_fr_trace_json_handle_fr_trace_nccl_handle_fr_trace_nccl_jsonr   s    r   r    zFlightRecorderHandler.routes  sO    +t445"D$>$>?"D$>$>?')H)HI	
 	
r!   c                ^    t        dd      t        dd      t        dd      t        dd      gS )Nr|   zFlightRecorder CPUr}   (JSON)r~   FlightRecorder NCCLr   r$   r   s    r   r%   zFlightRecorderHandler.nav_links  s9    K!56$h/$&;<)84	
 	
r!   c                    dt         iS Nfr_trace.htmlFR_TRACE_TEMPLATEr   s    r   r)   zFlightRecorderHandler.templates      !233r!   c                r   t               }|j                  g       }d|_        d|_        i }t	        |      D ]?  \  }}|j
                  dk7  r|| |   d|j                         }d|vrg |d<   ||d| d<   A |st        d      t        t        |j                                     d	   }t        |||      S )
N)argsTrO   )rank	host_nameentriesr   z.jsonzAll workers failed to respondversion)r   
parse_argsallow_incomplete_ranksverboserT   rV   jsonRuntimeErrornextitervaluesr   )	rE   rF   configr   detailsr   r^   r_   r   s	            r   	_build_dbzFlightRecorderHandler._build_db  s      b )&*##E* 
	/JD$3&"4[ ))+D
 $"$Y*.Gd4&&'
	/ >??tGNN,-.y9w//r!   c                   | j                  ||      }|j                  ddt        ||      t        |j                  t
        j                  d      t        |j                  t        j                  d      t        |j                  t        j                  d      t        |j                  t        j                  d            S )Nr   FlightRecorderhtmlheaderstablefmtrD   fetch_summarygroupsmembershipscollectives	ncclcalls)r   r,   r   r   r   r   _fieldsr   r   r   r   r   r   r   serverrE   rF   dbs        r   _render_tablesz$FlightRecorderHandler._render_tables4  s     ^^E5)%%".ue<BIIu}}vN 
(:(:V !
(:(:V r||X5E5EPVW & 
 	
r!   c                    t        d| j                        \  }}| j                  |j                  |t	        |            S )Nfr_trace_jsonr@   r   rH   r   r+   listrI   s       r   r   z&FlightRecorderHandler._handle_fr_traceF  s5     $:L:LMu""3<<UDDr!   c                t    t        d| j                        \  }}|j                  j                  dd||      S )Nr   r@   json_resp.htmlr   rC   rG   rI   s       r   r   z+FlightRecorderHandler._handle_fr_trace_jsonJ  s@     $:L:LMu||++"	 , 
 	
r!   c                    t        dd| j                        \  }}| j                  |j                  |t	        |            S )Ndump_nccl_trace_jsononlyactive=truer@   r   rI   s       r   r   z+FlightRecorderHandler._handle_fr_trace_ncclS  s=     "$5t?Q?Q
u ""3<<UDDr!   c                v    t        dd| j                        \  }}|j                  j                  dd||      S )Nr   r   r@   r   r   rC   rG   rI   s       r   r   z0FlightRecorderHandler._handle_fr_trace_nccl_jsonY  sH     "$5t?Q?Q
u ||++'	 , 
 	
r!   c                &   g }t        d| j                        \  }}t        ||      }|r"|j                  |       |j                  d       | j	                  ||      }|j                  ddt        |j                  t        j                  d      dt        |j                  t        j                  d      d	t        |j                  t        j                  d      d
t        |j                  t        j                  d      g	       	 t        dd| j                        \  }}| j	                  ||      }|j                  dddt        |j                  t        j                  d      dt        |j                  t        j                  d      d	t        |j                  t        j                  d      d
t        |j                  t        j                  d      g
       dj#                  |      S # t         $ r |j                  d       Y -w xY w)Nr   r@   rK   z=== FR Trace ===--- Groups ---plainr   --- Memberships ------ Collectives ------ NCCL Calls ---r   r   z=== FR Trace NCCL ===z1
=== FR Trace NCCL ===
Failed to fetch NCCL tracerQ   )r   rH   r   rS   r   extendr   r   r   r   r   r   r   r   r   r   	ExceptionrX   )	r   rZ   rE   rF   r[   r   
nccl_addrs
nccl_respsnccl_dbs	            r   r_   zFlightRecorderHandler.dumpd  s    $:L:LMu&ue4LL!LL^^E5)" EMMGL%1C1CgV%1C1CgV$x/?/?'R
	
 	P%.&(94CUCU&"J
 nnZ<GLL+$W^^U]]WU)++ * 2 2!(
 *++ * 2 2!(
 ))) ( 0 0!(%: yy  	PLLNO	Ps   
CG3 3HHc                     y)Nfr_tracer8   r   s    r   rb   z#FlightRecorderHandler.dump_filename      r!   Nr.   r0   r1   )rE   	list[str]rF   list[Response]r/   r   r   r   rE   r   rF   r   r/   r3   r2   rc   rd   )r5   r6   r7   r    r%   r)   staticmethodr   r   r   r   r   r   r_   rb   r8   r!   r   rz   rz     sk    

4 0 04
$
-6
?M
	
$E
E	
9 vr!   rz   c                  ,    e Zd ZddZddZddZd	dZy)
ProfilerHandlerc                0    t        d| j                        gS )N/profiler   r   s    r   r    zProfilerHandler.routes  s    j$,,/00r!   c                    t        dd      gS )Nr   ztorch profilerr$   r   s    r   r%   zProfilerHandler.nav_links  s    
$4566r!   c                    dt         iS )Nprofile.html)PROFILE_TEMPLATEr   s    r   r)   zProfilerHandler.templates  s     011r!   c                    |j                  ddt              }t        dd| | j                        \  }}|j                  j                  d||      S )	Ndurationg      ?)defaulttypetorch_profilez	duration=r@   r   rs   )get_query_argfloatr   rH   r+   r,   )r   r-   r   rE   rF   s        r   r   zProfilerHandler._handle  sY    $$Z5$I y
3T=O=O
u ||++N%u+UUr!   Nr.   r0   r1   r2   r4   r8   r!   r   r   r     s    172Vr!   r   c                  4    e Zd ZddZddZd	dZd
dZddZy)WaitCountersHandlerc                0    t        d| j                        gS )N/wait_countersr   r   s    r   r    zWaitCountersHandler.routes  s    &566r!   c                    t        dd      gS )Nr   Wait Countersr$   r   s    r   r%   zWaitCountersHandler.nav_links  s    (/:;;r!   c                t    t        d| j                        \  }}|j                  j                  dd||      S )Nwait_counter_valuesr@   r   r   rC   rG   rI   s       r   r   zWaitCountersHandler._handle  s>     !6@R@RSu||++O5 , 
 	
r!   c                   t        d| j                        \  }}g }t        ||      }|r"|j                  |       |j                  d       t	        t        ||            D ]r  \  }\  }}|j                  d| d| d       |j                  dk(  r%|j                  t        |j                               U|j                  d|j                          t d	j                  |      S )
Nr   r@   rK   rL   rM   rN   rO   rP   rQ   )
r   rH   r   rS   rT   rU   rV   r	   rW   rX   rY   s           r   r_   zWaitCountersHandler.dump  s     !6@R@RSu&ue4LL!LL(UE):; 	;OA|dLL9QCr$t453&[34wt'7'7&89:	; yyr!   c                     y)Nwait_countersr8   r   s    r   rb   z!WaitCountersHandler.dump_filename  s    r!   Nr.   r0   r2   rc   rd   rf   r8   r!   r   r   r     s    7<
 r!   r   c                  <    e Zd ZddZd	dZd
dZddZddZddZy)TCPStoreHandlerc                0    t        d| j                        gS )N	/tcpstorer   r   s    r   r    zTCPStoreHandler.routes  s    k4<<011r!   c                    t        dd      gS )Nr   TCPStorer$   r   s    r   r%   zTCPStoreHandler.nav_links  s    Z011r!   c                    dt         iS )Ntcpstore.html)TCPSTORE_TEMPLATEr   s    r   r)   zTCPStoreHandler.templates  r   r!   c                    t        d      }|j                         }|j                          |j                  |      D cg c]  }t	        |       }}|j
                  j                  d||      S c c}w )NrK   prefixr   )keysr   )r   	list_keyssort	multi_getreprr+   r,   )r   r-   storer   vr   s         r   r   zTCPStoreHandler._handle  sb    r* 		#(??4#89a$q'99||++O$v+VV :s    A2c                &   t        d      }|j                         }|j                          |j                  |      D cg c]  }t	        |       }}t        ||      D cg c]  \  }}| d|  }}}dj                  |      S c c}w c c}}w )NrK   r   rM   rQ   )r   r   r   r   r   rU   rX   )r   r   r   r   r   krZ   s          r   r_   zTCPStoreHandler.dump  s    r* 		#(??4#89a$q'99),T6):;AA3b;;yy :;s    B#Bc                     y)Ntcpstorer8   r   s    r   rb   zTCPStoreHandler.dump_filename  r   r!   Nr.   r0   r1   r2   rc   rd   rx   r8   r!   r   r   r     s!    224W r!   r   c                  `    e Zd ZdZddZddZddZddZddZ	 	 	 	 	 	 	 	 ddZ	ddZ
dd	Zy
)TorchCommsFlightRecorderHandlerz1Handler for TorchComms FlightRecorder trace data.c                Z    t        d| j                        t        d| j                        gS )N/torchcomms_fr_trace/torchcomms_fr_trace_json)r   _handle_torchcomms_fr_trace _handle_torchcomms_fr_trace_jsonr   s    r   r    z&TorchCommsFlightRecorderHandler.routes  s.    ($*J*JK-t/T/TU
 	
r!   c                2    t        dd      t        dd      gS )Nr   zTorchComms FRr   r   r$   r   s    r   r%   z)TorchCommsFlightRecorderHandler.nav_links  s"    *O</:
 	
r!   c                    dt         iS r   r   r   s    r   r)   z)TorchCommsFlightRecorderHandler.templates  r   r!   c                    t        dd| j                        \  }}| j                  |j                  |t	        |            S )Ntorchcomms_fr_trace_jsonr   r@   r   rI   s       r   r  z;TorchCommsFlightRecorderHandler._handle_torchcomms_fr_trace  s=     &(94CUCU
u ""3<<UDDr!   c                v    t        dd| j                        \  }}|j                  j                  dd||      S )Nr  r   r@   r   TorchComms FlightRecorderrC   rG   rI   s       r   r  z@TorchCommsFlightRecorderHandler._handle_torchcomms_fr_trace_json
  sH     &(94CUCU
u ||++-	 , 
 	
r!   c                   t         j                  ||      }|j                  ddt        ||      t	        |j
                  t        j                  d      t	        |j                  t        j                  d      t	        |j                  t        j                  d      t	        |j                  t        j                  d            S )Nr   r  r   r   r   )rz   r   r,   r   r   r   r   r   r   r   r   r   r   r   r   s        r   r   z.TorchCommsFlightRecorderHandler._render_tables  s     #,,UE:%%-.ue<BIIu}}vN 
(:(:V !
(:(:V r||X5E5EPVW & 
 	
r!   c                <   t        d| j                        \  }}g }t        ||      }|r"|j                  |       |j                  d       t        j                  ||      }|j                  ddt        |j                  t        j                  d      dt        |j                  t        j                  d      d	t        |j                  t        j                  d      d
t        |j                  t         j                  d      g	       dj#                  |      S )Nr  r@   rK   z=== TorchComms FR Trace ===r   r   r   r   r   r   rQ   )r   rH   r   rS   rz   r   r   r   r   r   r   r   r   r   r   r   r   rX   )r   rE   rF   rZ   r[   r   s         r   r_   z$TorchCommsFlightRecorderHandler.dump'  s     !;TEWEWXu&ue4LL!LL",,UE:- EMMGL%1C1CgV%1C1CgV$x/?/?'R
	
 yyr!   c                     y)Ntorchcomms_fr_tracer8   r   s    r   rb   z-TorchCommsFlightRecorderHandler.dump_filename>  s    $r!   Nr.   r0   r1   r2   r   rc   rd   )r5   r6   r7   __doc__r    r%   r)   r  r  r   r_   rb   r8   r!   r   r   r     sN    ;

4E	

$
-6
?M
	
$ .%r!   r   c            	         t               t               t               t               t	               t               t               t               gS )N)r   r:   rh   rz   r   r   r   r   r8   r!   r   default_handlersr  B  s9    ')	 	r!   N)r/   zlist[DebugHandler]))
__future__r   typingr   r   !torch.distributed.debug._frontendr   r   r   r	   r
   r   r   torch.distributed.debug._storer   4torch.distributed.flight_recorder.components.builderr   ;torch.distributed.flight_recorder.components.config_managerr   2torch.distributed.flight_recorder.components.typesr   r   r   r   r   r   r   r(   rn   r   r   r   r   r:   rh   rz   r   r   r   r   r  r8   r!   r   <module>r     s    "      ; I Q  T 4 $? B (:< :L >&< &R[L [|Vl V$, @l :M%l M%`
r!   