U
    Kc                     @   s  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ddddgZd	d
 Z	d)ddZ
dd Ze
fddZe
fddZe
fddZG dd dZdd Zedkrd dlZejejeZeejkreje d dlmZ d dlZdZde Zejde dZejddZ dd Z!e j"dddZ#e#j$ded d Z%e j"de%dZ&e&j$ded e!e& d!Z%e j"de%dZ'e'j$ded e!e' d"Z%e j"de%dZ(e(j$d#ed e(j$d$ed e!e( e) Z*d%d& Z+d'd( Z,e*j-dkre .e+e*j/Z0e,e*j1ee0 ne*j-dkr6e .e+e*j/Z0e,e*j1ee0 nhe*j-dkr`e .e+e*j/Z0eee0 n>e*j-dkre .e+e*j2Z2e .e+e*j3Z3e,e*j1ee2e3 dS )*    N)DictAnyformat_flamegraphsegmentsmemorycomparestatsBytesc                 C   s6   | d }| d  dd }| d }| d| d| S )Nlinefilename/name:)split)fifnamefunc r   :/tmp/pip-unpacked-wheel-gikjz4vx/torch/cuda/_memory_viz.py
_frame_fmt	   s    r   c                 C   s   |d krdt   d}t j|sXdd l}td|  |jd| t	dd|g |dd	g}tj
|tjtjd
d}|jd k	st|jd k	st|j|  |j  |j }|j  |  | dkst|S )Nz/tmp/z_flamegraph.plr   zDownloading flamegraph.pl to: zNhttps://raw.githubusercontent.com/brendangregg/FlameGraph/master/flamegraph.plchmodz+xz--countnamebyteszutf-8)stdinstdoutencoding)osgetuidpathexistsurllib.requestprintrequesturlretrieve
subprocessrunPopenPIPEr   AssertionErrorr   writeclosereadwait)Zflamegraph_linesZflamegraph_scripturllibargspresultr   r   r   r      s*     



c           
      C   s   |D ]}d|kr6|  | d|d  d|d  d qd}|d D ]d}|d }||7 }|d	 }|r|dd
d t|D }nd}|  | d|d  d| d| d qB|d | }	|	r|  | d|d  d|	 d qd S )Nhistory;state size
r   Z	real_sizeframesc                 S   s   g | ]}t |qS r   )r   ).0r   r   r   r   
<listcomp>/   s     z!_write_blocks.<locals>.<listcomp>z<non-python>z;<gaps> )r*   joinreversed)
r   prefixblocksbZaccounted_for_sizehszr8   Zframe_sZgapsr   r   r   _write_blocks$   s     $(rB   c                 C   sF   t  }| D ],}d|d  d|d  }t|||d  q|| S )Nstream_stream;seg_addressr>   ioStringIOrB   getvaluesnapshotr   r   segr=   r   r   r   r   7   s
    c                 C   s<   t  }| D ]"}d|d  }t|||d  q|| S )NrC   rD   r>   rG   rK   r   r   r   r   >   s
    c                    s   dd  dd }t  }t fdd| D }t fdd|D }tdtd	d || D   td
tdd || D   | D ]*} ||krt|d|| |d  q|D ]*} ||krt|d|| |d  q|| S )Nc                 S   s   | d | d fS )NrF   
total_sizer   rM   r   r   r   _seg_keyF   s    zcompare.<locals>._seg_keyc                 S   s   d| d  d| d  S )NrC   rD   rE   rF   r   rO   r   r   r   	_seg_infoI   s    zcompare.<locals>._seg_infoc                 3   s   | ]} |V  qd S Nr   r9   rM   rP   r   r   	<genexpr>N   s     zcompare.<locals>.<genexpr>c                 3   s   | ]} |V  qd S rR   r   rS   rT   r   r   rU   O   s     zonly_before = c                 s   s   | ]\}}|V  qd S rR   r   r9   a_r   r   r   rU   Q   s     zonly_after = c                 s   s   | ]\}}|V  qd S rR   r   rV   r   r   r   rU   R   s     zonly_before;r>   zonly_after;)rH   rI   setr"   listrB   rJ   )beforeafterr   rQ   r   Zbefore_segsZ
after_segsrM   r   rT   r   r   E   s      c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r	   c                 C   s
   || _ d S rR   )value)selfr]   r   r   r   __init___   s    zBytes.__init__c                 C   s   t | j| S rR   )r	   r]   )r^   rhsr   r   r   __add__b   s    zBytes.__add__c                 C   sD   | j }dD ],}t|dk r.|d| d  S |d }q
|ddS )N) ZKiZMiZGiZTiPiZEiZZig      @z3.1fBz.1fZYiB)r]   abs)r^   numunitr   r   r   __repr__e   s    
zBytes.__repr__N)__name__
__module____qualname__r_   ra   rh   r   r   r   r   r	   ^   s   c                 C   s   i }t | |d< td|d< | D ]v}d}|d D ]D}|d |krPtd||d < ||d 7 }||d   |d 7  < q0|d |kst|d  |7  < q |S )Nr   r   rN   r>   r4   r6   )lenr	   r)   )rL   r1   rM   rN   r?   r   r   r   r   n   s    __main__)pprintz torch.cuda.memory_dbg.snapshot()zpickled memory statistics from z#Visualize memory dumps produced by )descriptionaction)destc                 C   s   | j ddddd d S )Nz-oz--outputz
output.svgz$flamegraph svg (default: output.svg))defaulthelp)add_argument)r0   r   r   r   _output   s    ru   z$Prints overall allocation statisticsinput)rs   zaGenerate a flamegraph that visualizes what memory is stored in each allocator segment (aka block)zNGenerate a flamegraph the program locations contributing to CUDA memory usage.zGenerate a flamegraph that shows segments (aka blocks) that have been added or removed between two different memorys snapshots.r[   r\   c                 C   s   | dkrt jjS t| dS d S )N-rb)sysr   bufferopen)r   r   r   r   _read   s    r|   c              	   C   s$   t | d}|| W 5 Q R X d S )Nw)r{   r*   )r   datar   r   r   r   _write   s    r   )N)4picklery   r   rH   r%   typingr   r   __all__r   r   rB   r   r   r   r	   r   ri   os.pathr   realpathdirname__file__Zthedirremovern   argparsefn_nameZpickledArgumentParserparseradd_subparsersZ
subparsersru   
add_parserZstats_art   ro   Z
segments_aZmemory_aZ	compare_a
parse_argsr/   r|   r   rp   loadrv   r~   outputr[   r\   r   r   r   r   <module>   sr   



