Ë
    ÄÓ^jHa  ã                  ó²  — d dl mZ d dl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  ej8                  e«      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 Z, G d!„ d"e«      Z-d$d#„Z.y)%é    )ÚannotationsN)Ú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    úr/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/distributed/debug/_debug_handlers.pyÚrouteszIndexHandler.routes´   s   € Ü�c˜4Ÿ<™<Ó(Ð)Ð)ó    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>   € Ü Ð!1¸4×;MÑ;MÔN‰ˆˆuØ�|‰|×+Ñ+Ø 8°5Àð ,ó 
ð 	
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Ä   € Ü Ð!1¸4×;MÑ;MÔN‰ˆˆuØˆÜ& u¨eÓ4ˆÙØ�L‰L˜Ô!Ø�L‰L˜ÔÜ(¬¨U°EÓ):Ó;ò 	‰OˆA‰|��dØ�L‰L˜9 Q C r¨$¨¨tÐ4Ô5Ø�L‰LØ!×-Ñ-°Ò4�—	’	¸GÀD×DTÑDTÐCUÐ:Võð	ð
 �y‰y˜ÓÐ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   € Ü�m T§\¡\Ó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   € Ø×!Ñ!Ó#ˆØ Ñ%Ù05�n U GÑ,¸?ˆEÜ  ¨u¸d×>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Ê   € Ü Ø˜/°4×3EÑ3Eô
‰ˆˆuð ˆÜ& u¨eÓ4ˆÙØ�L‰L˜Ô!Ø�L‰L˜ÔÜ(¬¨U°EÓ):Ó;ò 	‰OˆA‰|��dØ�L‰L˜9 Q C r¨$¨¨tÐ4Ô5Ø�L‰LØ!×-Ñ-°Ò4�—	’	¸GÀD×DTÑDTÐCUÐ:Võð	ð
 �y‰y˜ÓÐ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Ó*ò 
	/‰JˆD�$Ø×Ñ 3Ò&ØàØ" 4™[ñð —)‘)“+ðˆDð
  Ñ$Ø"$��Y‘Ø*.ˆG�d˜4˜& Ð&Ò'ð
	/ñ ÜÐ>Ó?Ð?ä”t˜GŸN™NÓ,Ó-Ó.¨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_tables8  s�   € ð �^‰^˜E 5Ó)ˆØ×%Ñ%ØØ"Ü.¨u°eÓ<Ü˜BŸI™I¬u¯}©}ÀvÔNÜ Ø—‘¬
