o
    piD                     @   s  d dl Z d dlZd dlZd dl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 g d
Ze eZee j e jddZe  Zee e e dZ!dZ"dZ#ej$j%j&ej$j%j'gZ(dgZ)d8ddZ*dd Z+dd Z,d9ddZ-dd Z.d:dd Z/d!d" Z0d#d$ Z1d%d& Z2d'd( Z3d)d* Z4d+d, Z5d-d. Z6d/d0 Z7d1d2 Z8	3	d;d4d5Z9d6d7 Z:dS )<    N)OrderedDict)text_format)base)core)Program)framework_pb2)draw_block_graphviz)io_utils)load_programsave_programprogram_type_transcheck_saved_vars_try_dumpparse_programcheck_pruned_program_varsgraphvizz)%(asctime)s - %(levelname)s - %(message)s)fmtzvars_persistable.logzvars_all.logzops.logZlookup_tableFc                 C   s   |rt | S t| S N)load_program_textload_program_binary)model_filenameis_text r   n/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/paddle/incubate/distributed/fleet/utils.pyr
   ;   s   r
   c                 C   s<   t | d}| }W d   n1 sw   Y  t|S )z$load program from binary string filerbN)openreadr   parse_from_string)r   fZprogram_desc_strr   r   r   r   A   s   

r   c                 C   sT   t | d}| }W d   n1 sw   Y  t }t|| t| S )z*load program from human-readable text filerN)	r   r   r   ZProgramDescr   ZMerger   r   ZSerializeToString)r   r   Zprogram_desc_textZ	prog_descr   r   r   r   H   s   
r   	__model__c                 C   s   |r!t |d}|t|  W d    d S 1 sw   Y  d S t |d}|| j  W d    d S 1 s:w   Y  d S )Nwwb)r   writestrdescZserialize_to_string)programr   r   r   r   r   r   r   R   s   ""r   c           	      C   s   d}dd |  D }t|}t|}td|  |D ]^}|| }|jtv r+ |S z	|  |}W n  t	yT } zt
d| d t
| W Y d }~qd }~ww |j|jksa|j|jkr{t
d| d|j d	|j d
|j d|j 
 d}q|S )NTc                 S   s    g | ]}t |r|j|fqS r   )r	   is_persistablename.0vr   r   r   
<listcomp>^   s    z-check_pruned_program_vars.<locals>.<listcomp>z$persistable vars in pruned program: znot find variable 'z)' in train program. please check pruning.z
variable: z% not match. in pruned program shape: z dtype:z, in train program shape: z dtype: F)	list_varsr   listloggerinfotypefeed_fetch_type_listglobal_blockvar
ValueErrorerrorshapedtype)	Z
train_progZpruned_progZis_matchZpruned_varsZpruned_vars_namevar_namer3   Ztrain_prog_varer   r   r   r   [   s<   


(r    debugc                 C   sb   t j||d }t j||d }t| |d dd|d|g}tj|tjtjtjd}|  d S )Nz.dotz.pdf)pathdotz-Tpdfz-o)stdinstdoutstderr)osr<   joinr   
subprocessPopenPIPEwait)block
output_dirfilenameZdot_pathZpdf_pathcmdpr   r   r   r      s   r   c                 C   sF   t tj| ||}|r|d n|d }t|tj| |d|  |S )Nz.binz.pbtxt   )r
   rA   r<   rB   r   )Zprog_dirZprog_fnr   progZprog_out_fnr   r   r   r      s   r   c                 C   s    | j dd|gii d|id d S )NsaveX	file_pathr0   ZinputsZoutputsattrsZ	append_oprG   r3   r<   r   r   r   append_save_op   s   
rU   c                 C   s    | j di d|gid|id d S )NloadZOutrP   rQ   rS   rT   r   r   r   append_load_op   s   
rW   c           
      C   s   t  }t  }t |}t|}t |# tjj|||d}	t	|
 |	| |j|| ig d W d    d S 1 s<w   Y  d S N)r6   r7   )feed
