
    ajB                     @   d dl Z d dlZd dlmZmZ d dlZd dlZd dlZd dlm	Z	 d dl
Z
d dlmZmZ d dlZd dlZ ej        e          Zd Zd Z e            Zd Zeee ed          eefZdZd	 Z G d
 de          Z ddddZ!d Z"d Z#d Z$d Z%dZ&dZ'd Z(d Z)d Z*dS )    N)Any
NamedTuple)NamedTemporaryFile)_frames_fmt_block_extrac                      ddfd}t          j        |           d fdt          j                                       dfd}|S )NTreturnc                      d d S )NF )enableds   \/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/utils/viz/_cycles.pydisablez observe_garbage.<locals>.disable   s         c                     sd S | dk    r t          j        t           j                   d S | dk    r5t          j                    dgfd}t          j        |           d S d S )NstartstopFc                  ,   d         sdd<   nt          j                   d	 d         dk    rt          j                      t          j                   t          j                                         t          j        d           t          j        	                                }t          j                     t          j        	                                }||k    rt                              d||z
             dn# dw xY w | i |S d S )Nr   TF
generation   z.CUDA Memory changed during GC, %d bytes freed.)sys
setprofilegccollectgarbageclear	set_debugtorchcudamemory_allocatedloggerwarning)	argskwargsbeforeafterr   infoobserver
orig_traceself_returns	       r   
do_collectz8observe_garbage.<locals>.gc_callback.<locals>.do_collect#   s   "1~ '%)KNNN:...#G'  -22JLLL ,,,
((*** Q!&!<!<!>!>
 %
 ; ; = =!U??"NN+[]cfk]klll"&$)%:t6v666 *)s   CD D)r   r   DEBUG_SAVEALLr   
