o
    "ig                     @   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	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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  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.rd dl/Z0g Z1dZ2e.rg dZ1e0j3j4j56 7ddZ8d9dd e1D Z2g dZ:G dd dZ;dd Z<dZ=G dd dZ>e?ddd Z@d d!d"d#ZAd$d% ZBd&d' ZCG d(d) d)eDZEd*d+ ZFdQd,d-ZG	 dRd d d.d/d0ZHd1d2 ZId3d4 ZJd5d6 ZK	 dRd d d.d7d8ZLd9ed: d;d<d=d:fd>d?ZMd@e+d=eee+ ge+f fdAdBZNeNejOZPeNeQdCZReNd ZSeNd ZTeNd ZUG dDdE dEZVG dFdG dGZWG dHdI dIZX	J		dSdKeee gee f dLeYdMeeeYeZf  dNeeZ d=eeYef f
dOdPZ[dS )T    N)Counter)import_module)AnyCallableDictListOptionalTypeVar)Tensor)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      g | ]}d | dqS )ztorch.ops.load_library("z") .0xr   r   W/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/_dynamo/debug_utils.py
<listcomp>6       r   )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__=   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   r   )z	        "z",r   r   r   r   r   r   L   r   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",
    par_style = "xar",
)
)join
extra_depstextwrapdedentr.   r,   
cur_targetr(   )r1   extra_cpp_depsr   r   r   buildK   s   zBuckTargetWriter.buildTc                 C   sn   t j| jd}t|d}||   W d    n1 sw   Y  t| jg }|r5t	
dd| |S )NTARGETSwzFFound an example that reproduces the error. Run this cmd to repro - %s )r'   r(   r5   r+   openwriter;   BUCK_CMD_PREFIXr0   logwarning)r1   	print_msgtarget_filefd	cmd_splitr   r   r   r@   d   s   zBuckTargetWriter.writeN)T)__name__
__module____qualname__r4   r;   r@   r   r   r   r   r"   <   s    r"   c                  C   sL   t jt d} | d u rt  dt  } t j| s$t j	| dd | S )Nminifierz
/minifier_T)exist_ok)
r'   r(   r5   r   tempfile
gettempdirgetpassgetuserexistsmakedirs)r(   r   r   r   minifier_dirr   s   rS      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vr|| qt|dkr$td| dS )Nr   z-We have not tested reprs of some modules - %sT)	setnamed_childrentyperU   
safe_reprsaddlenrB   rC   )gm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 ]+\}}|  }t| d }|d ur-|jr-| d}||d  d| d| d	7 }q| j	
 D ]X\}}	|	d u rKqB|	 tkrcdd
lm}
 |
jtks^J t|	}n t|	rvdt|	j d|	j d}ndt|	j d|	j d}|	jr| d}||d  d| d| d7 }qB| j
 D ].\}}|d u rqd}|jrd}dt|j d|j | d}||d  d| d| d	7 }q||| 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))rT   )torch.nn.modules.modulera   r7   r8   rW   __repr__next
