o
    pid                     @   s   d dl Z d dlZejfddZdddZG dd dZG d	d
 d
ZG dd dZdddZ	dddZ
dd Z		dddZdS )    Nc                 C   s&   t | g|}t |pt |S N)nparrayZastypeisinfisnan)valuedtyper    r	   b/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/paddle/amp/accuracy_compare.pyis_infinite   s   r   {Gz?c                 C   s"   t jt | gt |g||dS )N)atolrtol)r   Zallcloser   )actualexpectedr   r   r	   r	   r
   is_allclose   s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

TensorInfoc                 C   sF   d | _ d | _d | _d | _d | _d | _d | _d | _d | _d | _	d | _
d S r   )deviceop_typetensor_namer   numel	max_value	min_value
mean_valuehas_infhas_nannum_zeroselfr	   r	   r
   __init__#   s   
zTensorInfo.__init__c                 C   sb   d| j  d| j d| j d| j d| j d| j d| j d| j d	| jd
d| j	d
d| j
d
S )Nz[TensorInfo] device=z
, op_type=z, tensor_name=, dtype=, numel=z
, num_inf=z
, num_nan=z, num_zero=, max_value=.6f, min_value=, mean_value=)r   r   r   r   r   r   r   r   r   r   r   r   r	   r	   r
   __str__0   s   bzTensorInfo.__str__c                 C   s   | j d | j S )N/)r   r   r   r	   r	   r
   key3   s   zTensorInfo.keyc              
   C   s  z|  d}|D ]}|dddddd}|d}|d dkr+|d	 | _q
|d d
kr7|d	 | _q
|d dkrC|d	 | _q
|d dkrO|d	 | _q
|d dkr^t|d	 | _	q
|d dkrmt
|d	 | _q
|d dkr|t
|d	 | _q
|d dkrt
|d	 | _q
|d dkrt|d	 | _q
|d dkrt|d	 | _q
|d dkrt|d	 | _q
W | S  ty } ztd|  W Y d }~| S d }~ww )N [ ],=r   op   r   Ztensorr   r   maxminmeannum_infnum_nanr   z!! Error parsing )stripsplitreplacer   r   r   r   r   Zint64r   Zfloat32r   r   r   intr   r   r   	Exceptionprint)r   lineZ
line_fragsfragZword_strwordser	   r	   r
   init_from_string8   sH   
zTensorInfo.init_from_stringN)__name__
__module____qualname__r   r&   r(   r@   r	   r	   r	   r
   r   "   s
    r   c                   @   s8   e Zd Z	dddZdd Zdd Zd	d
 Zdd ZdS )MixedPrecisionTensorInfor         ?c                 C   s  d| _ || _d | _d | _d | _d | _d | _d | _d | _d | _	d | _
d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _|d urt|j| _|j| _|j| _|j| _|j| _|j| _|j| _|j| _d| jv rt||j | _||j | _	|d ur|j| _|j| _|j| _|j| _
|j| _|j| _|j| _|j| _|j| _|j| _|d ur|d ur|j|jksJ |j|jksJ d| d| | | j| j| _| | j| j| _| | j| j| _|    d S )NTZGRADzError:
	FP32 Tensor Info:z
	FP16 Tensor Info:)!	is_normalfp32_idxfp32_tensor_name
fp32_dtypefp32_max_valuefp32_min_valuefp32_mean_valuefp32_num_zeroscaled_fp32_max_valuescaled_fp32_min_valuefp16_tensor_name
fp16_dtypefp16_max_valuefp16_min_valuefp16_mean_valueZfp16_num_zerofp16_has_inffp16_has_nanfp32_div_fp16_max_valuefp32_div_fp16_min_valuefp32_div_fp16_mean_valuer   r   r   r   r   r   r   r   r   r   _div_check_normal)r   fp32_tensor_infofp16_tensor_inforG   
grad_scaler	   r	   r
   r   \   sz   
z!MixedPrecisionTensorInfo.__init__c                 C   s   dd }d| j  d| j }|d| j d| j d|| j d|| j d	|| j 
7 }|d
| j d| j d|| j	 d|| j
 d	|| j d| j d| j 7 }|S )Nc                 S   s   | d ur| dS | S )Nr#   r	   )r   r	   r	   r
   
_float_str   s   z4MixedPrecisionTensorInfo.__str__.<locals>._float_strz#[MixedPrecisionTensorInfo] op_type=r!   z
  FP32: tensor_name=r    r"   r$   r%   z
  FP16: tensor_name=z
, has_inf=z
, has_nan=)r   r   rH   rI   rJ   rK   rL   rP   rQ   rR   rS   rT   rU   rV   )r   r_   Z	debug_strr	   r	   r
   r&      s
   <Lz MixedPrecisionTensorInfo.__str__c                 C   s(   |d ur|d ur|dkr|| S dS d S )Nr   r0   r	   )r   abr	   r	   r
   rZ      s   zMixedPrecisionTensorInfo._divc                 C   sJ   | j d u r| jS | jd u r| j d t| j S | jddd t| j S )N#
