o
    j9:j 9                     @   sB  U d dl Z d dlZd dlZd dlZd dlZd dlZd dl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mZmZ d dlmZmZ d d	lmZmZ eeZeje d
< dZ!e"e d< eddG dd dZ#eddG dd dZ$eddG dd dZ%G dd deZ&de'e( de"de'e# fddZ)de'e( de"de'e# fddZ*	d=de(d e(de"de+e'e( e'e# f fd!d"Z,d#e(fd$d%Z-d&e'e( d'e'e# de(dB fd(d)Z.d*Z/d+Z0d,Z1G d-d. d.Z2G d/d0 d0eZ3G d1d2 d2eZ4G d3d4 d4Z5	d>d5e6d6e(dB d7e"d8e'e& d9e7e( d:e"ddfd;d<Z8dS )?    N)ABCabstractmethod)Callable)ThreadPoolExecutor)	dataclass)BaseHTTPRequestHandlerThreadingHTTPServer)parse_qsurlparse)
DictLoaderEnvironment)get_world_sizetcpstore_clientlogger      N@_DEFAULT_FETCH_TIMEOUTT)slotsc                   @   s.   e Zd ZU eed< eed< dd Zdd ZdS )Responsestatus_codetextc                 C   s&   | j dkrtd| j  d| j d S )N   zHTTP : )r   RuntimeErrorr   self r   h/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/torch/distributed/debug/_frontend.pyraise_for_status#   s   
zResponse.raise_for_statusc                 C   s   t | jS N)jsonloadsr   r   r   r   r   r   '      zResponse.jsonN)__name__
__module____qualname__int__annotations__strr   r   r   r   r   r   r      s
   
 r   c                   @   s   e Zd ZU eed< eed< dS )NavLinkpathlabelN)r"   r#   r$   r'   r&   r   r   r   r   r(   +   s   
 r(   c                   @   s(   e Zd ZU eed< edgef ed< dS )Router)   HTTPRequestHandlerhandlerN)r"   r#   r$   r'   r&   r   bytesr   r   r   r   r+   1   s   
 r+   c                   @   s|   e Zd ZU eZeed< edee	 fddZ
edee fddZdeeef fddZded	B fd
dZdefddZd	S )DebugHandlerfetch_timeoutreturnc                 C      d S r   r   r   r   r   r   routes:      zDebugHandler.routesc                 C   r2   r   r   r   r   r   r   	nav_links=   r4   zDebugHandler.nav_linksc                 C   s   i S r   r   r   r   r   r   	templates@   r4   zDebugHandler.templatesNc                 C   r2   r   r   r   r   r   r   dumpC   r4   zDebugHandler.dumpc                 C   s   t | j S r   )typer"   lowerr   r   r   r   dump_filenameF      zDebugHandler.dump_filename)r"   r#   r$   r   r0   floatr&   r   listr+   r3   r(   r5   dictr'   r6   r7   r:   r   r   r   r   r/   7   s   
 r/   urlstimeoutr1   c                    sd   dd l  d}dtdtf fdd}t|d}t||| }W d    |S 1 s+w   Y  |S )Nr      urlr1   c              
      s   z j | d}t|j|jW S   jjy+ } ztdd| W  Y d }~S d }~w  jjyF } ztdd| W  Y d }~S d }~w tyd } ztdt|j	 d| W  Y d }~S d }~ww )Nr@     z	Timeout:   zConnectionError:   r   )
postr   r   r   
exceptionsTimeoutConnectionError	Exceptionr8   r"   )rB   resperequestsr@   r   r   getU   s   &zfetch_thread_pool.<locals>.get)max_workers)rO   r'   r   r   r=   map)r?   r@   rQ   rP   executorrespsr   rN   r   fetch_thread_poolO   s   
rU   c                    sT   dd l  d jdtdtf fdddtt dtt f fdd	}t|| S )
Nr   sessionrB   r1   c              
      s  z0|  |4 I d H }| I d H }t|j|W  d   I d H  W S 1 I d H s*w   Y  W d S  tjyL } ztdd| W  Y d }~S d }~w  jyk } ztdt|j d| W  Y d }~S d }~w t	y } ztdt|j d| W  Y d }~S d }~ww )NrD   zTimeoutError: rE   r   rF   )
