o
    ei3                     @   s  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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
< 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e" fddZ(de&e' dee" fddZ)d5de'de'de*e&e' ee" f fddZ+d e'fd!d"Z,d#Z-d$Z.d%Z/G d&d' d'Z0G d(d) d)eZ1G d*d+ d+eZ2G d,d- d-Z3d.e4d/e'dB d0e5d1e&e% d2e6e' ddfd3d4Z7dS )6    N)ABCabstractmethod)CallableIterable)ThreadPoolExecutor)	dataclass)BaseHTTPRequestHandlerThreadingHTTPServer)parse_qsurlparse)
DictLoaderEnvironment)get_world_sizetcpstore_clientloggerT)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 z: )r   RuntimeErrorr   self r   k/var/www/addictedbytheproject.nl/epg/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)   /   s   
 r)   c                   @   sn   e Zd Z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returnc                 C      d S r   r   r   r   r   r   routes6      zDebugHandler.routesc                 C   r/   r   r   r   r   r   r   	nav_links9   r1   zDebugHandler.nav_linksc                 C   s   i S r   r   r   r   r   r   	templates<   r1   zDebugHandler.templatesNc                 C   r/   r   r   r   r   r   r   dump?   r1   zDebugHandler.dumpc                 C   s   t | j S r   )typer    lowerr   r   r   r   dump_filenameB      zDebugHandler.dump_filename)r    r!   r"   r   listr)   r0   r&   r2   dictr%   r3   r4   r7   r   r   r   r   r-   5   s    r-   urlsr.   c                    s^   dd l  d}dtdtf fdd}t|d}||| }W d    |S 1 s(w   Y  |S )Nr      urlr.   c                    s     | }t|j|jS r   )postr   r   r   )r=   resprequestsr   r   getQ      