.cast_fp16z/.cast_fp16/)rH   rP   strrG   r8   r   r	   r	   r
   get_tensor_name   s   

z(MixedPrecisionTensorInfo.get_tensor_namec                 C   s  | j d ur| j ttjjkrd| _d S | j| j| j| j	| j
| jg}|D ]}|d ur4t|r4d| _ d S q$| jd urB| jrBd| _d S | jd urO| jrOd| _d S | jd ure| j
d uret| j
| jsed| _d S | j	d ur{| jd ur}t| j| j	sd| _d S d S d S d S )NF)r   r   iinfoint32r1   rF   rJ   rK   rN   rO   rR   rS   r   rU   rV   r   )r   Z
check_listr   r	   r	   r
   r[      sF   	



z&MixedPrecisionTensorInfo._check_normalN)r   rE   )rA   rB   rC   r   r&   rZ   re   r[   r	   r	   r	   r
   rD   [   s    
L	rD   c                   @   sd   e Zd Zdd Zdd Zdd Zdd Z		dd
dZ		dddZdd Z	dd Z
dd Zdd ZdS )ExcelWriterc                 C   s   || _ || _zdd l}W n ty   td Y nw ||| _| jdddddd| _| jdd	d
| _	| jddd
| _
| jddd
| _| jddd
| _d S )Nr   zRimport xlsxwriter failed. please run 'pip install xlsxwriter==3.0.9' to install itTr0   blackz#6495EDcenter)boldborderZ
font_colorbg_coloralignz#F5F5F5)rk   rm   redyellowZorange)log_fp32_dirlog_fp16_dirZ
xlsxwriterImportErrorr;   ZWorkbookworkbookZ
add_formattitle_formattensor_name_formatred_bg_cell_formatyellow_bg_cell_formatorange_bg_cell_format)r   rq   rr   Zoutput_pathZxlwr	   r	   r
   r      s<   	
zExcelWriter.__init__c                 C   s   | j   d | _ d S r   )rt   closer   r	   r	   r
   rz     s   

zExcelWriter.closec                 C   J   |d u r| ||d d S |dkr| |||| j d S | ||| d S )N--Zfp16)writerx   r   	worksheetr   rowcolr	   r	   r
   _write_dtype  
   zExcelWriter._write_dtypec                 C   s@   |  }|jd ur|jr||||| j d S |||| d S r   )re   rH   rP   r}   rv   )r   r   mp_tensor_infor   r   r   r	   r	   r
   _write_tensor_name"  s   
zExcelWriter._write_tensor_nameTc                 C   sp   |d u r| ||d d S t|dk r|d}n|d}|r/t|tjr/| |||| j d S | ||| d S )Nr|   gh㈵>z.6Er#   )r}   absr   r   float16rw   r   r   r   r   r   Zcheck_finite	value_strr	   r	   r
   _write_maxmin_value,  s   
zExcelWriter._write_maxmin_valuec                 C   s4   |d u r| ||d d S |d}| ||| d S )Nr|   z>10d)r}   r   r	   r	   r
   _write_tensor_num_zero;  s   z"ExcelWriter._write_tensor_num_zeroc                 C   r{   )Nr|   r0   )r}   rw   r~   r	   r	   r
   _write_infinite_statusD  r   z"ExcelWriter._write_infinite_statusc                 C   sj   ddd}|d u r| ||d d S |d}||dds!|||r*| ||| d S | |||| j d S )Nr0   c                 S   s   | |d ko| |d k S )Ngffffff?g?r	   )r   scaler	   r	   r
   	_in_rangeN  s   z7ExcelWriter._write_fp32divfp16_value.<locals>._in_ranger|   r#   )r   )r0   )r}   ry   )r   r   r   r   r   
loss_scaler   r   r	   r	   r
   _write_fp32divfp16_valueM  s   
z$ExcelWriter._write_fp32divfp16_valuec                 C   sH  dddddddddddd}g d}| j d u r3|dd	| j |d
d| d| j |g d n<| jd u rL|dd| d| j |g d n#|dd	| j |dd| d| j |dd| j |g d tt|D ]}ttd| }|	|d | |||   qutt|D ]}|
|||| | j qd S )N   <   
         )r   r   r   r   infiniter   r   r   r   r4   r5   )r   r   r   r   zE1:H1Zfp32zI1:J1zfp32 (scale=))r   r   r   r   r   r   zE1:J1zfp16 (scale=)r   r   r   r   r   r4   r5   zI1:N1zO1:Q1zfp16 / fp32)r   r   r   r   r   r   r   r   r   r   r4   r5   r   r   r   A:)rr   Zmerge_rangeru   extendrq   rangelenchrordZ
