o
    پiB*                     @   s
  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Zd dlZd dlmZmZ d dlmZ dd Zd	d
 ZdedefddZ				d;deded fddZ	d<defddZdejdefddZdd ZdejfddZ dejd ejfd!d"Z!d#d$ Z"d%d& Z#eG d'd( d(Z$dee	e%e$f  fd)d*Z&eG d+d dZ'de
e' fd,d-Z(e)d.kre * Z+e+j,d/ed0 e+j,d1ed0 e+j,d2e%d d3 e+j,d4e%d5d3 e+j,d6e%d d3 e+j,d7edd3 e+j,d8edd9d: e+- Z.ee. dS dS )=    N)	dataclass)Path)CallableDictListOptional)find_row	read_meta)get_truncated_valuec                    s  t | j  td| jktd| jk@  | jr( tdj| j t	 fdddD s5J t | j
}td  td| t }t } jdd	D ]t| jd  }|d urr|d }|d u rkqP|j}|j}nd | j | j }d }d }|d urfd
d|D }	|	r|	d }t|tdd|idd  D d}
|
d u rtdt| d t|}|d urtdt|  qPt| j
|
d  }tdt| dd  dt| d|
d  d	 t||| jd ||d t  qPd S )Nforward_pass_idfilenamec                 3   s    | ]}| j v V  qd S N)columns).0c)	df_target Z/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/debug_utils/dump_comparator.py	<genexpr>   s
    
zmain.<locals>.<genexpr>)rankr   
dump_indexnamer   df_baselineT)namedc                    s(   g | ]}t |d   d dur|qS )patternr   N)research)r   desc)rowr   r   
<listcomp>5   s
    zmain.<locals>.<listcomp>r   c                 S   s   i | ]\}}|d vr||qS ))r   r   r   r   )r   kvr   r   r   
<dictcomp>A   s
    zmain.<locals>.<dictcomp>)
conditionszSkip: target=z since no baselinex_target(sample)=zCheck:
target=z (duplicate_index=duplicate_indexz)
baseline=)r   )path_baselinepath_targetdiff_thresholdr   baseline_token_slicetensor_dim_descr   )r	   target_pathfilterplcolstart_idend_idstrcontainsallbaseline_pathprint$_get_location_info_of_target_pass_id_get_tensor_dim_descs	iter_rowsr   getbaseline_forward_pass_idr*   baseline_start_idr   dictitems_load_objectr
   check_tensor_pairr)   )argsr   location_info_of_target_pass_idtensor_dim_descsr(   location_infor;   r*   r+   tensor_dim_descs_filteredrow_baselinex_targetr'   r   )r   r   r   main   s   




rH   c                 C   s   t d| S )Nz\([^()]*\)|\S+)r   findall)r   r   r   r   _split_einops_patterna   s   rJ   r   dim_namec                 C   s   t | }||S r   )rJ   index)r   rK   pattern_listr   r   r   _get_einops_dim_indexe   s   
rN   MbP? r)   r+   TensorDimDescc                 C   s  t | }t |}|d u s|d u rtd| d|  d S td|j d|j d|j|jkr.dnd d|j d|j 
 |d urs| }d urXt|jd	}	|j|	|j|j|j d
}t	
||jd |j }|j }
d urstd |
|}t|||d\}}t||jd}td|j d|j d|j d|j  |j}|j}| }| }dtjfdtjfdtjfdtjfg| dk rdtjtjddfdtjtjddfdtjtjddfdtjtjddfgng D ]&\}}|| }|| }td| d |d!d|d!d"|| d!d#	 q|j|jkrtd$ d S t|||d%}|d& d'k}||krGt|| }d urGt|||||d(| d)d* |r^td+t|  td,t|  d S d S )-Nz,Skip comparison because of None: x_baseline=z, x_target=zRaw [shape] z vs z	[rP   u   🟠zdtype] 
num_tokens)dimstartlength -> zApply baseline_cropper)r   )target_shapezAfter preprocessor [shape] z		[dtype] meanstdminmaxi p1g{Gz?)qp5g?p95gffffff?p99gGz?[z] z.4fz (diff: r&   u   ⚠️ Shape mismatch)
x_baselinerG   r)   max_abs_diffrO   zWhen downcast to z: )rb   rG   r)   prefix_textzx_baseline(sample)=r$   )r?   r6   shapedtyperN   baseline_descnarrowrT   stopeinops	rearrangetarget_descbaseline_cropper_comparison_preprocessor_try_unify_shapefloattorchrX   rY   rZ   r[   numel	functoolspartialquantileitem_compute_and_print_diff_compute_smaller_dtypetor
   )r'   r(   r)   r   r*   r+   rb   rG   srS   fx_baseline_original_dtypex_target_original_dtypefnvalue_baselinevalue_target	diff_infoneeds_printdowncast_dtyper   r   r   r@   j   s   &