fetch_list)r   r   CPUPlaceExecutorr-   program_guardpaddlestaticdatarU   r2   run)
Znp_arrayr8   
shape_listr7   	save_pathr%   placeexer6   d0_datar   r   r   save_var   s   
"rg   c           	      C   s~   t  }t  }t |}t |# tjj| ||d}t|	 || |j
i |gd}|W  d    S 1 s8w   Y  d S rX   )r   r   r[   r\   r]   r^   r_   r`   rW   r2   ra   )	r8   rb   r7   rc   r%   rd   re   rf   Zoutsr   r   r   load_var   s   
$rh   c           
      C   s   g }t |ttfrt|}d}|D ]}|| }q|}n|g}| g|}||  }t|dD ]3}| d}dd |D }t||kr_|d | }	||d  }|t	|	
| t||ksBq,|S )NrL   r    c                 S   s   g | ]}t |qS r   )float)r)   dr   r   r   r+      s    zreader.<locals>.<listcomp>)
isinstancer-   tupler   stripsplitlenappendnparrayZreshape)

batch_sizefndimr`   r6   _tempxlinefieldstmpr   r   r   reader   s(   

r|   c                 C   s0   g }t |D ]\}}|t| |||  q|S r   )	enumeraterq   r|   )rt   feeded_vars_dimsfeeded_vars_filelist
batch_feediru   r   r   r   feed_gen   s   r   c           %         s  t  }t |}	t j }
t |
l |rt| ||}tjj	j
| |	||d\}}dd |D }|D ]B}t  |j}|d usIJ d|j t| j}|j|v s]J |jd ||j}||krvtd| d|j d| d	q4d
d |D }|std |std |}|} jd ur| jkrtd| d j d  j} }g }t|jD ]\}}|jd |jdkr|| q|d d d D ]}|| q|jd ur.||jkr.td| d|j d fdd|jD } }g }t|jD ]\}}|jd |jdkr|| q|d d d D ]}|| q%t dd |D }g t! jt! j"  krOt! j#ksRJ  J t$t! jD ]G} % j| }t& j"| t't(fsw j"| f}nt( j"| }| j"|< |jdd  }||krtd j|  d| d| qY j)s#t*d t$t! jD ]^} % j| }|j+dkr߈tjtj,,|gt' j"| R  j#| d  q|j+dkrtjtj,,|gt' j"| R  j#| d }t -|dg| g| qtd!|	j.fd"dt|D ||d#}n7t*d$ j) d  fd%dt$t! jD } t j/| |d&}!t0| j" j)}"|"g}#|	j.|!1|#||d#}t|D ]\}}$t*d'|$j  t*d(||   q^|W  d    S 1 sw   Y  d S ))N)r   Zparams_filenamec                 S   s   i | ]}|j t|j qS r   )r'   rm   r$   r6   )r)   each_varr   r   r   
<dictcomp>   s    z'try_load_model_vars.<locals>.<dictcomp>zcan't not find var: zMUST in var listzFShape not matching: the Program requires a parameter with a shape of (z(), while the loaded parameter (namely [ z ]) has a shape of  (z).c                 S      g | ]}|j qS r   r'   r(   r   r   r   r+   
      z'try_load_model_vars.<locals>.<listcomp>zno feed targets in program.zno fetch targets in program.z;feed vars in program and config are diff: feed in program: z. feed in config .FrY   z=fetch vars in program and config are diff: fetch in program: z. fetch in config c                    s   g | ]	}   |qS r   )r2   r3   r)   r   )inference_programr   r   r+   )  s    fetchc                 s   s    | ]}|j d kV  qdS )r   N)	lod_levelr(   r   r   r   	<genexpr>8  s    z&try_load_model_vars.<locals>.<genexpr>rL   zfeed variable 'z)' shape not match. infer program  shape: z. feed tensor shape: zgenerate random feed vars.r   )r7   zOvars with lod_level >= 2 is not supported now in this infer program check tool.c                    s   i | ]	\}}| | qS r   r   )r)   r   r'   )feed_tensorsr   r   r   w  s    )rY   rZ   return_numpyzload feed vars from files: c                    s    g | ]}   j| qS r   )r2   r3   feeded_vars_namesr   )feed_configr   r   r   r+     s    )Z	feed_listrd   zfetch_targets name: zfetch_targets: )2r   r[   r\   r   ZScopeZscope_guardr   r^   r_   ioZload_inference_modelZglobal_scopeZfind_varr'   rr   rs   Z
get_tensorr6   getRuntimeErrorr.   warningr   r2   r}   opsr$   Zset_is_targetr0   rq   Z
_remove_opZfetch_vars_namesallrp   r~   Zfeeded_vars_typesranger3   rl   r-   rm   r   r/   r   randomZcreate_lod_tensorra   Z
DataFeederr   rY   )%dump_dirdump_prog_fnis_text_dump_programrt   r   fetch_configsave_filenamesaved_paramsrd   re   scopeZfeed_target_namesZfetch_targetsZorig_para_shaper   Zvar_tempZ	new_shapeZ
orig_shapeZfetch_targets_namesrZ   Zfeed_name_listr2   Zneed_to_remove_op_indexr   opindexr   r3   Ztensor_shapeZ	var_shapetresultsZ	feed_varsZfeederr   slotsr*   r   )r   r   r   r   try_load_model_vars   sJ  


	











	

 &r   c                 C   sN   t  }|  jD ]}|jtv r$|j|vr$td|j d ||j qd S )Nzfind op type 'z@' in program, please check if your program is pruned correctly !)setr2   r   r0   not_expected_op_typesr.   r   add)rM   Zop_types_setr   r   r   r   check_not_expected_ops  s   r   rL   c           	   	   C   s^   t tj| ||}dd | D }tddd |D   t| t| |||||||S )Nc                 S      g | ]	}t |r|qS r   r	   r&   r(   r   r   r   r+     
    
z-check_saved_vars_try_dump.<locals>.<listcomp>z"persistable vars in dump program: c                 S   r   r   r   r(   r   r   r   r+     r   )	r
   rA   r<   rB   r,   r.   r/   r   r   )	r   r   r   r   r   rt   r   Z	dump_progr   r   r   r   r     s(   	r   c           	      C   s  i }dd |   D }dd |D |d< ttj|td }|d |d D ]}|t| |d q(W d    n1 sAw   Y  t|   }dd |D |d	< ttj|t	d }|d
 |d	 D ]}|t| |d qiW d    n1 sw   Y  | 
 j}dd |D |d< ttj|td!}|d |d D ]}|t| |d qW d    d S 1 sw   Y  d S )Nc                 S   r   r   r   r(   r   r   r   r+     r   z!parse_program.<locals>.<listcomp>c                 S   s:   g | ]}t |jt |jt|jt |jt |jd qS ))r'   r6   r   r7   r0   )r#   r'   r6   intr   r7   r0   r(   r   r   r   r+     s    persistable_varsr    zpersistable vars:

c                 S   sR   g | ]%}|j tvrt|jt|jt|jt|jd n
t|jt|j dqS ))r'   r6   r   r7   )r'   r0   )r0   r1   r#   r'   r6   r   r   r7   r(   r   r   r   r+     s    
all_varsz
all vars:
c                 S   s&   g | ]}|j t|jt|jd qS ))r0   input_arg_namesoutput_arg_names)r0   r#   r   r   )r)   r   r   r   r   r+     s    r   zops:
)r,   r   rA   r<   rB   persistable_vars_out_fnr"   r#   r-   all_vars_out_fnr2   r   
ops_out_fn)	r%   rH   outputr   r   r3   r   r   r   r   r   r   r     sH   







"r   )F)r   F)r:   r;   )rL   N);loggingrA   rC   collectionsr   numpyrr   Zgoogle.protobufr   r^   r   Zpaddle.baser   Zpaddle.base.frameworkr   Zpaddle.base.protor   Z*paddle.distributed.fleet.base.util_factoryr   Zpaddle.frameworkr	   __all__	getLogger__name__r.   setLevelINFO	Formatter	formatterStreamHandlerchsetFormatter
addHandlerr   r   r   ZVarDescZVarTypeZFEED_MINIBATCHZ
FETCH_LISTr1   r   r
   r   r   r   r   r   r   rU   rW   rg   rh   r|   r   r   r   r   r   r   r   r   r   <module>   s^   






	
$	 D
!