set_columnr}   )r   r   r   r   Zcolumn_width_dictZtitle_namesr   Zcol_charr	   r	   r
   _write_titlesZ  sX   


zExcelWriter._write_titlesc           
      C   s  | j d usJ | j |}d}| ||| |d7 }g }|D ]A}|js/|j|vr/||j |r5|jr5q||d|j | |||d |jt	
t	jjkrZ||d|j| j n||d|j |jrm||dd n	||dd| j d}	| jd ur| ||j||	 | ||j||	d  | ||j||	d  | ||j||	d  | ||j||	d  |	d7 }	| jd u r| ||j||	 | ||j||	d  |	d7 }	| jd ur*| ||j||	 | ||j||	d  | ||j||	d  | ||j||	d  | ||j||	d  |	d7 }	| ||j ||	 | ||j!||	d  |	d7 }	| jd ur\| jd ur\| "||j#||	| | "||j$||	d | | "||j%||	d | |	d7 }	|d7 }qt&d	|  d S )
Nr0   r         01      z&-- OP Types produce infinite outputs: )'rt   add_worksheetr   rF   r   appendr}   r   r   r   rf   rg   r1   Zbad_value_formatrw   rq   r   rI   r   rJ   rK   rL   r   rM   rr   rN   rO   rQ   rR   rS   rT   r   rU   rV   r   rW   rX   rY   r;   )
r   mp_tensor_info_listZ	sheetnamer   Zskip_normal_tensorsr   r   Zinfinite_op_typestensor_infor   r	   r	   r
   r     s   







zExcelWriter.add_worksheetN)T)rA   rB   rC   r   rz   r   r   r   r   r   r   r   r   r	   r	   r	   r
   rh      s    "	

		Rrh   c                 C   s   g }t t| D ]C}|d dkr!td|ddt| dddd | | }d	|v rKt }|| |jd ur=|jd
kr=d}|d u sF|j|v rK|| q|S )Nr   r   -- Processing -8d / z lineendz[PRECISION]r+   T)r   r   r;   r   r@   r   r   r   )linesspecified_op_listtensor_info_listir<   r   has_tensor_namer	   r	   r
   parse_lines$  s&   




r   c                 C   s   | d u s|d u r
d S | d | }d }d}z(t |d}| }t||}W d    n1 s.w   Y  W ||fS W ||fS  tyO   td|d d |f Y S w )Nr'   Frz	the file zis not found)open	readlinesr   FileNotFoundErrorr;   )Zlog_dirfilenamer   Zcomplete_filenamer   r   fr   r	   r	   r
   	parse_log?  s"   r   c                 C   s  g }|d uri }i }| d ur-| D ]}|  }||d}|d ||< |||d t| < qi }	tt|D ]Q}
|
d dkrNtd|
ddt|ddd	d
 ||
 }|  dddd}|	|d}||d t| d }|d urz|d |	|< t||||}|| q5|S | d uri }tt| D ]9}
|
d dkrtd|
ddt| ddd	d
 | |
 }|  }||d}|d ||< t|d ||}|| q|S )Nr   r0   rb   r   r   r   r   z FP16 Tensor Infor   r   rc   r+   z
.cast_fp32z FP32 Tensor Info)	r(   getrd   r   r   r;   r8   rD   r   )fp32_tensor_info_listfp16_tensor_info_listr^   r   Zfp32_tensor_info_dictZfp32_write_countr   Ztensor_info_keycountZfp32_read_countr   r]   Zfp32_tensor_info_keyr\   r   Z
fp32_countr	   r	   r
   merge_tensor_info_listQ  sf   r   r0   Fc                 C   s  t | ||}|}g }t| }|D ]}	d|	v r||	 qtdt| d|  d|  t|D ]B}
td|  d|
  t| |
d \}}td| d|
  t||
d \}}td|
  t|||}td	|
  |	||
|d
 q0td|  t  |
  d S )NZworker_z-- There are z workerlogs under z: z&-- [Step 1/4] Parsing FP32 logs under r'   z&-- [Step 2/4] Parsing FP16 logs under z2-- [Step 3/4] Merge FP32 and FP16 tensor info for z?-- [Step 4/4] Add worksheet for mixed precision tensor info of Fz-- Write to )rh   oslistdirr   r;   r   sortedr   r   r   rz   )Z	dump_pathZanother_dump_pathZoutput_filenamer   Zdump_all_tensorsZexcel_writerr^   Zworkerlog_filenames	filenamesnamer   r   Zfp32_has_tensor_namer   Zfp16_has_tensor_namer   r	   r	   r
   compare_accuracy  sL   

r   )r   r   r   )r0   F)r   numpyr   r   r   r   r   rD   rh   r   r   r   r   r	   r	   r	   r
   <module>   s    
9   
4
@