r@   c           	   	      s   ||    }|  }|  }t|| }t|d fddd|fd|fd|ffD   t|}td| d| |   d	||    t|d
S )N	c                 3   s4    | ]\}}| krd nd d| d| V  qdS )u   ❌u   ✅ =Nr   )r   r   valuer)   r   r   r      s
    
z*_compute_and_print_diff.<locals>.<genexpr>rel_diffrc   mean_abs_diffzmax_abs_diff happens at coord=z with baseline=z target=)rc   )	absr[   rv   rX   _calc_rel_diffr6   join_argmax_coordr=   )	rb   rG   r)   rd   raw_abs_diffrc   r   r   max_diff_coordr   r   r   rw      s.   



rw   xreturnc                 C   s$   |   }tdd t|| jD S )Nc                 s   s    | ]}|  V  qd S r   )rv   )r   idxr   r   r   r      s    z _argmax_coord.<locals>.<genexpr>)argmaxtuplerq   unravel_indexre   )r   flat_idxr   r   r   r      s   r   c                 C   s.   t jt jft ji}|| |fp||| fS r   )rq   float32bfloat16r:   )dtype_adtype_b	info_dictr   r   r   rx      s   rx   c                 C   s|   | j }t|t| }||d  |kr<tdd |d | D r<tdd t|| }td| d|j  d| d |S | S )	Nc                 s   s    | ]}|d kV  qdS )   Nr   )r   valr   r   r   r     s    
z#_try_unify_shape.<locals>.<genexpr>c                 S   s
   |  dS )Nr   )squeeze)a_r   r   r   <lambda>  s   
 z"_try_unify_shape.<locals>.<lambda>zUnify shape: rV   z (to match r&   )re   lenr4   rs   reduceranger6   )r   rW   x_shapenum_dim_to_removeoutr   r   r   ro      s   
ro   yc                 C   sB   |   |  } }| |  ||   }d| |   | }d| S )N   r   )doublesum)r   r   denominatorsimr   r   r   r     s   r   c              
   C   s   z	t j| dd}W n ty& } ztd|  d|  W Y d }~d S d }~ww t|tr4d|v r4|d }t|t jsLtd|  dt|d|d d S | S )	NF)weights_onlyz
Skip load z since error r   z since type(x)=z is not a Tensor (x=r&   )	rq   load	Exceptionr6   
isinstancer=   Tensortypecuda)pathr   er   r   r   r?     s    r?   c                 C   s   | |fS )zMCustomization endpoint. Can insert arbitrary adhoc postprocessing logic here.r   )rb   rG   r   r   r   r   rn   %  s   rn   c                   @   s   e Zd ZU eed< eed< dS )LocationInfor;   r*   N)__name__
__module____qualname__int__annotations__slicer   r   r   r   r   *  s   
 r   c                   C   s   dS )Customization endpoint.Nr   r   r   r   r   r7   0     r7   c                   @   s8   e Zd ZU eed< eed< eeejgejf  ed< dS )rQ   rg   rl   rm   N)	r   r   r   r2   r   r   r   rq   r   r   r   r   r   rQ   5  s   
 c                   C   s   g S )r   r   r   r   r   r   r8   <  r   r8   __main__z--baseline-path)r   z--target-pathz
--start-id)r   defaultz--end-idi@B z--baseline-start-idz--diff-thresholdz--filterzRegex to filter filenames)r   r   help)rO   rP   NN)rP   )/argparsers   r   dataclassesr   pathlibr   typingr   r   r   r   rj   polarsr.   rq   "sglang.srt.debug_utils.dump_loaderr   r	   sglang.srt.debug_utils.dumperr
   rH   rJ   r2   rN   rp   r@   rw   r   r   r   rx   ro   r   r?   rn   r   r   r7   rQ   r8   r   ArgumentParserparseradd_argument
parse_argsrA   r   r   r   r   <module>   sj    Q
j