×(:Ñ(:ÀVôô !Ø—‘¬
×(:Ñ(:ÀVôô ˜rŸ|™|´X×5EÑ5EÐPVÔ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_traceJ  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_jsonN  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_ncclW  s=   € Ü Ø"Ð$5¸t×?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_json]  sH   € Ü Ø"Ð$5¸t×?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.dumph  sÂ  € Øˆä  ¸$×:LÑ:LÔM‰ˆˆuÜ& u¨eÓ4ˆÙØ�L‰L˜Ô!Ø�L‰L˜ÔØ�^‰^˜E 5Ó)ˆØ�‰à"Ø Ü˜Ÿ™¬E¯M©MÀGÔLØ%Ü˜Ÿ™´×1CÑ1CÈgÔVØ%Ü˜Ÿ™´×1CÑ1CÈgÔVØ$Ü˜Ÿ™¬x×/?Ñ/?È'ÔRð
ô	
ð 	PÜ%.Ø&Ð(9À4×CUÑCUô&Ñ"ˆJ˜
ð —n‘n Z°Ó<ˆGØ�L‰LàØ+Ø$Ü˜WŸ^™^´U·]±]ÈWÔUØ)ÜØ×+Ñ+Ü *× 2Ñ 2Ø!(ôð
 *ÜØ×+Ñ+Ü *× 2Ñ 2Ø!(ôð
 )ÜØ×)Ñ)Ü (× 0Ñ 0Ø!(ôð%ôð: �y‰y˜ÓÐøô ò 	PØ�L‰LÐ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ó ð0ð4
Ø$ð
Ø-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¨¨
Ð3¸T×=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Ø�|‰|×+Ñ+Ø O¸5Èð ,ó 
ð 	
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ØˆÜ& u¨eÓ4ˆÙØ�L‰L˜Ô!Ø�L‰L˜ÔÜ(¬¨U°EÓ):Ó;ò 	;‰OˆA‰|��dØ�L‰L˜9 Q C r¨$¨¨tÐ4Ô5Ø×Ñ 3Ò&Ø—‘œ[¨¯©Ó3Õ4à—‘˜w t×'7Ñ'7Ð&8Ð9Õ:ð	;ð �y‰y˜ÓÐ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   € Ü�k 4§<¡<Ó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Ö9˜a”$�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Ö9˜a”$�q•'Ð9ˆÐ9Ü),¨T°6Ó):×;¡  A�A�3�b˜˜’Ð;ˆÑ;Ø�y‰y˜ÓÐùò :ùÛ;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=   € Ü Ø&Ð(9À4×CUÑCUô
‰ˆˆ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   € Ü Ø&Ð(9À4×CUÑCUô
‰ˆˆ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Ÿ   € ô #×,Ñ,¨U°EÓ:ˆØ×%Ñ%ØØ-Ü.¨u°eÓ<Ü˜BŸI™I¬u¯}©}ÀvÔNÜ Ø—‘¬
×(:Ñ(:ÀVôô !Ø—‘¬
×(:Ñ(:ÀVôô ˜rŸ|™|´X×5EÑ5EÐPVÔ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Þ   € Ü Ð!;ÀT×EWÑEWÔX‰ˆˆuØˆÜ& u¨eÓ4ˆÙØ�L‰L˜Ô!Ø�L‰L˜ÔÜ"×,Ñ,¨U°EÓ:ˆØ�‰à-Ø Ü˜Ÿ™¬E¯M©MÀGÔLØ%Ü˜Ÿ™´×1CÑ1CÈgÔVØ%Ü˜Ÿ™´×1CÑ1CÈgÔVØ$Ü˜Ÿ™¬x×/?Ñ/?È'ÔRð
ô	
ð �y‰y˜ÓÐr!   c                 ó   — y)NÚtorchcomms_fr_tracer8   r   s    r   rb   z-TorchCommsFlightRecorderHandler.dump_filenameB  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ý   aV  
{% extends "base.html" %}
{% block header %}
    <h1>{% block title %}TorchComms Health Check{% endblock %}</h1>
{% endblock %}
{% block content %}
    <h2>Health Status</h2>
    {% if fetch_summary %}<pre>{{ fetch_summary }}</pre>{% endif %}
    {% for i, (addr, resp) in enumerate(zip(addrs, resps)) %}
        <h3>Rank {{ i }}: {{ addr }}</h3>
        {% 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 %}
    {% if dump_triggered %}
        <h2>Flight Recorder Dump (triggered by unhealthy rank)</h2>
        {% for i, (addr, resp) in enumerate(zip(dump_addrs, dump_resps)) %}
            <h3>Rank {{ i }}: {{ addr }}</h3>
            {% if resp.status_code != 200 %}
                <p>Failed to dump: status={{ resp.status_code }}</p>
                <pre>{{ resp.text }}</pre>
            {% else %}
                <pre>{{ resp.text }}</pre>
            {% endif %}
        {% endfor %}
    {% endif %}
{% endblock %}
    c                  óR   — e Zd 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y	)ÚTorchCommsHealthCheckHandlerzBHealth check that detects watchdog timeouts and triggers FR dumps.c                ó0   — t        d| j                  «      gS )Nú/torchcomms_health_checkr   r   s    r   r    z#TorchCommsHealthCheckHandler.routesj  s   € ÜÐ0°$·,±,Ó?Ð@Ð@r!   c                ó   — t        dd«      gS )Nr  zTorchComms Healthr$   r   s    r   r%   z&TorchCommsHealthCheckHandler.nav_linksm  s   € ÜÐ2Ð4GÓHÐIÐIr!   c                ó   — dt         iS )Nútorchcomms_health_check.html)ÚHEALTH_CHECK_TEMPLATEr   s    r   r)   z&TorchCommsHealthCheckHandler.templatesp  s   € Ø.Ô0EÐFÐFr!   c                óÄ   — | D ]7  }|j                   dk(  sŒ	 |j                  «       }|j                  dd«      rŒ7 y y# t        $ r t        j	                  d«       Y Œ[w xY w)aÏ  Return True if any rank explicitly reports itself as unhealthy.

        Only responses with a 200 status code are inspected.  Non-200
        responses (connection errors, timeouts, etc.) are intentionally
        ignored so that a single unreachable rank does not trigger an
        expensive Flight Recorder dump across the entire job.  A dump is
        only triggered when a rank is reachable *and* positively reports
        ``{"healthy": false}``.
        rO   zGfailed to parse health check response as JSON; treating rank as healthyÚhealthyTF)rV   r–   rÀ   ÚloggerÚ	exceptionÚget)rF   r^   Údatas      r   Ú_any_unhealthyz+TorchCommsHealthCheckHandler._any_unhealthys  sr   € ð ò 	 ˆDØ×Ñ 3Ó&ðØŸ9™9›;�Dð —x‘x 	¨4Õ0Ùð	 ð øô !ò Ü×$Ñ$ð3ôñ ðús   —>¾AÁAc           	     óô   — t        d| j                  ¬«      \  }}d}g }g }| j                  |«      rt        d| j                  ¬«      \  }}d}|j                  j	                  dt        ||«      |||||¬«      S )NÚtorchcomms_health_checkr@   FÚtorchcomms_fr_dump_fileTr  )r¥   rE   rF   Údump_triggeredÚ