parametersis_cuda_buffersitemsnumelMAX_CONSTANT_NUMEL_INLINEtorch._tensor_strrd   	thresholdreprtorchis_floating_pointlistshapedtype_parameterscode)r\   ra   tab	model_strmodule_namer_   
module_strexample_parambuffer_namebufferrd   
tensor_str
param_nameparammaybe_devicer   r   r   convert   sF   	

 


  	zNNModuleToString.convertN)rH   rI   rJ   rr   nnLinearConv1dConv2dConv3dBatchNorm1dBatchNorm2dBatchNorm3d	LayerNormDropoutSoftmaxReLUGELUIdentity	MaxPool2d	EmbeddingTanhConvTranspose1dGLULSTMFlattenAdaptiveAvgPool2drY   staticmethodr`   r   r   r   r   r   rU   ~   s6    
rU   c               	   C   s   t j sdS d} z!tddg}| d}ddd |D }| | d7 } W n ttj	fy:   | d	7 } Y nw t
d
d tt j D }| d7 } | D ]\}}| d| d| d7 } qQ| d7 } | S )Nz:# torch.cuda.is_available()==False, no GPU info collected
z# CUDA Info: 
nvccz	--versionr   r   c                 S   s    g | ]}|d v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)rr   cudaget_device_name)r   ir   r   r   	<genexpr>   s    
z,_cuda_system_info_comment.<locals>.<genexpr>z# GPU Hardware Info: 
r   z : r   )rr   r   is_available
subprocesscheck_outputdecoder)   r5   FileNotFoundErrorCalledProcessErrorr   rangedevice_countrl   )rz   cuda_version_outcuda_version_linescomment	gpu_namesnamecountr   r   r   _cuda_system_info_comment   s&   
r   F)stable_outputc              	   C   s\   dd l }dd l}| rdS |jjj }d|jj  d|jj  d|j	j  d| d	S )Nr   z*# config omitted due to stable_output=Truez~import torch._dynamo.config
import torch._inductor.config
import torch._functorch.config
import torch.fx.experimental._config
r   )
torch._functorch.configtorch._inductor.configfxexperimental_configcodegen_config_dynamor   	_inductor
_functorch)r   rr   experimental_configr   r   r   generate_config_string   s   


r   c                   C   s   t jt dS )Nzminifier_launcher.py)r'   r(   r5   rS   r   r   r   r   get_minifier_repro_path  s   r   c              
   C   s   t  }td| trt|  zt|d}||  W d    W d S 1 s)w   Y  W d S  tyF } z
td t	d|d }~ww )NzWriting minified repro to:
%sr=   r   z(Could not write to {minified_repro_path})
r   rB   rC   use_buckr"   r@   r?   OSError	exceptionNotImplementedError)contentsminified_repro_pathrF   er   r   r   helper_for_dump_minify  s   &

r   c                   @   s   e Zd ZdS )AccuracyErrorN)rH   rI   rJ   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   r[   
isinstancerr   r
   requires_grad_requires_grad)example_inputscloned_inputsidxr   r   r   clone_inputs_retaining_gradness&  s   r   c           	      C   s   ddl m}m}m} t| } |st|}t| dr| d t| dr(| |n| | }|r0|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   )collect_resultsreduce_to_scalar_lossrequires_bwd_pass	zero_gradT_boxed_callN)
testingr   r   r   copydeepcopyr   hasattrr   backward)	r\   argsonly_fwddisable_cloner   r   r   outlossr   r   r   run_fwd_maybe_bwd3  s   


r   require_fp64ignore_non_fpc             
   C   s   ddl m} t| ||}d}tjr:ztt| t|\}	}
t|	|
|}W n t	y9   |r2t
dtd Y nw zt|||}W n t	yZ } ztd W Y d}~dS d}~ww ||||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   )sameNzCould not generate fp64 outputszWhile minifying the program in accuracy minification mode, ran into a runtime exception which is likely an unrelated issue. Skipping this graph.T)tol	equal_nanr   )utilsr   r   r   same_two_models_use_fp64cast_to_fp64r   r   r   	ExceptionRuntimeErrorrB   rC   r   repro_tolerance)r\   opt_gmr   r   r   r   r   reffp64_ref
fp64_modelfp64_examplesresr   passingr   r   r   same_two_modelsN  s@   
r   c                 C   s   | j jD ]Q}|jdkr5|jtjjjjkr5t	|j
dksJ t|j
d r5|j
d tjkr5|j
d tjf|_
|jdkrU|jd}|d urUt|rUt|j}tj|d< ||_q| j   |   | S )Ncall_functionrc   r   r   rv   )graphnodesopr.   rr   opsprimsconvert_element_typedefaultr[   r   r   float64kwargsgetdictlint	recompile)modelnoderv   
new_kwargsr   r   r   cast_dtype_args_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 r   )r   rr   r
   rs   tor   rv   r   r   <lambda>  s
   
zcast_to.<locals>.<lambda>)torch.utils._pytreer  r  rr   r   r  )rv   r  inputsr  r   r
  r   cast_to  s   


r  c                 C   s   t tj| |S r   )r  rr   r   )r  r  r   r   r   r     s   r   c             
   C   s^   z|t | t|}t| |||||d W S  ty. } ztd W Y d }~dS d }~ww )Nr   zWhile 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   rB   r   )r\   r   compiler_fnr   r   r   compiled_gmr   r   r   r   backend_accuracy_fails  s&   	
r  strideztorch._prims_common.StrideTyperu   ztorch._prims_common.ShapeTypereturnc                C   s   | d ur| S t |S r   )r   make_contiguous_strides_for)r  ru   r   r   r   _stride_or_default  s   r  dc                    s    fddS )Nc                    s   | d ur| S  S r   r   r	  r  r   r   r    s    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)r1   r   r   r   r4     s   
zNopInputReader.__init__Ndevice
dtype_hintc                C   s   |  j d7  _ d S )Nr   r  )r1   storage_hashnbytesr  r  r   r   r   storage  s   zNopInputReader.storagec                 O      d S r   r   r1   r   r   r   r   r   tensor     zNopInputReader.tensorc                 O   r#  r   r   r$  r   r   r   symint  r&  zNopInputReader.symintrH   rI   rJ   r4   r"  r%  r'  r   r   r   r   r    s
    r  c                   @   sL   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 u r	t d |d urt|nd | _g | _|| _d S )Nz0no save_dir specified, will generate random data)rB   rC   r   storer   r*  )r1   save_dirr*  r   r   r   r4     s
   

zInputReader.__init__r  c                C   s   | j d ur| j d t|}t|}| jd ur=|d ur=z| j|}W n	 ty-   Y nw ||jkr;t	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ru   )r*  update_device_or_default_dtype_or_defaultr+  read_storager   r  rB   rC   itemsizer  r   untyped_storage)r1   r   r!  r  r  r"  ru   r  r   r   r   r"  	  s"   

zInputReader.storage)storage_offsetrv   r   is_leafc          
      K   s  t ||d}t|}t|}t|}t|}tjg ||j|d}	t  |		|||| W d    n1 s7w   Y  |sut
  |	jtjd}	W d    n1 sTw   Y  t  |		|||| W d    n1 spw   Y  tjj|	|ksJ tj|	| | j|	 |	S )Nr-  )rv   r  r   )memory_format)r  _storage_offset_or_defaultr0  _is_leaf_or_default_requires_grad_or_defaultrr   r%  r  no_gradset_enable_gradclonepreserve_format_subclasses
meta_utilssafe_is_leaf_utilsset_tensor_metadatar   append)
r1   r"  ru   r  r4  rv   r   r5  metadatatr   r   r   r%    s,   



zInputReader.tensorc                 C   s   | j | |S r   )r   rD  )r1   valr   r   r   r'  @  s   zInputReader.symintr   r(  r   r   r   r   r)    s    !r)  c                   @   sL   e Zd ZddddZdd Zdddd	efd
dZdddZdddZdS )InputWriterFstable_hashc                C   s:   g | _ t | _|| _|d urt||dnd | _i | _d S )NrI  )_lines	itertoolsr   storage_counterr,  r   r+  seen_storages)r1   r,  rJ  r   r   r   r4   R  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 )rb   Nr   )r   lr   r   r   r   b  s    z$InputWriter.lines.<locals>.<genexpr>zload_args._version = 0)extendrK  rD  )r1   rr   r   r   lines^  s
   
zInputWriter.linesNr  device_hintr  c             
   C   s   t |}| j|}|d ur|S dt| j }d}td t|kr'd|}d}|j}|jdkr9|d us7J |}td |krDd|}|	 }	d }
| j
d ur[|jjdkr[| j
|}
| j| d|
d|	| | d || j|< |S )	Nbufr   z, dtype_hint=metaz	, device=z = reader.storage(, re   )r   rN  r   rh   rM  r0  r  rX   r/  r!  r+  write_storagerK  rD  )r1   r3  r  rT  wsvmaybe_dtype_hintr   r  r!  r   r   r   r   r"  m  s0   



zInputWriter.storagec              	   C   s4  | j | |j|jd}g }td |jd| kr$|tt	|  t
d |jkr4|d|j td | krF|d|  tj|}|rZ|dd | D  td |jkrj|d|j tjj|}td |kr|d| | jd	d
|tt	|jg| d|   d S )NrS  r-  zdtype=zstorage_offset=c                 s   s"    | ]\}}| d |V  qdS )=Nr   )r   krZ  r   r   r   r     s     z%InputWriter.tensor.<locals>.<genexpr>zrequires_grad=zis_leaf=zreader.tensor(rW  )  # )r"  r3  rv   r  r  ru   r  rD  strtupler0  r7  r4  rr   rB  get_tensor_metadatarP  rl   r9  r   r?  r@  rA  r8  rK  r5   )r1   r   rF  r"  r   tensor_metadatar5  r   r   r   r%    s2   zInputWriter.tensorc                 C   s0   t |tjr
|jj}| jd|d|  d S )Nzreader.symint(r^  )r   rr   SymIntr  hintrK  rD  )r1   r   rG  r   r   r   r'    s   zInputWriter.symint)r  N)	rH   rI   rJ   r4   rR  r_  r"  r%  r'  r   r   r   r   rH  Q  s    
rH  r   funcr  
sym_shapesdefault_sym_shapec                    s~  ddl m} dd | D }d| }t| }d| d}d| d	}	d
}
G dd d}i }p5i  fdddtffdd}| j}| D ]:\}}|dkrWqNt	
|	|}|rw| \}}t|d}|| }|||||< t	
|
|}|r|d||< qNdt| jv r| }||d< t	||D ]}| \}}}}t|d}|| }t||||| q|S )a  
    Takes in a function which has been printed with print_readable() and constructs kwargs to run it.

    Handles Tensor inputs, Symints, and a graph module which might have tensor constants.

    Consider a function `forward` defined as follows:

    def forward(self, primals_1: "f32[1001, 6]", primals_2: "f32[s0]", primals_3: "Sym(s0)",):
        _tensor_constant0: "i64[4190]" = self._tensor_constant0
        # Further implementation

    kwargs = aot_graph_input_parser(forward)
    forward(**kwargs)
    r   )dtype_abbrsc                 S   s   i | ]\}}||qS r   r   )r   keyvaluer   r   r   
<dictcomp>  s    z*aot_graph_input_parser.<locals>.<dictcomp>|z(_tensor_constant\d+): \"(z0)\[\s*(.*?)\s*\]\" = self\.(_tensor_constant\d+)(z)\[\s*(.*?)\s*\]zSym\((s\d+)\)c                   @   s   e Zd ZdZdS )z/aot_graph_input_parser.<locals>.TensorContainerz#Container for tensors as attributesN)rH   rI   rJ   __doc__r   r   r   r   TensorContainer  s    ro  c                    s,   t  v p	d u fdd  S )Nc                      s
     dS )Nz; not in symbolic_shapes and default sym shape not passed inr   r   r'  r   r   r    s   
 z=aot_graph_input_parser.<locals>.get_sym_int.<locals>.<lambda>)rr   _checkr   rp  )rg  rf  rp  r   get_sym_int  s
   
z+aot_graph_input_parser.<locals>.get_sym_intr  c           
         s   g }g }t | D ]"\}}| }d|v r#|}|| || q|t| q|jr1tjntj}||| d}|D ]	}	tj	||	 q=|S )Nr   )rv   r  )
	enumeratestriprD  intrs   rr   randnzerosr   mark_dynamic)
ru   rv   resolved_shapedynamic_dimsr   dimr   constructorr   r  )r  rr  r   r   
gen_tensor  s   
z*aot_graph_input_parser.<locals>.gen_tensor,r   r1   )torch.fx.graphrh  rl   r5   valuesinspect	getsourcer
   __annotations__researchgroupsr`  r)   group	signatureri   finditersetattr)re  r  rf  rg  rh  	dtype_mapdtype_patternsourcetensor_assignment_regextensor_regexsym_shape_regexro  r   r}  annotationsr   
annotationmatch	data_type	shape_strru   rv   	container	attr_namer^   r   )rg  r  rr  rf  r   aot_graph_input_parser  sF   
r  )FF)F)r   NN)\r   	functoolsrO   r  rL  loggingr'   r  r   rM   r7   collectionsr   	importlibr   typingr   r   r   r   r   r	   rr   torch._prims_common_prims_commonr   torch._subclasses.meta_utilsr
   torch._dynamo.testingr   r    torch.multiprocessing.reductionsr   torch.utils._content_storer   r   r   r   r   r   	getLoggerrH   rB   r   inductor_config	is_fbcoder   libfb.py.build_infolibfbr6   extra_importspy
build_info	BuildInfoget_build_ruler-   r9   r5   rA   r"   rS   rn   rU   	lru_cacher   r   r   r   r   r   r   r   r   r  r  r   r  r  r  float32r0  r  r/  r7  r9  r8  r  r)  rH  r_  ru  r  r   r   r   r   <module>   s    
6	d

8)
 
T[
