U
    ªÊ¹j~[  ã                   @   s¶  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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 d dlZd dlmZ d dl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  d	dlm!Z!m"Z" e #e$¡Z%edƒZ&edƒZ'e' (¡ Z)e)�rd dl*Z+g Z,dZ-e)�rXddddgZ,e+j.j/j0 1¡  2dd¡Z3d 4dd„ e,D ƒ¡Z-dddgZ5G dd„ dƒZ6dd„ Z7dZ8G d d!„ d!ƒZ9e :d¡d"d#„ ƒZ;d$d%œd&d'„Z<d(d)„ Z=d*d+„ Z>G d,d-„ d-e?ƒZ@d.d/„ ZAdJd0d1„ZBdKd$d$d2œd3d4„ZCd5d6„ ZDd7d8„ ZEd9d:„ ZFdLd$d$d2œd;d<„ZGeeeH  eeH eeH d=œd>d?„ZIe&eee& ge&f d@œdAdB„ZJeJejKƒZLeJe MdC¡ƒZNeJd ƒZOeJd$ƒZPeJd$ƒZQG dDdE„ dEƒZRG dFdG„ dGƒZSG dHdI„ dIƒZTdS )Mé    N)ÚCounter)Úimport_module)ÚCallableÚOptionalÚSequenceÚTypeVar)Úrand_strided)Úis_float_dtype)ÚStorageWeakRef)ÚContentStoreReaderÚContentStoreWriteré   )Úconfig)Úclone_inputsÚget_debug_dirÚTztorch._inductor.configÚ z1//caffe2/torch/fb/sparsenn:sparsenn_operators_gpuz-//caffe2/torch/fb/sparsenn:sparsenn_operatorsz///deeplearning/fbgemm/fbgemm_gpu:sparse_ops_cpuz+//deeplearning/fbgemm/fbgemm_gpu:sparse_opszfbcode:ú//Ú
c                 C   s   g | ]}d |› d�‘qS )ztorch.ops.load_library("z")© ©Ú.0Úxr   r   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/debug_utils.pyÚ
<listcomp>0   s     r   Zbuck2Úrunz@mode/dev-nosanc                   @   s&   e Zd Zdd„ Zdd„ Zd	dd„ZdS )
ÚBuckTargetWriterc                 C   s¨   t j t j |¡¡\| _| _| j dd¡| _| j dd¡› d| j› �| _| j| j d¡d … | _| jdd … | _| j}|| d¡d … dd … }d|› d	| j› �| _	d S )
Nz.pyr   ú/Ú.zfbcode.é   zfbcode/r   ú:)
ÚosÚpathÚsplitÚabspathÚsubdirÚpy_fileÚreplaceÚtargetÚfindÚcmd_line_path)ÚselfÚfilenameÚtmpr   r   r   Ú__init__7   s    zBuckTargetWriter.__init__c                 C   sD   d  dd„ tD ƒ¡}t d| j› d| j› dt› d|› d| j› d	�¡S )
Nr   c                 S   s   g | ]}d |› d�‘qS )z	        "z",r   r   r   r   r   r   F   s     z*BuckTargetWriter.build.<locals>.<listcomp>za
load("@fbcode_macros//build_defs:python_binary.bzl", "python_binary")