dump_addrsÚ
dump_resps)r   rH   r  r+   r,   r   )r   r-   rE   rF   r   r!  r"  s          r   r   z$TorchCommsHealthCheckHandler._handleŒ  s�   € Ü Ð!:ÀD×DVÑDVÔW‰ˆˆuØˆØ "ˆ
Ø%'ˆ
Ø×Ñ˜uÔ%Ü%.Ø)°4×3EÑ3Eô&Ñ"ˆJ˜
ð "ˆNØ�|‰|×+Ñ+Ø*Ü.¨u°eÓ<ØØØ)Ø!Ø!ð ,ó 
ð 	
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                  › �«       Œ[ | j                  |«      r­|j                  d«       |j                  d	«       t        d
| j                  ¬«      \  }}	t	        t        ||	«      «      D ]Y  \  }\  }}|j                  d|› d|› d�«       |j                  |j                  dk(  r|j                  nd|j                  › �«       Œ[ dj                  |«      S )Nr  r@   rK   rL   rM   rN   rO   rP   z3=== Unhealthy rank detected, triggering FR dump ===r  z	--- Rank z ---rQ   )
r   rH   r   rS   rT   rU   rV   rW   r  rX   )
r   rE   rF   rZ   r[   r\   r]   r^   r!  r"  s
             r   r_   z!TorchCommsHealthCheckHandler.dump   s{  € Ü Ð!:ÀD×DVÑDVÔW‰ˆˆuØˆÜ& u¨eÓ4ˆÙØ�L‰L˜Ô!Ø�L‰L˜ÔÜ(¬¨U°EÓ):Ó;ò 	‰OˆA‰|��dØ�L‰L˜9 Q C r¨$¨¨tÐ4Ô5Ø�L‰LØ!×-Ñ-°Ò4�—	’	¸GÀD×DTÑDTÐCUÐ:Võð	ð
 ×Ñ˜uÔ%Ø�L‰L˜ÔØ�L‰LÐNÔOÜ%.Ø)°4×3EÑ3Eô&Ñ"ˆJ˜
ô $-¬S°¸ZÓ-HÓ#Iò ‘�‘<�D˜$Ø—‘˜y¨¨¨2¨d¨V°4Ð8Ô9Ø—‘à×'Ñ'¨3Ò.ð —I’Ià" 4×#3Ñ#3Ð"4Ð5õðð �y‰y˜ÓÐr!   c                 ó   — y)Nr  r8   r   s    r   rb   z*TorchCommsHealthCheckHandler.dump_filename»  s   € Ø(r!   Nr.   r0   r1   )rF   rÈ   r/   Úboolr2   rc   rd   )r5   r6   r7   r  r    r%   r)   rÊ   r  r   r_   rb   r8   r!   r   r  r  g  s:   „ ÙLóAóJóGð òó ðó0
ó( ô6)r!   r  c            
     ó¨   — t        «       t        «       t        «       t        «       t	        «       t        «       t        «       t        «       t        «       g	S )N)	r   r:   rh   rz   rý   r  rÌ   rÛ   ræ   r8   r!   r   Údefault_handlersr'  ¿  s?   € ä‹Ü‹Ü‹ÜÓÜ'Ó)Ü$Ó&ÜÓÜÓÜÓð
ð 
r!   )r/   zlist[DebugHandler])/Ú
__future__r   ÚloggingÚ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   Ú	getLoggerr5   r  r(   rn   r‹   rÒ   rí   r   r:   rh   rz   rÌ   rÛ   ræ   rý   r  r  r'  r8   r!   r   ú<module>r1     s   ðÝ "ã Ý  å ÷÷ ñ õ ;Ý IÝ Q÷õ ñ ßTð 
ˆ×	Ñ	˜8Ó	$€ð€ðÐ ð4Ð ð$?Ð ðBÐ ô(:�<ô :ô�Lô ô>&�<ô &ôR[˜Lô [ô|V�lô Vô$˜,ô ô@�lô ô:M% lô M%ð`Ð ôBU) <ô U)ôpr!   