U
    ‰dá  ã                   @   s¢   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
 d dlZe ¡  e d¡Ze ej¡ ddd„Zd	d
„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    N)ÚOrderedDict)Ú
caffe2_pb2)Ú	workspaceÚcoreÚscopeZAnyExpOnTermFc           	      C   s,   t | |||ƒ\}}}t|| ||ƒ |||fS ©N)Ú"initialize_master_xpu_model_paramsÚbroadcast_parameters)	ÚmodelÚweights_fileÚnum_xpusÚoptsÚbroadcast_computed_paramÚreset_epochÚstart_epochÚlrÚbest_metric© r   úH/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/contrib/playground/checkpoint.pyÚinitialize_params_from_file   s       ÿ
r   c                 C   sB  t  d |¡¡ t|dƒ}t |¡}W 5 Q R X d|kr@|d }d}tdƒ}d|kr‚t  d |d ¡¡ |sv|d }qŒt  d¡ n
t  d	¡ |d
 d }d|kr¨|d }d|kr¼|s¼|d }| d k	rt  d |¡¡ t ¡ }	t	ƒ }
|  
¡ D ]}d|
tt|ƒƒ< qì|d d }|d d }|d d dkr2tjntj}t d ||¡¡Ì t t |d¡¡® |
 ¡ D ]ž}t|ƒ}||kr’t  d |¡¡ qht  d ||¡¡ ||	krht |¡}|j|| jksèt  d ||j|| j¡¡ nt ||| jtjdd¡ qhW 5 Q R X W 5 Q R X nt  d |¡¡ t  d¡ |||fS )Nz'Initializing model params from file: {}ÚrÚblobsr   z-infÚepochzepoch {} is found in model filezReset epochzno epoch is found in model fileZmodel_paramZbase_learning_rater   r   z2initialize model parameters using weights file: {}TÚdistributedÚfirst_xpu_idÚdeviceÚgpuú{}_{}z{:s} not foundz({:s} loaded from weights file into: {:s}zDWorkspace blob {} with shape {} does not match weights file shape {}F)Úcopyz0Skip initializing model parameters from file: {}z+Complete initialize_master_xpu_model_params)ÚlogÚinfoÚformatÚopenÚpickleÚloadÚfloatr   ZBlobsr   ZGetAllParamsÚunscope_nameÚstrr   ÚCUDAÚCPUr   Z	NameScopeÚDeviceScopeÚDeviceOptionÚkeysÚscoped_nameÚ	FetchBlobÚshapeÚFeedBlobZastypeÚnpZfloat32)r
   r   r   r   Zfopenr   r   r   r   Zws_blobsZunscoped_blob_namesZblobÚroot_xpu_idr   Úcaffe2_pb2_DEVICEÚunscoped_blob_nameÚscoped_blob_nameZws_blobr   r   r   r      s„    


ÿþ
 ÿÿ

 ýÿ ÿþÿ
r   c                 C   s6  |dkrt  d¡ d S | ¡ g}|r2| | ¡ ¡ | d d dkrHtjntj}|D ]Ô}t|ƒ| dksnt	dƒ‚t
t|ƒ| ƒ}t|ƒD ]ž}dd	„ ||d |… D ƒ}	t |	d ¡}
t  d
 t|	d ƒ¡¡ t|	dd … ƒD ]J\}}t  d t|ƒ¡¡ t t ||d ¡¡ t ||
¡ W 5 Q R X qØq†qRt  d¡ d S )Né   z'only 1 device. Skip parameter broadcastr   r   r   r   zACurrent model doesn't match device number when loading checkpointc                 S   s   g | ]}|‘qS r   r   ©Ú.0Úparamr   r   r   Ú
<listcomp>r   s     z(broadcast_parameters.<locals>.<listcomp>zBroadcasting {} toz |-> {}zComplete parameter broadcast)r   r    Ú	GetParamsÚappendÚGetComputedParamsr   r(   r)   ÚlenÚAssertionErrorÚintÚranger   r.   r!   r'   Ú	enumerater   r*   r+   r0   )r   r
   r   r   Ú
all_paramsr3   ÚparamsZparams_per_xpuÚidxr   ÚdataÚiÚpr   r   r   r	   c   s.    

þÿr	   c              
   C   s\   |d krd S zt |||||ƒ W n6 tk
rV } zt d t|ƒ¡¡ W 5 d }~X Y nX |S )Nz#Exception from save_model_params {})Úsave_model_params_blobÚ	Exceptionr   Úwarningr!   r'   )Zis_checkpointr
   Zcheckpoint_pathr   r   r   Úer   r   r   Úsave_model_params|   s        ÿ&rM   c              
   C   sJ  t  d¡ |d d }|d d }dd„ |  d ||¡¡D ƒ}dd„ |  d ||¡¡D ƒ}i }	||	d	< ||	d
< t d ||¡¡|	d< || D ]<}
t|
ƒ}t|ƒ}||	krŒt |¡|	|< t  	d ||¡¡ qŒt  d |¡¡ z0t
|dƒ}t t|	d|tj¡ W 5 Q R X W n: tk
rD } zt  d |j|j¡¡ W 5 d }~X Y nX d S )NzSaving model params...r   r   r   c                 S   s   g | ]}t |ƒ‘qS r   ©r'   r7   r   r   r   r:      s     z*save_model_params_blob.<locals>.<listcomp>r   c                 S   s   g | ]}t |ƒ‘qS r   rN   r7   r   r   r   r:   ‘   s     r   r   z{}_{}/lrr   z{:s} -> {:s}zto weights file {}Úw)r   zI/O error({0}): {1})r   r    r;   r!   r=   r   r.   r'   r&   Údebugr"   r#   ÚdumpÚdictÚHIGHEST_PROTOCOLÚIOErrorÚerrorÚerrnoÚstrerror)r
   Zparams_filer   r   r   r2   r   Zsave_paramsZsave_computed_paramsZ
save_blobsr9   r5   r4   ZfwriterL   r   r   r   rI   Š   sB    
ÿ ÿÿÿÿ
ÿ$rI   c                 C   s   | |   tj¡d d … S )Nr6   )Úrfindr   Z_NAMESCOPE_SEPARATOR©Z	blob_namer   r   r   r&   ©   s    r&   c                 C   s   t  ¡ |  S r   )r   ZCurrentNameScoperY   r   r   r   r-   ­   s    r-   )FF)F)Znumpyr1   r#   Úcollectionsr   Zcaffe2.protor   Zcaffe2.pythonr   r   r   ÚloggingÚbasicConfigÚ	getLoggerr   ÚsetLevelÚDEBUGr   r   r	   rM   rI   r&   r-   r   r   r   r   Ú<module>   s"   
   þ
	F