python_binary(
    name="z",
    srcs = ["zŒ"],
    compile = False,
    deps = [
        "//caffe2:torch",
        "//caffe2/functorch:functorch",
        "//triton:triton",
        "z",
    ],
    cpp_deps = [
z
    ],
    main_module = "z",
)
)ÚjoinÚ
extra_depsÚtextwrapÚdedentr(   r&   Ú
cur_targetr"   )r+   Zextra_cpp_depsr   r   r   ÚbuildE   s    üûõòðÿzBuckTargetWriter.buildTc              	   C   sZ   t j | jd¡}t|dƒ�}| |  ¡ ¡ W 5 Q R X t| jg }|rVt	 
dd |¡¡ |S )NZTARGETSÚwzFFound an example that reproduces the error. Run this cmd to repro - %sú )r!   r"   r/   r%   ÚopenÚwriter4   ÚBUCK_CMD_PREFIXr*   ÚlogÚwarning)r+   Z	print_msgZtarget_fileÚfdZ	cmd_splitr   r   r   r8   ]   s    þzBuckTargetWriter.writeN)T)Ú__name__Ú
__module__Ú__qualname__r.   r4   r8   r   r   r   r   r   6   s   r   c                  C   sL   t j tƒ d¡} | d kr.t ¡ › dt ¡ › �} t j | ¡sHt j	| dd� | S )NZminifierz
/minifier_T)Úexist_ok)
r!   r"   r/   r   ÚtempfileÚ
gettempdirÚgetpassÚgetuserÚexistsÚmakedirs)r"   r   r   r   Úminifier_dirk   s    rG   é   c                   @   s¦   e Zd Zejjejjejjejjejj	ejj
ejjejjejjejjejjejjejjejjejjejjejjejjejjejjejjgZedd„ ƒZedd„ ƒZdS )ÚNNModuleToStringc                 C   sL   t ƒ }|  ¡ D ] \}}t|ƒtjkr| |¡ qt|ƒdkrHt d|¡ dS )Nr   z-We have not tested reprs of some modules - %sT)	ÚsetÚnamed_childrenÚtyperI   Ú
safe_reprsÚaddÚlenr:   r;   )ÚgmZcant_convertÚ_Úmoduler   r   r   Úcan_convert_to_string�   s    z&NNModuleToString.can_convert_to_stringc                 C   sÂ  ddl m} d}t d¡}|  ¡ D ]V\}}| ¡ › }t| ¡ d ƒ}|d k	rZ|jrZ|› d�}||d › d|› d|› d	�7 }q"| j	 
¡ D ]²\}}	|	d kr–q„|	 ¡ tkrÆdd
lm}
 |
jtks¼t‚t|	ƒ}n@t |	¡rìdt|	jƒ› d|	j› d�}ndt|	jƒ› d|	j› d�}|	j�r|› d�}||d › d|› d|› d�7 }q„| j 
¡ D ]d\}}|d k�rX�qBd}|j�rhd}dt|jƒ› d|j› |› d�}||d › d|› d|› d	�7 }�qB||| jdƒ› d	�7 }|S )Nr   )Ú
_addindentú    z¥
            from torch.nn import *
            class Repro(torch.nn.Module):
                def __init__(self):
                    super().__init__()
            z.cuda()é   zself.z = r   )Ú
PRINT_OPTSztorch.randn(z, dtype=ú)ztorch.randint(1, size=zself.register_buffer('z', z)
r   z, device="cuda"ztorch.nn.Parameter(torch.randn(z))rH   )Ztorch.nn.modules.modulerT   r1   r2   rK   Ú__repr__ÚnextÚ
parametersZis_cudaÚ_buffersÚitemsZnumelÚMAX_CONSTANT_NUMEL_INLINEZtorch._tensor_strrW   Ú	thresholdÚAssertionErrorÚreprÚtorchÚis_floating_pointÚlistÚshapeÚdtypeÚ_parametersÚcode)rP   rT   ÚtabÚ	model_strÚmodule_namerR   Z
module_strZexample_paramZbuffer_nameÚbufferrW   Z
tensor_strÚ
param_nameÚparamÚmaybe_devicer   r   r   Úconvertœ   sF    ÿ	

 

ÿ
 
