o
    ei?                     @  sL  d Z ddlm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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$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+ ddlm,Z,m-Z-m.Z. erddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 e
6e7Z8edZ9edZ:e:; Z<e<rddl=Z>g Z?dZ@dZAe<rg dZ?e>jBjCjDE FddZAdGdd e?D Z@g dZHG dd dZId{d!d"ZJd#ZKG d$d% d%ZLejMd{d&d'ZNd(d)d|d,d-ZOd(d)d|d.d/ZPd{d0d1ZQd}d4d5ZRG d6d7 d7eSZTd~d;d<ZU	(	(dddCdDZV	(dd(d(dEddIdJZWddLdMZXddRdSZYddTdUZZ	(dd(d(dEddXdYZ[dd_d`Z\ddcddZ]e]ej^Z_e]e`deZae]dZbe]d(Zce]d(ZdG dfdg dgZeG dhdi diZfG djdk dkZg	l		dddudvZhddydzZidS )a  
Debug utilities for TorchDynamo compilation and execution.

This module provides various debugging tools and utilities for TorchDynamo, including:

- Minification support for reducing test cases while preserving bugs
- Input/output handling via InputReader and InputWriter for reproducible testing
- Accuracy checking between original and compiled models
- Neural network module string conversion via NNModuleToString
- Profiling tools and system information collection
- Buck build system integration for Meta-internal testing

Key classes:
- InputReader/InputWriter: Handle serialization of model inputs/outputs
- NNModuleToString: Converts nn.Modules to string representations
- BuckTargetWriter: Manages Buck build system integration
    )annotationsN)Counter)import_module)AnyOptionalTYPE_CHECKINGTypeVar)Tensor)rand_strided)normalize_path_separator)is_float_dtype)StorageWeakRef)ContentStoreReaderContentStoreWriter   )config)clone_inputsget_debug_dir	warn_once)CallableSequence)tqdm)UntypedStorage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   c/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/_dynamo/debug_utils.py
<listcomp>T       r#   )buck2runz@mode/dev-nosanc                   @  s,   e Zd ZdddZdddZddddZdS )BuckTargetWriterfilenamestrreturnNonec                 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)selfr(   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#   j   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:libtorch",
        "//caffe2/functorch:functorch",
        "//triton:triton",
        "z",
    ],
    cpp_deps = [
z
    ],
    main_module = "z",
    par_style = "xar",
)
)join
extra_depstextwrapdedentr7   r5   
cur_targetr1   )r:   extra_cpp_depsr   r   r"   buildi   s   zBuckTargetWriter.buildT	print_msgbool	list[str]c                 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 )r0   r1   r=   r4   openwriterC   BUCK_CMD_PREFIXr9   logwarning)r:   rD   target_filefd	cmd_splitr   r   r"   rK      s   zBuckTargetWriter.writeN)r(   r)   r*   r+   r*   r)   )T)rD   rE   r*   rF   )__name__
__module____qualname__r<   rC   rK   r   r   r   r"   r'   Z   s    