zfetch_thread_pool.<locals>.get)max_workers)rA   r%   r   r   map)r;   rD   rB   executorrespsr   r@   r   fetch_thread_poolK   s   
rH   c                    sN   dd l  d jdtdtfdddtt dtt f fdd	}t|| S )
Nr   sessionr=   r.   c              	      s^   |  |4 I d H }| I d H }t|j|W  d   I d H  S 1 I d H s(w   Y  d S r   )r>   r   r   status)rI   r=   r?   r   r   r   r   fetch`   s
   
0zfetch_aiohttp.<locals>.fetchr;   c              	      sb     4 I d H  tj fdd| D  I d H W  d   I d H  S 1 I d H s*w   Y  d S )Nc                    s   g | ]} |qS r   r   ).0r=   )rK   rI   r   r   
<listcomp>g       z1fetch_aiohttp.<locals>.gather.<locals>.<listcomp>)ClientSessionasynciogather)r;   aiohttprK   )rI   r   rQ   e   s   0zfetch_aiohttp.<locals>.gather)rS   rO   r%   r   r9   r   rP   run)r;   rQ   r   rR   r   fetch_aiohttp[   s    rU    endpointargsc                    sl   t  }dd tt D }||} fdd|D }z	t|}W ||fS  ty5   t|}Y ||fS w )Nc                 S   s   g | ]}d | qS )rankr   )rL   rr   r   r   rM   n   rN   zfetch_all.<locals>.<listcomp>c                    s$   g | ]}|   d  d  qS )z	/handler/?)decode)rL   addrrX   rW   r   r   rM   p   s   $ )r   ranger   	multi_getrU   ImportErrorrH   )rW   rX   storekeysaddrsrG   r   r^   r   	fetch_alll   s   


re   blobc                 C   s   t | }t j|ddS )N   )indent)r   r   dumps)rf   parsedr   r   r   format_jsonz   rC   rk   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 )PeriodicDumper      N@handlers
output_dirinterval_secondsr.   Nc                 C   s&   || _ || _|| _t | _d | _d S r   )	_handlers_output_dir_interval_seconds	threadingEvent_stop_event_thread)r   rn   ro   rp   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makedirsrr   rt   Thread_runrw   startr   r   r   r   r      s   zPeriodicDumper.startc                 C   s&   | j   | jd ur| j  d S d S r   )rv   setrw   joinr   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)rv   is_setrq   r4   	Exceptionr   	exceptionr7   timestrftimer}   r'   r   rr   openwritewaitrs   )r   r+   content	timestampfilenamer'   fr   r   r   r   	  s.   


zPeriodicDumper._run)rm   r.   N)r    r!   r"   r9   r-   r%   floatrx   r   r   r   r   r   r   r   rl      s    


	rl   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   #  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   formatrX   r   r   r   log_message+  s
   zHTTPRequestHandler.log_messagec                 C   s   | j |  d S r   )r   _handle_requestr   r   r   r   do_GET2  s   zHTTPRequestHandler.do_GETr.   c                 C   s   t | jjS r   )r   r'   r   r   r   r   get_path5  r   zHTTPRequestHandler.get_pathc                 C   s   t |  S r   )r
   get_raw_queryr   r   r   r   	get_query8  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|   defaultr5   c                 C   s$   |   }||vr
|S ||| d S )Nr   )r   )r   r|   r   r5   r   r   r   r   get_query_arg>  s   z HTTPRequestHandler.get_query_arg)r    r!   r"   r$   r   r   r%   r   r:   r9   r   r   objectr5   r   r   r   r   r   r*   (  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portrn   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_handlers
c                 s   s4    | ]}|  D ]}d |j d|j dV  qqdS )z    <a href="z">z</a> <!--@lint-ignore-->N)r2   r'   r(   )rL   r+   linkr   r   r   	<genexpr>S  s    z*FrontendServer.__init__.<locals>.<genexpr>)z	base.htmlzraw_resp.htmlzjson_resp.htmlT)loaderenable_async)ziprk   	enumerater2   r*   r   rV   r   z distributed.debug.FrontendServer)rz   rX   r{   r|   )'torch.distributed.debug._debug_handlersr   r   BASE_TEMPLATERAW_RESP_TEMPLATEJSON_RESP_TEMPLATEupdater3   r   r   
_jinja_envglobalsr   rk   r   _routesr0   r+   r'   rq   r5   r*   r   _serverrt   r   _serverw   r   )r   r   rn   r   nav_htmlall_templatesr+   r   routeRequestHandlerClassserver_addressr   r   r   rx   H  sP   
zFrontendServer.__init__r.   c                 C   s0   z| j   W d S  ty   td Y d S w )Nz got exception in frontend server)r   serve_foreverr   r   r   r   r   r   r   r     s
   zFrontendServer._servec                 C   s   | j   d S r   )rw   r   r   r   r   r   r     r8   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_errorr   
SystemExitr   r   reprsend_responsesend_headerend_headerswfiler   )r   r   r'   r+   r?   er   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#   r9   r-   rx   r   r   r*   r   r%   r   r,   r   r   r   r   r   r   G  s    


=
r   r   dump_dirdump_intervalrn   enabled_dumpsc                    s   t tj t| |d}t d|jj d }|d ur2t fdd|D ||}|	  t d|| z|
  W |d urB|  d S d S |d urM|  w w )N)r   rn   z"Frontend server started on port %dc                    s   g | ]
}|   v r|qS r   )r7   )rL   r+   r   r   r   rM     s
    zmain.<locals>.<listcomp>z2Periodic dumper started, writing to %s every %.0fs)r   setLevelloggingINFOr   r   r   server_portrl   r   r   r   )r   r   r   rn   r   serverdumperr   r   r   main  s2   
	

r   )rV   )8rP   r   r   r}   r   rt   r   abcr   r   collections.abcr   r   concurrent.futuresr   dataclassesr   http.serverr   r	   urllib.parser
   r   jinja2r   r   torch.distributed.debug._storer   r   	getLoggerr    r   Loggerr$   r   r&   r)   r-   r9   r%   rH   rU   tuplere   rk   r   r   r   rl   r   r*   r   r#   r   r   r   r   r   r   r   <module>   s^   
 (
@5b