"	zNNModuleToString.convertN)r=   r>   r?   rb   ÚnnZLinearZConv1dZConv2dZConv3dZBatchNorm1dZBatchNorm2dZBatchNorm3dZ	LayerNormZDropoutZSoftmaxZReLUZGELUZIdentityZ	MaxPool2dZ	EmbeddingZTanhZConvTranspose1dZGLUZLSTMZFlattenZAdaptiveAvgPool2drM   ÚstaticmethodrS   rp   r   r   r   r   rI   w   s4   ë
rI   c                  C   sÒ   t j ¡ sdS d} zJtjddgtjd�}|j ¡  d¡}d 	dd	„ |D ƒ¡}| |› d�7 } W n t
k
rx   | d
7 } Y nX tdd„ tt j ¡ ƒD ƒƒ}| d7 } | ¡ D ]\}}| d|› d|› d�7 } q¦| d7 } | S )Nz:# torch.cuda.is_available()==False, no GPU info collected
z# CUDA Info: 
Znvccz	--version)Ústdoutr   r   c                 S   s    g | ]}|d krd|› d�‘qS ))r   ú# ú 
r   )r   Úsr   r   r   r   ä   s      z-_cuda_system_info_comment.<locals>.<listcomp>z# nvcc not found
c                 s   s   | ]}t j |¡V  qd S ©N)rb   ÚcudaZget_device_name)r   Úir   r   r   Ú	<genexpr>é   s    z,_cuda_system_info_comment.<locals>.<genexpr>z# GPU Hardware Info: 
rt   z : ru   )rb   rx   Zis_availableÚ
subprocessr   ÚPIPErs   Údecoder#   r/   ÚFileNotFoundErrorr   ÚrangeZdevice_countr]   )rj   Zcuda_version_outZcuda_version_linesÚcommentZ	gpu_namesÚnameÚcountr   r   r   Ú_cuda_system_info_commentÛ   s$    
ÿrƒ   F)Ústable_outputc                 C   sH   dd l }dd l}| rdS d|jj ¡ › d|jj ¡ › d|jj ¡ › d�S )Nr   z*# config omitted due to stable_output=TruezYimport torch._dynamo.config
import torch._inductor.config
import torch._functorch.config
r   )Ztorch._functorch.configZtorch._inductor.configZ_dynamor   Zcodegen_configZ	_inductorZ
_functorch)r„   rb   r   r   r   Úgenerate_config_stringô   s    
ü
û
úr…   c                   C   s   t j tƒ d¡S )Nzminifier_launcher.py)r!   r"   r/   rG   r   r   r   r   Úget_minifier_repro_path  s    r†   c              
   C   s‚   t ƒ }t d|¡ tr"t|ƒ ¡  z$t|dƒ�}| | ¡ W 5 Q R X W n6 tk
r| } zt |¡ t	dƒ|‚W 5 d }~X Y nX d S )NzWriting minified repro to:
%sr5   z(Could not write to {minified_repro_path})
r†   r:   r;   Úuse_buckr   r8   r7   ÚOSErrorÚ	exceptionÚNotImplementedError)ÚcontentsZminified_repro_pathr<   Úer   r   r   Úhelper_for_dump_minify	  s    
r�   c                   @   s   e Zd ZdS )ÚAccuracyErrorN)r=   r>   r?   r   r   r   r   rŽ     s   rŽ   c                 C   sB   t | ƒ}tt| ƒƒD ](}t|| tjƒr||  | | j¡ q|S )zæ
    This clone inputs is different from utils clone_input. In case of minifier,
    all the tensors are leaf tensors while creating a new graph. So, we set the
    requires_grad field w/o checking the leafness of the tensor.
    )r   r   rO   Ú
isinstancerb   ÚTensorZrequires_grad_Úrequires_grad)Úexample_inputsZcloned_inputsÚidxr   r   r   Úclone_inputs_retaining_gradness  s
    r”   c                 C   sÖ   ddl m} ddlm}m}m} t | ¡} |s6t|ƒ}t	| dƒrJ|  
d¡ t| ddƒ}t| d	dƒ}	t	| d
ƒs |dk	s||	dk	r || ƒ} |dk	r’|| _|	dk	r |	| _| |ƒ}
|r°|
S ||
ƒrÈ||
ƒ}| ¡  || |
d|ƒS )zã
    Runs a forward and possibly backward iteration for a given mod and args.

    When disable_clone is True, we will use args as-is without cloning.
    This is higher fidelity but we may destroy the args in the process.
    r   )Úmake_boxed_funcr   )Úcollect_resultsÚreduce_to_scalar_lossÚrequires_bwd_passÚ	zero_gradTÚnamed_parametersNÚnamed_buffersZ_boxed_call)Ztorch._functorch.aot_autogradr•   Útestingr–   r—   r˜   ÚcopyÚdeepcopyr”   Úhasattrr™   Úgetattrrš   r›   Zbackward)rP   ÚargsÚonly_fwdZdisable_cloner•   r–   r—   r˜   Zorig_named_parametersZorig_named_buffersÚoutZlossr   r   r   Úrun_fwd_maybe_bwd)  s4    