r'   r*   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)
r0   r1   r=   r   tempfile
gettempdirgetpassgetuserexistsmakedirs)r1   r   r   r"   minifier_dir   s   r^      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dZeddd	Zd
S )NNModuleToStringgmtorch.fx.GraphModuler*   rE   c                 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typer`   
safe_reprsaddlenrM   rN   )ra   cant_convert_moduler   r   r"   can_convert_to_string   s   
z&NNModuleToString.can_convert_to_stringr)   c                 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) -> None:
                    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))r_   )torch.nn.modules.modulerm   r?   r@   rd   __repr__next
parametersis_cuda_buffersitemsnumelMAX_CONSTANT_NUMEL_INLINEtorch._tensor_strrp   	thresholdreprtorchis_floating_pointlistshapedtype_parameterscode)ra   rm   tab	model_strmodule_namerk   
module_strexample_parambuffer_namebufferrp   
tensor_str
param_nameparammaybe_devicer   r   r"   convert   sJ   	

 


 	zNNModuleToString.convertN)ra   rb   r*   rE   )ra   rb   r*   r)   )rS   rT   rU   r~   nnLinearConv1dConv2dConv3dBatchNorm1dBatchNorm2dBatchNorm3d	LayerNormDropoutSoftmaxReLUGELUIdentity	MaxPool2d	EmbeddingTanhConvTranspose1dGLULSTMFlattenAdaptiveAvgPool2drf   staticmethodrl   r   r   r   r   r"   r`      s6    r`   c               	   C  s   t j sdS d} z,t jjd u r0tddg}| d}d	dd |D }| | d7 } n| d	7 } W n t
tjfyE   | d
7 } Y nw 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: 
nvccz	--versionr   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'# Not searching for nvcc on ROCM setup
z# nvcc not found
c                 s  s    | ]	}t j|V  qd S N)r~   cudaget_device_name)r    ir   r   r"   	<genexpr>  s    
z,_cuda_system_info_comment.<locals>.<genexpr>z# GPU Hardware Info: 
r   z : r   )r~   r   is_availableversionhip
subprocesscheck_outputdecoder2   r=   FileNotFoundErrorCalledProcessErrorr   rangedevice_countrx   )r   cuda_version_outcuda_version_linescomment	gpu_namesnamecountr   r   r"   _cuda_system_info_comment  s,   
r   F)stable_outputr   rE   c                   sZ   | rdS g d g dd fdd	fd
dt j D }d|}td| dS )zl
    Generate a string configuration for environment variables related to Dynamo, Inductor, and Triton.
    z+# env var omitted due to stable_output=True)TORCHDYNAMOINDUCTORTRITON)TRITON_LIBDEVICE_PATHTRITON_PTXAS_PATHTRITON_LIBCUDA_PATHkeyr)   r*   rE   c                   s   t  fddD o vS )Nc                 3  s    | ]}| v V  qd S r   r   )r    stringr   r   r"   r   *  s    z;generate_env_vars_string.<locals>.filter.<locals>.<genexpr>)anyr   )
allow_list	skip_listr   r"   filter)  s   z(generate_env_vars_string.<locals>.filterc              	     s2   g | ]\}} |rd | d| dd dqS )zos.environ['z'] = ''")r6   r    r   value)r   r   r"   r#   ,  s    z,generate_env_vars_string.<locals>.<listcomp>r   z
import os
z
    N)r   r)   r*   rE   )r0   environrx   r=   r   )r   config_linesconfig_stringr   )r   r   r   r"   generate_env_vars_string  s   


r   c              	   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   r~   experimental_configr   r   r"   generate_config_string8  s   


r   c                   C  s   t jt dS )Nzminifier_launcher.py)r0   r1   r=   r^   r   r   r   r"   get_minifier_repro_pathL  s   r   contentsr+   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yI } ztd t	d| |d }~ww )NzWriting minified repro to:
%srH   r   zCould not write to )
r   rM   rN   use_buckr'   rK   rJ   OSError	exceptionNotImplementedError)r   minified_repro_pathrP   er   r   r"   helper_for_dump_minifyP  s   &
r   c                   @  s   e Zd ZdS )AccuracyErrorN)rS   rT   rU   r   r   r   r"   r   _  s    r   example_inputsSequence[Any]	list[Any]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   rh   
isinstancer~   r	   requires_grad_requires_grad)r   cloned_inputsidxr   r   r"   clone_inputs_retaining_gradnessc  s   r   ra   rb   argsonly_fwddisable_cloner   c           	      C  s   ddl m}m}m} t| } |st|}t| dr| d t	| ddr)| |n| | }|r1|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_callFN)testingr   r   r   copydeepcopyr   hasattrr   getattrbackward)	ra   r   r   r   r   r   r   outlossr   r   r"   run_fwd_maybe_bwdp  s   


r  require_fp64ignore_non_fpopt_gmr	  r
  c                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	yQ   td Y dS 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   )sameNzfCould not generate fp64 outputs, workaround with torch._dynamo.config.same_two_models_use_fp64 = Falsez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RuntimeErrorrM   rN   r   repro_tolerance)ra   r  r   r   r	  r
  r  reffp64_ref
fp64_modelfp64_examplesrespassingr   r   r"   same_two_models  sB   
r  modelc                 C  s   | j jD ]Q}|jdkr5|jtjjjju 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_functionro   r   r   r   )graphnodesopr7   r~   opsprimsconvert_element_typedefaultrh   r   r   float64kwargsgetdictlint	recompile)r  noder   
new_kwargsr   r   r"   cast_dtype_args_to_fp64  s    




r-  r   torch.dtypeinputs&tuple[torch.fx.GraphModule, list[Any]]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   r~   r	   r   tor!   r   r   r"   <lambda>  s
   
zcast_to.<locals>.<lambda>)torch.utils._pytreer1  r2  r~   r%  r-  )r   r  r/  r1  r   r4  r"   cast_to  s   


r7  c                 C  s   t tj| |S r   )r7  r~   r%  )r  r/  r   r   r"   r    s   r  compiler_fnACallable[[torch.fx.GraphModule, list[Any]], torch.fx.GraphModule]c                C  sL   z|t | t|}t| |||||d W S  ty%   td Y dS 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  rM   r   )ra   r   r8  r   r	  r
  compiled_gmr   r   r"   backend_accuracy_fails  s$   	
r;  stride(Optional[torch._prims_common.StrideType]r   torch._prims_common.ShapeTypetorch._prims_common.StrideTypec                C  s   | d ur| S t |S r   )r  make_contiguous_strides_for)r<  r   r   r   r"   _stride_or_default"  s   rA  dCallable[[Optional[T]], T]c                   s    fddS )Nc                   s   | d ur| S  S r   r   r3  rB  r   r"   r5  +  s    z_mk_defaulter.<locals>.<lambda>r   rD  r   rD  r"   _mk_defaulter*  s   rE  cpuc                   @  s<   e Zd ZdddZddddddZdddZdddZdS )NopInputReaderr*   r+   c                 C  s
   d| _ d S )Nr   total)r:   r   r   r"   r<   6  s   
zNopInputReader.__init__Ndevice
dtype_hintstorage_hashOptional[str]nbytesintrK  ,Optional[torch._prims_common.DeviceLikeType]rL  Optional[torch.dtype]c                C  s   |  j d7  _ d S )Nr   rH  )r:   rM  rO  rK  rL  r   r   r"   storage9  s   zNopInputReader.storager   r   r&  Optional[torch.Tensor]c                 O     d S r   r   r:   r   r&  r   r   r"   tensorC     zNopInputReader.tensorOptional[int]c                 O  rU  r   r   rV  r   r   r"   symintF  rX  zNopInputReader.symintr*   r+   )
rM  rN  rO  rP  rK  rQ  rL  rR  r*   r+   )r   r   r&  r   r*   rT  )r   r   r&  r   r*   rY  rS   rT   rU   r<   rS  rW  rZ  r   r   r   r"   rG  5  s    


rG  c                   @  sV   e Zd Z	d+ddd,d	d
Zdddd-ddZ	d+dddddd.d&d'Zd/d)d*ZdS )0InputReaderN)pbarsave_dir
str | Noner^  tqdm | Noner*   r+   c                C  s8   |d u r	t d |d urt|nd | _g | _|| _d S )Nz0no save_dir specified, will generate random data)rM   rN   r   storer   r^  )r:   r_  r^  r   r   r"   r<   M  s
   

zInputReader.__init__rJ  rM  rN  rO  rP  rK  rQ  rL  rR  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| d ||j f}td |d}t|||| S )Nr   zdevice mismatch: %s != %szcould not load z , generating random data insteadr   )r^  update_device_or_default_dtype_or_defaultrb  read_storager   rK  rM   rN   r   itemsizerA  r
   untyped_storage)r:   rM  rO  rK  rL  rS  r   r<  r   r   r"   rS  Z  s"   

zInputReader.storage)storage_offsetr   r   is_leafrS  r   r>  r<  r=  rj  rY  r   r   Optional[bool]rk  metadatar   torch.Tensorc          
      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 )Nrc  )r   rK  r   )memory_format)rA  _storage_offset_or_defaultrf  _is_leaf_or_default_requires_grad_or_defaultr~   rW  rK  no_gradset_enable_gradclonepreserve_format_subclasses
meta_utilssafe_is_leaf_utilsset_tensor_metadatar   append)
r:   rS  r   r<  rj  r   r   rk  rm  tr   r   r"   rW  w  s,   



zInputReader.tensorvalc                 C  s   | j | |S r   )r   r}  )r:   r  r   r   r"   rZ    s   zInputReader.symintr   )r_  r`  r^  ra  r*   r+   )
rM  rN  rO  rP  rK  rQ  rL  rR  r*   r   )rS  r   r   r>  r<  r=  rj  rY  r   rR  r   rl  rk  rl  rm  r   r*   rn  )r  r   r*   r   r\  r   r   r   r"   r]  L  s     !!r]  c                   @  s`   e Zd Zddd'd	d
Zd(ddZdddd)ddZd*ddZd+d d!Zd,d"d#Zd-d%d&Z	dS ).InputWriterFstable_hashr_  rN  r  rE   r*   r+   c                C  s:   g | _ t | _|| _|d urt||dnd | _i | _d S )Nr  )_lines	itertoolsr   storage_counterr_  r   rb  seen_storages)r:   r_  r  r   r   r"   r<     s   