rG   r   r   statusasyncioTimeoutErrorClientErrorr8   r"   rK   )rV   rB   rL   r   rM   )aiohttpr   r   fetchk   s    
4&&zfetch_aiohttp.<locals>.fetchr?   c              	      sv   j d}j|d4 I d H  ttj fdd| D  I d H W  d   I d H  S 1 I d H s4w   Y  d S )N)totalrC   c                    s   g | ]} |qS r   r   ).0rB   )r\   rV   r   r   
<listcomp>z       z1fetch_aiohttp.<locals>.gather.<locals>.<listcomp>)ClientTimeoutClientSessionr=   rX   gather)r?   client_timeoutr[   r\   r@   )rV   r   rc   w   s
   "0zfetch_aiohttp.<locals>.gather)r[   rb   r'   r   r=   rX   run)r?   r@   rc   r   re   r   fetch_aiohttpf   s   "rg    endpointargsc                   st   t  }dd tt D }||} fdd|D }zt||d}W ||fS  ty9   t||d}Y ||fS w )Nc                 S   s   g | ]}d | qS )rankr   )r^   rr   r   r   r_      r`   zfetch_all.<locals>.<listcomp>c                    s$   g | ]}|   d  d  qS )z	/handler/?)decode)r^   addrrj   ri   r   r   r_      s   $ rC   )r   ranger   	multi_getrg   ImportErrorrU   )ri   rj   r@   storekeysaddrsrT   r   rp   r   	fetch_all   s   
rw   blobc                 C   s   t | }t j|ddS )N   )indent)r   r    dumps)rx   parsedr   r   r   format_json   s   
r}   rv   rT   c                 C   sr   dd t |D }|sdS t| }|t| }d| d| dg}|D ]\}}|d| d|j  q#d	|S )
zHReturn a summary string if any workers failed, or None if all succeeded.c                 S   s"   g | ]\}}|j d kr||fqS )r   )r   )r^   irl   r   r   r   r_      s   " z(format_fetch_summary.<locals>.<listcomp>NzPARTIAL DATA: /z workers respondedz  Rank r   
)	enumeratelenappendr   join)rv   rT   failedr]   oklinesrk   rL   r   r   r   format_fetch_summary   s   
r   ac  
<!doctype html>
<head>
    <title>{% block title %}{% endblock %} - PyTorch Distributed</title>
    <link rel="shortcut icon" type="image/x-icon" href="https://pytorch.org/favicon.ico?">

    <style>
        body {
            margin: 0;
            font-family:
                -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,
                "Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji",
                "Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";
            font-size: 1rem;
            font-weight: 400;
            line-height: 1.5;
            color: #212529;
            text-align: left;
            background-color: #fff;
        }
        h1, h2, h2, h4, h5, h6, .h1, .h2, .h2, .h4, .h5, .h6 {
            margin-bottom: .5rem;
            font-weight: 500;
            line-height: 1.2;
        }
        nav {
            background-color: rgba(0, 0, 0, 0.17);
            padding: 10px;
            display: flex;
            align-items: center;
            padding: 16px;
            justify-content: flex-start;
        }
        nav h1 {
            display: inline-block;
            margin: 0;
        }
        nav a {
           margin: 0 8px;
        }
        section {
            max-width: 1280px;
            padding: 16px;
            margin: 0 auto;
        }
        pre {
            white-space: pre-wrap;
            max-width: 100%;
        }
    </style>
</head>

<nav>
    <h1>Torch Distributed Debug Server</h1>

    {{ nav_links | safe }}
</nav>

<section class="content">
  {% block header %}{% endblock %}
  {% block content %}{% endblock %}
</section>
    a  
{% extends "base.html" %}
{% block header %}
    <h1>{% block title %}{{title}}{% endblock %}</h1>
{% endblock %}
{% block content %}
    {% 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 %}
    {% 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>{{ format_json(resp.text) }}</pre>
        {% endif %}
    {% endfor %}
{% endblock %}
    c                	   @   sL   e Zd Z	ddee dededdfddZdd	d
ZdddZ	dddZ
dS )PeriodicDumperr   handlers
output_dirinterval_secondsr1   Nc                 C   s&   || _ || _|| _t | _d | _d S r   )	_handlers_output_dir_interval_seconds	threadingEvent_stop_event_thread)r   r   r   r   r   r   r   __init__  s
   

zPeriodicDumper.__init__c                 C   s2   t j| jdd tj| jddd| _| j  d S )NT)exist_okz distributed.debug.PeriodicDumper)targetdaemonname)osmakedirsr   r   Thread_runr   startr   r   r   r   r     s   zPeriodicDumper.startc                 C   s&   | j   | jd ur| j  d S d S r   )r   setr   r   r   r   r   r   stop&  s   

zPeriodicDumper.stopc              	   C   s   | j  sx| jD ]a}z| }W n ty!   td|  Y qw |d u r'qt	d}|  d| d}t
j| j|}zt|d}|| W d    n1 sTw   Y  W q tyi   td| Y qw | j | j | j  rd S d S )NzFailed to dump %sz%Y%m%d_%H%M%S_z.txtwzFailed to write dump to %s)r   is_setr   r7   rK   r   	exceptionr:   timestrftimer   r)   r   r   openwritewaitr   )r   r-   content	timestampfilenamer)   fr   r   r   r   +  s.   


zPeriodicDumper._runr   r1   N)r"   r#   r$   r=   r/   r'   r<   r   r   r   r   r   r   r   r   r     s    


	r   c                   @   s*   e Zd ZU ejZejed< dZe	ed< dS )_IPv6HTTPServeraddress_familyi   request_queue_sizeN)
r"   r#   r$   socketAF_INET6r   AddressFamilyr&   r   r%   r   r   r   r   r   E  s   
 r   c                	   @   s|   e Zd ZU ded< dd Zdd Zdefdd	Zdeee	e f fd
dZ
defddZdefdedededefddZdS )r,   FrontendServerfrontendc                 G   s   t d| jd ||  d S )Nz%s %sr   )r   infoclient_address)r   formatrj   r   r   r   log_messageM  s
   zHTTPRequestHandler.log_messagec                 C   s   | j |  d S r   )r   _handle_requestr   r   r   r   do_GETT  s   zHTTPRequestHandler.do_GETr1   c                 C   s   t | jjS r   )r
   r)   r   r   r   r   get_pathW  r!   zHTTPRequestHandler.get_pathc                 C   s   t |  S r   )r	   get_raw_queryr   r   r   r   	get_queryZ  r!   zHTTPRequestHandler.get_queryc                 C   s   t | jjS r   )r
   r)   queryr   r   r   r   r   ]  r!   z HTTPRequestHandler.get_raw_queryNr   defaultr8   c                 C   s$   |   }||vr
|S ||| d S )Nr   )r   )r   r   r   r8   r   r   r   r   get_query_arg`  s   z HTTPRequestHandler.get_query_arg)r"   r#   r$   r&   r   r   r'   r   r>   r=   r   r   objectr8   r   r   r   r   r   r,   J  s"   
 r,   c                   @   sf   e Zd Z	ddedee dB fddZdddZdd	d
