o
    پi                     @   s   d dl Z d dlmZmZmZ d dlZd dlmZmZ e 	e
ZG dd dZdeeeeejf  deeeeejf  fdd	Zd
ejfddZdeeejf deeeeejf  fddZdS )    N)DictIterableTuple)block_quant_dequantinverse_transform_scale_ue8m0c                   @   sB   e Zd Zdd ZdefddZdd Zdd	 Zd
d Zdd Z	dS )WeightCheckerc                 C   s   || _ d | _d S N)_model_runner_snapshot_tensors)selfmodel_runner r   S/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/utils/weight_checker.py__init__   s   
zWeightChecker.__init__actionc                 C   sZ   t d|  |dkr|   d S |dkr|   d S |dkr&|   d S td|)Nz[WeightChecker] handle action=snapshotreset_tensorscomparezUnsupported action=)loggerinfo	_snapshot_reset_tensors_compare	Exception)r   r   r   r   r   handle   s   zWeightChecker.handlec                 C   s:   dd |   D }t|| _t| jt|ksJ dd S )Nc                 S   s"   g | ]\}}||j   fqS r   )datadetachcpu).0nameparamr   r   r   
<listcomp>   s    z+WeightChecker._snapshot.<locals>.<listcomp>z&should not have duplicated tensor name)_model_statedictr
   len)r   named_tensorsr   r   r   r      s   

zWeightChecker._snapshotc                 C   s$   |   D ]\}}|t| qd S r   )r"   copy__random_like)r   r   r    r   r   r   r   '   s   zWeightChecker._reset_tensorsc                 C   s0   | j d usJ tt| j tt|  d d S )N)expect_tensorsactual_tensors)r
   _check_tensors_postprocess_tensorsr#   r"   r   r   r   r   r   +   s
   
zWeightChecker._comparec                 c   s*    | j j E d H  | j j E d H  d S r   )r	   modelnamed_parametersnamed_buffersr,   r   r   r   r"   3   s   zWeightChecker._model_stateN)
__name__
__module____qualname__r   strr   r   r   r   r"   r   r   r   r   r      s    	r   r(   r)   c                 C   sN  ddl m} g }g }g }t| |ddD ]l\\}}}\}	}
}||	ks+J d|d|	||
ks9J d|d|
|}|}| }| }t||krR|| q| |   }d	| d
|	  d|
  d||d||d}|rz|n|| qtd|  t|dkrtd|  t|dkrtdd| d S )Nr   get_tensor_infoT)strictzexpect_name=z actual_name=zexpect_should_compare=z actual_should_compare=zname=z max_abs_err=z mean_abs_err=z get_tensor_info(expect)=z get_tensor_info(actual)= z[check_tensors] equal tensors: z[check_tensors] info: zcheck tensor equality failed:

)sglang.srt.debug_utils.dumperr5   zipcudatorchallappendfloatabsmaxmeanr   r   r$   r   join)r(   r)   r5   
good_nameserror_messagesinfo_messagesexpect_nameexpect_should_compareexpectactual_nameactual_should_compareactualr   should_compareabs_diffmsgr   r   r   r*   9   sJ   
r*   tc                 C   sv   | j }| j}| j}|jrtj||tjd|S |tjkr&tj||ddkS t	|}tj
t|jt|j|||dS )N)devicedtype)rQ   g      ?)lowhighsizerQ   rR   )rQ   shaperR   is_floating_pointr<   randfloat32tobooliinforandintintminrA   )rP   rQ   rV   rR   r   r   r   r   r'   f   s   

r'   rawreturnc                 #   s    ddl m} g } fdd D }||7 }|D ]I} | } |dd }zt||jd d}t||d	d	gtjd
}|d|fV  W q tya }	 z|		d|d||d||  d }	~	ww  D ]}||v}
||
 | fV  qdd S )Nr   r4   c                    s*   g | ]}| d r|d d v r|qS )weightweight_scale_inv)endswithreplace)r   r   r`   r   r   r!      s    z(_postprocess_tensors.<locals>.<listcomp>rb   rc   )mn   )
block_sizerR   Tzwhen handling name=z get_tensor_info(w_q)=z get_tensor_info(w_s)=)
r9   r5   re   r   rV   r   r<   bfloat16r   add_note)r`   r5   skip_compare_namesquant_namesr   w_qw_sw_s_inverse_transformed	w_dequanterM   r   rf   r   r+   w   s@   

r+   )loggingtypingr   r   r   r<   (sglang.srt.layers.quantization.fp8_utilsr   r   	getLoggerr0   r   r   r3   r[   Tensorr*   r'   r+   r   r   r   r   <module>   s"    
+
-