zInputWriter.__init__rF   c                 C  s*   dg}| dd | jD  |d |S )Nzdef load_args(reader):c                 s  s    | ]}d | V  qdS )rn   Nr   )r    lr   r   r"   r     s    z$InputWriter.lines.<locals>.<genexpr>zload_args._version = 0)extendr  r}  )r:   rr   r   r"   lines  s
   
zInputWriter.linesN)device_hintrL  ri  r   r  rQ  rL  rR  r)   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(, rq   )r   r  r'  rt   r  rf  rK  re   re  rO  rb  write_storager  r}  )r:   ri  r  rL  wsvmaybe_dtype_hintr   rK  rO  rM  r   r   r"   rS    s0   



zInputWriter.storager   r~  rn  c           	   	   C  sN  ddl m}m} | j| |j|jd}g }||td |jd|	 s/|
tt|	  td |jkr?|
d|j |td | ksS|
d|  tj|}|rg|dd | D  td |jkrw|
d	|j tjj|}td |kr|
d
| | j
dd|tt|jg| d|   d S )Nr   )statically_known_truesym_eq)rL  r  rc  zdtype=zstorage_offset=c                 s  s"    | ]\}}| d |V  qdS )=Nr   )r    kr  r   r   r"   r     s     z%InputWriter.tensor.<locals>.<genexpr>zrequires_grad=zis_leaf=zreader.tensor(r  )  # )%torch.fx.experimental.symbolic_shapesr  r  rS  ri  r   rK  rA  r   r<  r}  r)   tuplerf  rp  rj  r~   r{  get_tensor_metadatar  rx   rr  r   rx  ry  rz  rq  r  r=   )	r:   r   r~  r  r  rS  r   tensor_metadatark  r   r   r"   rW    s<   zInputWriter.tensorargr   c                 C  s   | j d| dt|  t|ttfrV| j d t|D ].\}}| d| d}t|tjr8| 	|| qt|t
tjfrG| || q| || q| j d d S d S )Nr   z# was unsupported type for dumping: z"""[])r  r}  re   r   r   r  	enumerater~   r	   rW  rP  SymIntrZ  unsupported)r:   r   r  r   aname_ir   r   r"   r    s   zInputWriter.unsupportedc                 C  s   | j d|d| d d S )Nzreader.const(r  z!, filtered out during compilation)r  r}  )r:   r   r   r   r"   const  s   zInputWriter.constr  c                 C  s0   t |tjr
|jj}| jd|d|  d S )Nzreader.symint(r  )r   r~   r  r+  hintr  r}  )r:   r   r  r   r   r"   rZ    s   zInputWriter.symint)r_  rN  r  rE   r*   r+   )r*   rF   )ri  r   r  rQ  rL  rR  r*   r)   )r   r)   r~  rn  r*   r+   )r   r)   r  r   r*   r+   )r   r)   r*   r+   )r   r)   r  r   r*   r+   )
rS   rT   rU   r<   r  rS  rW  r  r  rZ  r   r   r   r"   r    s    