ÿÿr¤   ©Úrequire_fp64Úignore_non_fpc             
   C   s.  ddl m} ddlm}m} ddlm}	 t| |ƒrF|| ƒ| _|| ƒ| _	t||ƒrd||ƒ|_||ƒ|_	t
| ||ƒ}
d}tjrÎz(tt | ¡t|ƒƒ\}}t
|||ƒ}W n* tk
rÌ   |r¾tdƒ‚t d¡ Y nX zt
|||ƒ}W n4 tk
�r } zt d¡ W Y ¢dS d}~X Y nX |	|
||tjd|d	�}|S )
aa  
    Check two models have same accuracy.

    require_fp64: if True, raise an error if we unable to calculate the fp64 reference
    ignore_non_fp: if True, do not compare outputs which are not floating point.  This
        is mostly useful for the minifier (which wants to avoid quantizing floating point
        error into integer/boolean error)
    r   )ÚOptimizedModule)Ú"named_buffers_for_optimized_moduleÚ%named_parameters_for_optimized_module)ÚsameNzCould not generate fp64 outputsz�While minifying the program in accuracy minification mode, ran into a runtime exception which is likely an unrelated issue. Skipping this graph.T)ZtolZ	equal_nanr§   )Z
eval_framer¨   rœ   r©   rª   Úutilsr«   r�   rš   r›   r¤   r   Zsame_two_models_use_fp64Úcast_to_fp64r�   rž   r”   Ú	ExceptionÚRuntimeErrorr:   r;   r‰   Zrepro_tolerance)rP   Zopt_gmr’   r¢   r¦   r§   r¨   r©   rª   r«   ÚrefZfp64_refZ
fp64_modelZfp64_examplesÚresrŒ   Zpassingr   r   r   Úsame_two_modelsP  sL    





 ÿÿúr²   c                 C   s‚   | j jD ]b}|jdkr|jtjjjjkrt	|j