Zde	ddfddZ
dededefddZdS )r   Nportr   c                 C   s   |d u rddl m} | }ddd |D }tttd}|D ]	}||  qt|}t	|dd| _
| j
jjttt|d	 i | _|D ]}| D ]	}|j| j|j< qJqD|| _td
tfd| i}	d|f}
t|
|	| _tj| jdddd| _| j  d S )Nr   )default_handlersr   c                 s   s4    | ]}|  D ]}d |j d|j dV  qqdS )z    <a href="z">z</a> <!--@lint-ignore-->N)r5   r)   r*   )r^   r-   linkr   r   r   	<genexpr>u  s    z*FrontendServer.__init__.<locals>.<genexpr>)z	base.htmlzraw_resp.htmlzjson_resp.htmlT)loaderenable_async)zipr}   r   r5   r,   r   rh   r   z distributed.debug.FrontendServer)r   rj   r   r   )'torch.distributed.debug._debug_handlersr   r   BASE_TEMPLATERAW_RESP_TEMPLATEJSON_RESP_TEMPLATEupdater6   r   r   
_jinja_envglobalsr   r}   r   _routesr3   r-   r)   r   r8   r,   r   _serverr   r   _server   r   )r   r   r   r   nav_htmlall_templatesr-   r   routeRequestHandlerClassserver_addressr   r   r   r   j  sP   
zFrontendServer.__init__r1   c                 C   s0   z| j   W d S  ty   td Y d S w )Nz got exception in frontend server)r   serve_foreverrK   r   r   r   r   r   r   r     s
   zFrontendServer._servec                 C   s   | j   d S r   )r   r   r   r   r   r   r     r;   zFrontendServer.joinreqc              
   C   s   |  }|| jvr|dd|  d S | j| }z||}W n& ttfyE } ztd| |ddt|  W Y d }~d S d }~ww |d |	dd |
  |j| d S )	Ni  zHandler not found: z-Exception in frontend server when handling %si  zException: r   zContent-typez	text/html)r   r   
send_errorrK   
SystemExitr   r   reprsend_responsesend_headerend_headerswfiler   )r   r   r)   r-   rL   rM   r   r   r   r     s(   


zFrontendServer._handle_requesttemplatekwargsc                 K   s   | j |jdi | S )Nr   )r   get_templaterenderencode)r   r   r   r   r   r   render_template  s   zFrontendServer.render_templater   r   )r"   r#   r$   r%   r=   r/   r   r   r   r,   r   r'   r   r.   r   r   r   r   r   r   i  s    


=
r   r   dump_dirdump_intervalr   enabled_dumpsr0   c           	         s   |D ]}||_ qttj t| |d}td|jj d }|d ur:t	 fdd|D ||}|
  td|| z|  W |d urJ|  d S d S |d urU|  w w )N)r   r   z"Frontend server started on port %dc                    s   g | ]
}|   v r|qS r   )r:   )r^   r-   r   r   r   r_     s
    zmain.<locals>.<listcomp>z2Periodic dumper started, writing to %s every %.0fs)r0   r   setLevelloggingINFOr   r   r   server_portr   r   r   r   )	r   r   r   r   r   r0   r-   serverdumperr   r   r   main  s6   
	

r   )rh   r   )9rX   r   r   r   r   r   r   abcr   r   collections.abcr   concurrent.futuresr   dataclassesr   http.serverr   r   urllib.parser	   r
   jinja2r   r   torch.distributed.debug._storer   r   	getLoggerr"   r   Loggerr&   r   r<   r   r(   r+   r/   r=   r'   rU   rg   tuplerw   r}   r   r   r   r   r   r   r,   r   r%   r   r   r   r   r   r   <module>   sz   
 
"@5h