"
 
r  r   func&Callable[[list[Tensor]], list[Tensor]]rK  
sym_shapesOptional[dict[str, int]]default_sym_shaperY  dict[str, Any]c                   s|  ddl m} dd | D }d| }t| }d| d}d| d	}	d
}
G dd d}i }|p5i d fdddfdd}| j}| D ]:\}}|dkrVqMt	|	|}|rv|
 \}}t|d}|| }|||||< t	|
|}|r|d||< qMd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   r   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)rS   rT   rU   __doc__r   r   r   r"   TensorContainerI  s    r  rZ  r)   r*   rP  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   rZ  r   r"   r5  T  s   
 z=aot_graph_input_parser.<locals>.get_sym_int.<locals>.<lambda>)r~   _checkr'  r  )r  sym_shapes_dictr  r"   get_sym_intQ  s
   
z+aot_graph_input_parser.<locals>.get_sym_intr   r>  r   r.  r	   c           
        s   g }g }t | D ]$\}}| }d|v r#|}|| || q|r,|t| q|jr3tjntj}||| d}|D ]	}	tj	||	 q?|S )Nr   )r   rK  )
r  stripr}  rP  r   r~   randnzerosr   mark_dynamic)
r   r   resolved_shapedynamic_dimsr   dimr   constructorr  rB  )rK  r  r   r"   
gen_tensorX  s    
z*aot_graph_input_parser.<locals>.gen_tensor,r   r:   N)rZ  r)   r*   rP  )r   r>  r   r.  r*   r	   )torch.utils._dtype_abbrsr  rx   r=   valuesinspect	getsource__annotations__researchgroupsr  r2   group	signatureru   finditersetattr)r  rK  r  r  r  	dtype_mapdtype_patternsourcetensor_assignment_regextensor_regexsym_shape_regexr  r&  r  r   r   
annotationmatch	data_type	shape_strr   r   	container	attr_namerj   r   )r  rK  r  r  r"   aot_graph_input_parser%  sJ   
r  r(   Callable[[T], T]c                   sH   t  tjtj  d
fdd}d fdd}t| |S )z
    Decorator to cProfile a given function and save the result to disk on process exit.

    Args:
        filename: filename to save profile to
    fnr   r*   c                   s   t  d fdd}|S )Nr   r   r&  r*   c                    s,      z | i |W   S   w r   )enabledisable)r   r&  )r  profr   r"   wrapper  s   z3profile_to_file.<locals>.decorator.<locals>.wrapper)r   r   r&  r   r*   r   )	functoolswraps)r  r  )r  )r  r"   	decorator  s   z"profile_to_file.<locals>.decoratorr+   c                	     s.      tjtd  d  d d S )Nz!                Wrote profile to z+, view with:

                    snakeviz z

                )