ƒdks:t‚t|j
d ƒr|j
d tjkr|j
d tjf|_
q| j  ¡  |  ¡  | S )NZcall_functionrV   r   r   )ÚgraphZnodesÚopr(   rb   ZopsZprimsZconvert_element_typeÚdefaultrO   r¡   r`   r	   Úfloat64ZlintZ	recompile)ÚmodelÚnoder   r   r   Ú!cast_convert_element_type_to_fp64•  s    ÿþ
r¹   c                    sB   ddl m} | ˆ ¡}ˆ tjkr(t|ƒ}|‡ fdd„|ƒ}||fS )Nr   )Útree_mapc                    s"   t | tjƒr|  ¡ r|  ˆ ¡S | S rw   )r�   rb   r�   rc   Úto©r   ©rf   r   r   Ú<lambda>­  s
    
ÿÿzcast_to.<locals>.<lambda>)Ztorch.utils._pytreerº   r»   rb   r¶   r¹   )rf   r·   Úinputsrº   r   r½   r   Úcast_to£  s    


ürÀ   c                 C   s   t tj| |ƒS rw   )rÀ   rb   r¶   )r·   r¿   r   r   r   r­   µ  s    r­   c             
   C   sd   z,|t  | ¡t|ƒƒ}t| |||||d� W S  tk
r^ } zt d¡ W Y ¢dS d }~X Y nX d S )Nr¥   z�While minifying the program in accuracy minification mode, ran into a runtime exception which is likely an unrelated issue. Skipping this graphF)r�   rž   r”   r²   r®   r:   r‰   )rP   r’   Zcompiler_fnr¢   r¦   r§   Zcompiled_gmrŒ   r   r   r   Úbackend_accuracy_fails¹  s$    	 ÿú
ÿrÁ   )Ústridere   Úreturnc                C   s   | d k	r| S t  |¡S rw   )r¬   Zmake_contiguous_strides_for)rÂ   re   r   r   r   Ú_stride_or_defaultâ  s    rÄ   )ÚdrÃ   c                    s   ‡ fdd„S )Nc                    s   | d k	r| S ˆ S rw   r   r¼   ©rÅ   r   r   r¾   é  ó    z_mk_defaulter.<locals>.<lambda>r   rÆ   r   rÆ   r   Ú_mk_defaulterè  s    rÈ   Úcpuc                   @   s4   e Zd Zdd„ Zdddœdd„Zdd„ Zd	d
„ ZdS )ÚNopInputReaderc                 C   s
   d| _ d S )Nr   ©Útotal)r+   r   r   r   r.   ô  s    zNopInputReader.__init__N©ÚdeviceÚ
dtype_hintc                C   s   |  j d7  _ d S )Nr   rË   )r+   Ústorage_hashÚnbytesrÎ   rÏ   r   r   r   Ústorage÷  s    zNopInputReader.storagec                 O   s   d S rw   r   ©r+   r¡   Úkwargsr   r   r   Útensorú  s    zNopInputReader.tensorc                 O   s   d S rw   r   rÓ   r   r   r   Úsymintý  s    zNopInputReader.symint©r=   r>   r?   r.   rÒ   rÕ   rÖ   r   r   r   r   rÊ   ó  s   rÊ   c                   @   sJ   e Zd Zdddœdd„Zdddœdd„Zddddddœd	d
„Zdd„ ZdS )ÚInputReaderN)Úpbarc                C   s8   |d krt  d¡ |d k	r"t|ƒnd | _g | _|| _d S )Nz0no save_dir specified, will generate random data)r:   r;   r   Ústorer¡   rÙ   )r+   Úsave_dirrÙ   r   r   r   r.     s
    
zInputReader.__init__rÍ   c                C   s²   | j d k	r| j  d¡ t|ƒ}t|ƒ}| jd k	r||d k	r|z| j |¡}W n tk
r\   Y n X ||jkrxt 	d||j¡ |S t 	d|¡ ||j
 f}td |d�}t||||ƒ ¡ S )Nr   zdevice mismatch: %s != %sz1could not load %s, generating random data instead©re   )rÙ   ÚupdateÚ_device_or_defaultÚ_dtype_or_defaultrÚ   Zread_storager~   rÎ   r:   r;   ÚitemsizerÄ   r   Úuntyped_storage)r+   rÐ   rÑ   rÎ   rÏ   rÒ   re   rÂ   r   r   r   rÒ     s     

zInputReader.storage)Ústorage_offsetrf   r‘   Úis_leafc          
   	   K   sâ   t ||d�}t|ƒ}t|ƒ}t|ƒ}t|ƒ}tjg ||j|d�}	t ¡ � |	 	||||¡ W 5 Q R X |s®t 
¡ � |	jtjd�}	W 5 Q R X t ¡ � |	 	||||¡ W 5 Q R X tjj |	¡|ksÄt‚tj |	|¡ | j |	¡ |	S )NrÜ   )rf   rÎ   r‘   )Zmemory_format)rÄ   Ú_storage_offset_or_defaultrß   Ú_is_leaf_or_defaultÚ_requires_grad_or_defaultrb   rÕ   rÎ   Zno_gradÚset_Zenable_gradÚcloneZpreserve_formatÚ_subclassesÚ
meta_utilsÚsafe_is_leafr`   Ú_utilsZset_tensor_metadatar¡   Úappend)
r+   rÒ   re   rÂ   râ   rf   r‘   rã   ÚmetadataÚtr   r   r   rÕ   %  s,       ÿ


zInputReader.tensorc                 C   s   | j  |¡ |S rw   )r¡   rí   )r+   Úvalr   r   r   rÖ   F  s    zInputReader.symint)N)Nr×   r   r   r   r   rØ     s    ü÷!rØ   c                   @   sT   e Zd Zddœdd„Zdd„ Zdddœed	œd
d„Zdd	œdd„Zdd	œdd„ZdS )ÚInputWriterF©Ústable_hashc                C   s:   g | _ t ¡ | _|| _|d k	r*t||d�nd | _i | _d S )Nrò   )Ú_linesÚ	itertoolsr‚   Ústorage_counterrÛ   r   rÚ   Úseen_storages)r+   rÛ   ró   r   r   r   r.   X  s    
ÿýzInputWriter.__init__c                 C   s*   dg}|  dd„ | jD ƒ¡ | d¡ |S )Nzdef load_args(reader):c                 s   s   | ]}d |› �V  qdS )rU   Nr   )r   Úlr   r   r   rz   h  s     z$InputWriter.lines.<locals>.<genexpr>zload_args._version = 0)Úextendrô   rí   )r+   Úrr   r   r   Úlinesd  s
    ÿ