getprofiler   )phaser&   r*   r(   r)   r   r'   s    ` @@r   gc_callbackz$observe_garbage.<locals>.gc_callback   s     	FGL)*****f__))J 'K7 7 7 7 7 7 7 7 7: N:&&&&&C _r   c                  F    t           j                                        d S N)r   	callbacksremove)r.   s   r   r2   zobserve_garbage.<locals>.removeE   s    
K(((((r   r	   N)atexitregisterr   r1   append)r'   r   r2   r   r.   s   `  @@r   observe_garbager7      s    G     
 OG'' '' '' '' '' '' ''R L$$$) ) ) ) ) )Mr   c                  N    dd} t           |             j        d                   S )Nc                       fdS )Nc                       S r0   r   xs   r   <lambda>z+_get_cell_type.<locals>.f.<locals>.<lambda>Z   s    q r   r   r;   s   `r   fz_get_cell_type.<locals>.fY   s    yyyr   r   r0   )type__closure__)r>   s    r   _get_cell_typerA   X   s1       "###r   c                 "    i dfdd fddfd}dfd}d fd}d fd}d fd	}dfd
}d fd}d fd}dfd}	t           |t          |t          |t          |t          |t
          j        |t
          j        |t          |t
          j	        |t          j        |t
          j        |	i}
t                     j        D ]}||
v r |
|                       dd           t           t                    r d           S )a%  
    Return known information about references held by the given object.

    Returns a mapping from referents to lists of descriptions.  Note that there
    may be more than one edge leading to any particular referent; hence the
    need for a list.  Descriptions are currently strings.

    r	   Nc                 t                         t          |          g                               |            d S r0   )
setdefaultidr6   )nameobj
referencess     r   add_referencez+annotated_references.<locals>.add_referencej   s3    bggr**11$77777r   c                  f    | D ],}t          |          r |t          |                     -d S r0   )hasattrgetattr)attrsattrrI   rG   s     r   	add_attrsz'annotated_references.<locals>.add_attrsm   sK     	8 	8DsD!! 8dGC$6$6777	8 	8r   c                  B    	   d           d S # t           $ r Y d S w xY w)Ncell_contents)
ValueErrorrO   s   r   add_cell_referencesz1annotated_references.<locals>.add_cell_referencesr   sB    	Io&&&&& 	 	 	
 DD	s    
c                  .      ddddddddd		  	         d S )
N__defaults__r@   __globals____code____name__
__module____doc____qualname____annotations____kwdefaults__r   rS   s   r   add_function_referencesz5annotated_references.<locals>.add_function_references|   s=    	.!#"		$ 		$ 		$ 		$ 		$r   c                  R    t                    D ]\  } } d|  d|           d S )N[])	enumerate)positionitemrI   rG   s     r   add_sequence_referencesz5annotated_references.<locals>.add_sequence_references   sC    'nn 	1 	1NHdM/h///40000	1 	1r   c                                                       D ].\  } } d|             dt          |            d|           /d S )Nkeyr`   ra   )itemsrepr)rg   valuerI   rG   s     r   add_dict_referencesz1annotated_references.<locals>.add_dict_references   sa    ))++ 	3 	3JCM%%%%M*d3ii***E2222	3 	3r   c                  *    D ]}  d|            d S )Nelementr   )eltrI   rG   s    r   add_set_referencesz0annotated_references.<locals>.add_set_references   s1     	* 	*CM)S))))	* 	*r   c                  "      ddd           d S )N__self____func__im_classr   rS   s   r   add_bound_method_referencesz9annotated_references.<locals>.add_bound_method_references   s    	*j*55555r   c                      t                    t          j        u r=t          j                  } t          |           dk    r| d         } d|           d S d S d S )N   r   __callback__)r?   weakrefrefr   get_referentslen)	referentstargetrI   rG   s     r   add_weakref_referencesz4annotated_references.<locals>.add_weakref_references   sh     99##(--I9~~"""1nf55555	 $#""r   c                      j         }  dddddd           t          |           t          u r.j                                         D ]\  }} d| |           d S d S )Nf_backf_code
f_builtins	f_globalsf_tracef_localszlocal )r   r?   dictrh   )r   rF   localrO   rI   rG   s      r   add_frame_referencesz2annotated_references.<locals>.add_frame_references   s    <	(HlKJWWW >>T!!"|1133 6 6eotoou5555 "!6 6r   c                  "      ddd           d S )N__objclass__rY   __doc__r   rS   s   r    add_getset_descriptor_referencesz>annotated_references.<locals>.add_getset_descriptor_references   s    	.*i88888r   __dict__	__class____mro__r3   )tuplelistr   set	frozensettypesFunctionType	FrameTypeCellType
MethodTyperx   ry   GetSetDescriptorTyper?   r   
isinstance)rG   rT   r^   re   rk   ro   rt   r~   r   r   type_based_referencestype_rO   rI   rH   s   `           @@@r   annotated_referencesr   _   sH    (*J8 8 8 8 8 88 8 8 8 8 8 8
     
$ 
$ 
$ 
$ 
$ 
$1 1 1 1 1 1 13 3 3 3 3 3 3
* * * * * * *6 6 6 6 6 66 6 6 6 6 6 66 6 6 6 6 6 6 69 9 9 9 9 9 	&%!%3-%5+"$D c" + +)))(!%(***Ij+&&&#t 	)r       c                    d }t          | t                    rt          |           S t          |           j        dk    r
d| j         S t          | t
          j                  r%	 | j        j        }n# t          $ r d}Y nw xY wd| S t          | t                    rd ||            dS t          | t                    rd ||            d	S t          | t                    rd
t          |            dS t          | t
          j                  r
d| j         S t          | t                    r
d| j         S t          | t          j                  r! |             }|dS dt#          |          dS t          | t
          j                  rG| j        j        }t          |          t*          k    rd|t*          dz
   d         z   }d| d| j         S t/          |           r5dt          |           j         dt          |           j         d| j         d	S dt          |           j         dt          |           j         S )zx
    Return a string to be used for Graphviz nodes.

    The string should be short but as informative as possible.
    c                     d                     d | d d         D                       }t          |           dk    r| dt          |           dz
   }|S )N,c              3      K   | ]<}t          |t                    rt          |          nt          |          j        V  =d S r0   )r   
BASE_TYPESri   r?   rY   ).0r<   s     r   	<genexpr>z=object_annotation.<locals>.format_sequence.<locals>.<genexpr>   sE      ddWX:a#<#<RQ$q''BRddddddr      z, ...)joinr{   )rG   bodys     r   format_sequencez*object_annotation.<locals>.format_sequence   s`    xxdd\_`bab`b\cddddds88a<<//SA//Dr   functionz	function
z<anonymous>zinstancemethod
r`   ra   ()zdict[zmodule
ztype
Nzweakref (dead referent)zweakref to id 0xr<   z...   zframe
:zobject
.z ()r   r   ri   r?   rY   r   r   rr   __qualname__AttributeErrorr   r   r   r{   
ModuleTyperx   ry   rE   r   r   co_filenameFRAME_FILENAME_LIMITf_linenois_cuda_tensorrZ   shape)rG   r   	func_namereferentfilenames        r   object_annotationr      s      #z"" CyyCyyZ''*CL***	C)	*	* F	&1II 	& 	& 	&%III	&-)---	C		 F*??3''****	C		 F*??3''****	C		 F"s3xx""""	C)	*	* F(#,(((	C		 F&&&&	C	%	% F355,,6bll6666	C	)	) F:)x==///x*>*B(C(D(DEEH222CL222			 FS$s)).SSc1CSSsySSSSE$s)).EEc1CEEEs   %A2 2B Bc                   Z    e Zd ZU eed<   edz  ed<   eed<   eeeef                  ed<   dS )NodelabelNcontextroot
referrents)	rY   rZ   r   strr\   boolr   r   intr   r   r   r   r     sM         JJJ4Z
JJJU38_%%%%%%r   r   )r   filterc                   t                      t          d | D             } fd| D             }d | D             }d t          |           D             }| D ]}|t          |                   }||         }t	          |          }	t          j        |          D ]|}
t          |
          }|                    |          }|)|	                    |dg          }||                             |           |D ]}|j	                            ||f           }d t          |          D             }t                      }|rM|                                }||v r|                    |           ||         }|                    |           |Mi g }t          |          D ]0\  }}||v r't                    |<   |                    |           1|D ]}fd|j	        D             |j	        d d <    |S )Nc                 F    g | ]}t          |t          j                  |S r   )r   rx   
ProxyTypesr   rG   s     r   
<listcomp>z create_graph.<locals>.<listcomp>  s*    QQQsZW=O-P-PQsQQQr   c           	      r    g | ]3}t          t          |           |           |          g           4S r   )r   r   )r   rG   r   r   s     r   r   z create_graph.<locals>.<listcomp>  s@    \\\ST#C((''#,,sRHH\\\r   c                     g | ]}g S r   r   r   s     r   r   z create_graph.<locals>.<listcomp>  s    &=&=&=cr&=&=&=r   c                 4    i | ]\  }}t          |          |S r   )rE   )r   irG   s      r   
<dictcomp>z create_graph.<locals>.<dictcomp>  s$    >>>C"S''1>>>r   ?c                 &    g | ]\  }}|j         |S r   )r   )r   r   ns      r   r   z create_graph.<locals>.<listcomp>"  s#    :::tq!16::::r   c                 2    g | ]\  }}|v 	||         fS r   r   )r   r   idxid_to_filtered_ids      r   r   z create_graph.<locals>.<listcomp>2  s>     8 8 8+s!%666 "#4S#9:666r   )cuda_allocation_contextr   rb   rE   r   r   rz   getr6   r   r   popaddextendr{   )objectsr   r   nodesnode_referrers
id_to_noderG   fidxr>   rH   	referrentridtidxlabelsr   	to_searchto_keepr   	referrersfilteredr   r   r   s    ``                   @r   create_graphr   	  sy   )++~QQgQQQG\\\\\T[\\\E&=&=W&=&=&=N>>9W+=+=>>>J 3 3"S''"$K)#..
)#.. 	3 	3IY--C>>#&&D|^^C#//F4 ''--- 3 3##UDM22223	3 ;:y//:::IeeG
 $mmoo'>>C"3'	###  $ )+H%    1<<#&'8#9#9a OOA 8 88 8 8 8/0|8 8 8QQQ Or   c                 *    t          j        |           S r0   )jsondumps)r   s    r   escaper   7  s    :a==r   c                     t          | t          j                  o/| j        j        dk    ot          | t          j        j                   S )Nr   )r   r   Tensordevicer?   _subclasses
FakeTensor)rG   s    r   r   r   ;  sB    3%% 	:
6!	:sE-8999r   c                      t           j        j                                        } i | d         D ]C}|d         }|d         D ]0}|d         dk    rt	          |          \  }}||<   ||d         z  }1Dfd}|S )Nsegmentsaddressblocksstateactive_allocatedsizec                     t          |           ra|                                                                 }                    |          }|$d                    t          |d                    S d S )N
T)full_filename)r   untyped_storagedata_ptrr   r   r   )rG   addrframesaddr_to_frames      r   object_contextz/cuda_allocation_context.<locals>.object_contextM  sn    # 	J&&((1133D"&&t,,F!yyV4!H!H!HIIItr   )r   r   memory	_snapshotr   )snapshotsegr   blkr   
_real_sizer  r   s          @r   r   r   B  s    z **,,HM
#    9~x= 	  	 C7|111%1#%6%6"
&,d#CKDD		      r   c                    g d}t          |           D ]>\  }}|                    | dt          |j                   d|j        rdnd d           ?t          |           D ]=\  }}|j        D ]0\  }}|                    | d| dt          |           d	           1>|                    d
           d                    |          S )N)zdigraph GraphName {znode [shape=rect];zrankdir=LR;z [label=z, color=redblackz];z -> z
 [label = ra   z}
r   )rb   r6   r   r   r   r   r   )r   linesr   r   r>   r   js          r   to_dotr  V  s    HHHE%   ^ ^1\\6!'??\\QV<XEEQX\\\]]]]%   B B1 	B 	BHE1LLA@@1@@u@@@AAAA	B	LL99Ur   a  
<!DOCTYPE html>
<html>
<head>
  <style>
    body {
      margin: 0;
      padding: 0;
      overflow: hidden;
    }

    #container {
      display: flex;
      flex-direction: column;
      height: 100vh;
    }

    #main {
      flex: 2;
      height: 60vh;
      overflow: clip;
    }

    #preContainer {
      flex: 1;
      height: 40vh;
      overflow: auto;
    }

    pre {
      margin: 0;
      padding: 10px;
    }
  </style>
</head>
<body>
  <div id="container">
    <div id="main">
    </div>
    <div id="preContainer">
      <pre id="stacktrace">Mouse over tensor objects to see where they were allocated.</pre>
    </div>
  </div>
<script src='https://cdnjs.cloudflare.com/ajax/libs/viz.js/1.8.0/viz-lite.js'></script>
<script>
let dot = $DOT
let image = Viz(dot, {format: 'svg', 'totalMemory': 1024*1024*1024});
let main = document.getElementById('main')
main.innerHTML = image
let svg = main.firstElementChild
// Panning and zooming logic
let isPanning = false;
let startX, startY;
let viewBox = { x: 0, y: 0, width: parseFloat(svg.getAttribute('width')), height: parseFloat(svg.getAttribute('height')) };
svg.removeAttribute('width');
svg.removeAttribute('height');
function updateViewBox() {
    svg.setAttribute('viewBox', `${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}`);
}
updateViewBox()
svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');
svg.addEventListener('mousedown', function(e) {
    isPanning = true;
    startX = e.clientX;
    startY = e.clientY;
});
svg.addEventListener('mousemove', function(e) {
    if (!isPanning) return;
    const dx = (e.clientX - startX) * (viewBox.width / svg.clientWidth);
    const dy = (e.clientY - startY) * (viewBox.height / svg.clientHeight);
    viewBox.x -= dx;
    viewBox.y -= dy;
    startX = e.clientX;
    startY = e.clientY;
    updateViewBox();
});
svg.addEventListener('mouseup', function() {
    isPanning = false;
});
svg.addEventListener('mouseleave', function() {
    isPanning = false;
});
svg.addEventListener('wheel', function(e) {
    e.preventDefault();
    const zoomFactor = 0.1;
    const zoomAmount = e.deltaY > 0 ? 1 + zoomFactor : 1 - zoomFactor;
    // Calculate mouse position relative to the SVG
    const rect = svg.getBoundingClientRect();
    const mouseX = e.clientX - rect.left;
    const mouseY = e.clientY - rect.top;
    const mouseXRel = mouseX / svg.clientWidth;
    const mouseYRel = mouseY / svg.clientHeight;
    // Adjust viewBox to zoom around the mouse position
    const newWidth = viewBox.width * zoomAmount;
    const newHeight = viewBox.height * zoomAmount;
    viewBox.x += (viewBox.width - newWidth) * mouseXRel;
    viewBox.y += (viewBox.height - newHeight) * mouseYRel;
    viewBox.width = newWidth;
    viewBox.height = newHeight;
    updateViewBox();
});
$LISTENERS
</script>
</body>
</html>
z
document.getElementById('node{id}').addEventListener('mouseover', function(event) {{
  document.getElementById("stacktrace").textContent = {stack}
}})
c           	         g }t          |           D ]j\  }}|j        t                              t	          |dz             t          |j         d|j                             }|                    |           kt          |           }t          
                    dt          |                    
                    dd                    |                    S )Nrv   z:
)rE   stackz$DOTz
$LISTENERSr   )rb   r   _listener_templateformatr   r   r   r6   r  	_templatereplaceri   r   )r   	listenersr   r   sdots         r   to_htmlr    s    I%    19%%QU6QWB\B\QRQZB\B\;];]%^^
--CVT#YY//77diiPYFZFZ[[[r   c                 x     t           j        j                            d           d fd}t	          |          S )Ni )max_entriesr	   c                     | r\t          d | D                       st                              d           d S  t          t	          |                                d S d S )Nc              3   4   K   | ]}t          |          V  d S r0   )r   r   s     r   r   z:observe_tensor_cycles.<locals>.observer.<locals>.<genexpr>  s*      >>s~c**>>>>>>r   z No CUDA Tensors found in garbage)anyr    r&   r  r   )r   callbacks    r   r'   z'observe_tensor_cycles.<locals>.observer  sr     	5>>g>>>>> >???HW\'223344444		5 	5r   r3   )r   r   r  _record_memory_historyr7   )r  r'   s   ` r   observe_tensor_cyclesr    sM    	J,,,@@@5 5 5 5 5 5 8$$$r   c                  \    t                               d           dd} t          |           S )a  
    Install a warning that reports whenever a cycle that is holding CUDA memory is observed.

    The warning produces an .html file that visualizes the cycle,
    and links it to the stack frame that allocated the CUDA tensor.

    Reference cycles are freed by the cycle collector rather than being cleaned up
    when the objects in the cycle first become unreachable. If a cycle points to a tensor,
    the CUDA memory for that tensor will not be freed until garbage collection runs.
    Accumulation of CUDA allocations can lead to out of memory errors (OOMs), as well as
    non-deterministic allocation behavior which is harder to debug.
    z2Watching Python reference cycles for CUDA Tensors.r	   Nc                     t          dd          5 }|                    |            t                              d|j                   d d d            d S # 1 swxY w Y   d S )Nwz.html)suffixzDReference cycle includes a CUDA Tensor see visualization of cycle %s)r   writer    r!   rF   )htmlr>   s     r   write_and_logz)warn_tensor_cycles.<locals>.write_and_log  s    G444 	kGGDMMMNNacdcijjj	k 	k 	k 	k 	k 	k 	k 	k 	k 	k 	k 	k 	k 	k 	k 	k 	k 	ks   6AAAr3   )r    r&   r  )r&  s    r   warn_tensor_cyclesr'    s?     KKDEEEk k k k !///r   )+r   r   typingr   r   r   rx   r   tempfiler   r   torch.cuda._memory_vizr   r   r4   logging	getLoggerrY   r    r7   rA   r   r   r   floatcomplexr?   r   bytesr   r   r   r   r   r   r   r   r  r  r  r  r  r'  r   r   r   <module>r0     s   				 



 " " " " " " " "    ' ' ' ' ' '  < < < < < < < <  		8	$	$8 8 8R$ $ $
 >g g gZ 5'44::sE:
 0F 0F 0Fh& & & & &: & & & &*$ , , , , ,\      (	 	 	i	T 
	\ 	\ 	\	% 	% 	%0 0 0 0 0r   