dump_statssysstderrrK   r?   r@   r   r(   r  r   r"   save_it  s   
z profile_to_file.<locals>.save_itN)r  r   r*   r   r[  )cProfileProfiler0   r1   r3   
expanduseratexitregister)r(   r  r  r   r  r"   profile_to_file  s   
r  rR   )r   rE   r*   r)   )r   r)   r*   r+   )r   r   r*   r   )FF)
ra   rb   r   r   r   rE   r   rE   r*   r   )F)ra   rb   r  rb   r   r   r   rE   r	  rE   r
  rE   r*   rE   )r  rb   r*   rb   )r   r.  r  rb   r/  r   r*   r0  )r  rb   r/  r   r*   r0  )ra   rb   r   r   r8  r9  r   rE   r	  rE   r
  rE   r*   rE   )r<  r=  r   r>  r*   r?  )rB  r   r*   rC  )r   NN)
r  r  rK  r)   r  r  r  rY  r*   r  )r(   r)   r*   r  )jr  
__future__r   r  r   r  r  rZ   r  r  loggingr0   r  r   r  rX   r?   collectionsr   	importlibr   typingr   r   r   r   r~   torch._prims_common_prims_commonr  torch._subclasses.meta_utilsr	   torch._dynamo.testingr
   torch._inductor.cpp_builderr   r    torch.multiprocessing.reductionsr   torch.utils._content_storer   r   r   r   r   r   r   collections.abcr   r   	torch.hubr   torch.storager   	getLoggerrS   rM   r   inductor_config	is_fbcoder   libfb.py.build_infolibfbr>   extra_importsrA   py
build_info	BuildInfoget_build_ruler6   r=   rL   r'   r^   rz   r`   cacher   r   r   r   r   r  r   r   r  r  r-  r7  r  r;  rA  rE  float32rf  rK  re  rp  rr  rq  rG  r]  r  r  r  r   r   r   r"   <module>   s    

7	f


$
:



)

]~g