zInputWriter.linesN©rÏ   Údevice_hint)rÃ   c             
   C   sê   t |ƒ}| j |¡}|d k	r |S dt| jƒ› �}d}td ƒt|ƒkrNd|›�}d}|j}|jdkrr|d k	snt‚|}t	d ƒ|krˆd|›�}| 
¡ }	d }
| jd k	r¶|jjdkr¶| j |¡}
| j |› d|
›d|	›|› |› d�¡ || j|< |S )	NÚbufr   z, dtype_hint=Úmetaz	, device=z = reader.storage(ú, rX   )r
   r÷   ÚgetrZ   rö   rß   rÎ   rL   r`   rÞ   rÑ   rÚ   Zwrite_storagerô   rí   )r+   rá   rÏ   rý   ÚwsÚvZmaybe_dtype_hintro   rÎ   rÑ   rÐ   r   r   r   rÒ   s  s0    


ÿ
zInputWriter.storagec              	   C   s4  | j | ¡ |j|jd�}g }td |jd�| ¡ krH| tt	| ¡ ƒƒ¡ t
d ƒ|jkrh| d|j›�¡ td ƒ| ¡ krŒ| d| ¡ ›�¡ tj |¡}|r´| dd„ | ¡ D ƒ¡ td ƒ|jkrÔ| d|j›�¡ tjj |¡}td ƒ|krþ| d|›�¡ | j d	d
 |tt	|jƒƒf|•¡ d|› � ¡ d S )Nrü   rÜ   zdtype=zstorage_offset=c                 s   s    | ]\}}|› d |›�V  qdS )ú=Nr   )r   Úkr  r   r   r   rz   �  s     z%InputWriter.tensor.<locals>.<genexpr>zrequires_grad=zis_leaf=zreader.tensor(r   ú)  # )rÒ   rá   rf   rÎ   rÄ   re   rÂ   rí   ÚstrÚtuplerß   rä   râ   rb   rì   Zget_tensor_metadatarù   r]   ræ   r‘   ré   rê   rë   rå   rô   r/   )r+   r�   rï   rÒ   r¡   Ztensor_metadatarã   r   r   r   rÕ   �  s6      ÿÿþÿzInputWriter.tensorc                 C   s0   t |tjƒr|jj}| j d|›d|› �¡ d S )Nzreader.symint(r  )r�   rb   ZSymIntr¸   Úhintrô   rí   )r+   r�   rð   r   r   r   rÖ   ª  s    zInputWriter.symint)	r=   r>   r?   r.   rû   r  rÒ   rÕ   rÖ   r   r   r   r   rñ   W  s
   rñ   )FF)F)F)Ur�   Ú	functoolsrC   rõ   Úloggingr!   r{   rA   r1   Úcollectionsr   Ú	importlibr   Útypingr   r   r   r   rb   Ztorch._prims_commonZ_prims_commonr¬   Ztorch._subclasses.meta_utilsZtorch._dynamo.testingr   r	   Z torch.multiprocessing.reductionsr
   Ztorch.utils._content_storer   r   r   r   r   r   Ú	getLoggerr=   r:   r   Zinductor_configZ	is_fbcoder‡   Zlibfb.py.build_infoZlibfbr0   Zextra_importsÚpyZ
build_infoZ	BuildInfoZget_build_ruler'   r3   r/   r9   r   rG   r^   rI   Ú	lru_cacherƒ   r…   r†   r�   r®   rŽ   r”   r¤   r²   r¹   rÀ   r­   rÁ   ÚintrÄ   rÈ   Zfloat32rß   rÎ   rÞ   rä   ræ   rå   rÊ   rØ   rñ   r   r   r   r   Ú<module>   s–   
ü
5	d

+ üùE üù*
 þ
T