o
    2hm                     @   s  d Z ddlZddlZddlZddlmZmZmZmZ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 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 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# 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- ddl,m.Z. ddl/m0Z0 ddl1m2Z2 ddl1m3Z3 ee&j4ee5e*j6f f Z7ee0j8e	ej9 gej9f Z:	d=dej9d ej;d!ej<d"d#d$ej=f
d%d&Z>	d=dej9d'e	ej? d"d#d$ej;fd(d)Z@d*ej9d eAd+ej9d$ej9fd,d-ZBd*ej9d.e&j4d$ej9fd/d0ZCd1ed2ej9f d3e	e*j6 d4e:d$eej9ge:f fd5d6ZDd1ed2ej9f d3e	e*j6 d4e:d$ed2ej9f fd7d8ZEd9d: ZFeGe5e5f ZHeee5ej9f gej=f ZIG d;d< d<ZJdS )>z8Saves and restore variables inside traced @tf.functions.    N)CallableMappingMutableMappingMutableSequenceSequence)logging)	saver_pb2)checkpoint_options)sharding_policies)sharding_util)context)def_function)constant_op)device)dtypes)ops)tensor)tensor_spec)tensor_util)	array_ops)
gen_io_ops)io_ops)
string_ops)registration)metrics)base)trackable_utils)saveable_object)saveable_object_util)core)nest)object_identityfile_prefixshardtaskoptions+checkpoint_options.CheckpointOptions | Nonereturnc                 C   s   |pt  }g }g }g }| D ]4\}}| D ]+\}	}
|
durCt|
dr(|
jn|}t|
dr2|
jn|	}|| ||
 || qq|jpK|oK|}t	|pQd t
| |||W  d   S 1 sfw   Y  dS )a  Save the saveable objects to a checkpoint with `file_prefix`.

  Args:
    file_prefix: A string or scalar string Tensor containing the prefix to
      save under.
    shard: Dict containing tensors. {checkpoint key: {slice_spec: tensor} }
    task: The device spec task of the tensors in the shard.
    options: Optional `CheckpointOptions` object.

  Returns:
    An `Operation`, or None when executing eagerly.
  N_wrapped_name_wrapped_slice_speczCPU:0)r	   CheckpointOptionsitemshasattrr(   r)   appendexperimental_io_devicer   r   r   save_v2)r"   r#   r$   r%   tensor_namestensorsslice_specscheckpoint_keytensor_slices
slice_specr   namespecsave_device r9   h/var/www/html/chatgem/venv/lib/python3.10/site-packages/tensorflow/python/checkpoint/functional_saver.py_single_shard_save:   s0   


$r;   shardable_tensorsc                 C   s   |pt  }g }g }g }|D ]%}|jr|jj}|jj}n|j|j}}|| || ||j q|jp8d}	t	
|	 t| |||}
W d   n1 sQw   Y  i }|D ]}|
d}|||ji |j< qZ|S )az  Restore the saveable objects from a checkpoint with `file_prefix`.

  Args:
    file_prefix: A string or scalar string Tensor containing the prefix for
      files to read from.
    shardable_tensors: A list of ShardableTensors to restore.
    options: Optional `CheckpointOptions` object.

  Returns:
    A restored tensor dict (maps checkpoint_key -> slice_spec -> tensor).
  cpu:0Nr   )r	   r*   _tensor_save_specr6   r5   r3   r-   dtyper.   r   r   r   
restore_v2pop
setdefault)r"   r<   r%   r0   tensor_dtypesr2   shardable_tensorr6   r7   restore_devicerestored_tensorsrestored_tensor_dictrestored_tensorr9   r9   r:   _single_shard_restorei   s6   





rI   filename_tensor
num_shardsc                 C   s   t | ||S )zAppend sharding information to a filename.

  Args:
    filename_tensor: A string tensor.
    shard: Integer.  The shard for the filename.
    num_shards: An int Tensor for the number of shards.

  Returns:
    A string tensor.
  )r   sharded_filename)rJ   r#   rK   r9   r9   r:   rL      s   rL   
saver_namec                 C   s   t | td| gS )N-)r   string_joinr   constant)rJ   rM   r9   r9   r:   registered_saver_filename   s   rQ   fn.
trackablescall_with_mapped_capturesc                    n   dt jdt jffdd} du r|S tj|dd}|jtjdtjd	d
dt jdt jf fdd}|S )HConverts the function to a python or tf.function with a single file arg.r"   r'   c                        | dS )N)rS   r"   r9   r"   rR   rS   r9   r:   save_fn      z/_get_mapped_registered_save_fn.<locals>.save_fnNF	autographr9   shaper?   rX   c                        | gS Nr9   rX   rT   concreter9   r:   save_fn_with_replaced_captures      zF_get_mapped_registered_save_fn.<locals>.save_fn_with_replaced_captures	
tensor_libTensorr   functionget_concrete_functionr   
TensorSpecr   string)rR   rS   rT   rZ   tf_fnrd   r9   rT   rc   rR   rS   r:   _get_mapped_registered_save_fn      ro   c                    rU   )rV   merged_prefixr'   c                    rW   )N)rS   rq   r9   rq   rY   r9   r:   
restore_fn   r[   z5_get_mapped_registered_restore_fn.<locals>.restore_fnNFr\   r9   r^   rr   c                    r`   ra   r9   rr   rb   r9   r:   !restore_fn_with_replaced_captures   re   zL_get_mapped_registered_restore_fn.<locals>.restore_fn_with_replaced_capturesrf   )rR   rS   rT   rs   rm   rt   r9   rn   r:   !_get_mapped_registered_restore_fn   rp   ru   c                  O   s   d S ra   r9   )argskwargsr9   r9   r:   <lambda>   s    rx   c                
   @   s@  e Zd ZdZ		d"deejejf ddddfdd	Z	e
		d"d
eej dddddd fddZdejfddZejejdejdfdddejdejfddZejejdejdfdddejdejfddZdejdeeeeej f  fddZ	d#dejdddejfddZ 	d#dejdddeeejf fd d!Z!dS )$MultiDeviceSaverzSaves checkpoints directly from multiple devices.

  Note that this is a low-level utility which stores Tensors in the keys
  specified by `SaveableObject`s. Higher-level utilities for object-based
  checkpointing are built on top of it.
  Nserialized_tensorsregistered_saverszRegisteredSaversDict | NonerT   zMappedCapturesCallable | Nonec                 C   s  i | _ i | _i | _t }| D ]\}}|du rtn|j}| D ]\}}	t|	ts.d|	i}	|	 D ]\}
}d}t|t	j
sL|}t	j
||
||j|jd}||
f| jv rWtd|| j||
f< | j|g ||
f t|jtrtj|j}tjt|j}n|j}tjt| }| j |g tj|||j||jd|
 ||d	 |t|  q2q!qt|| _i | _|r| D ]\}}tt !|||}t"t #|||}||f| j|< qdS dS )a  Specify a list of `SaveableObject`s to save and restore.

    Args:
      serialized_tensors: A dictionary mapping `Trackable` to a tensor dict,
        which maps checkpoint_key -> (slice_spec ->) -> Tensor/SaveSpec. The
        `Trackable` key is used to get the `restore_from_tensors` function,
        and may be `None` if the tensor is not meant to be restored.
      registered_savers: A dictionary mapping `registration.RegisteredSaver`
        namedtuples to a dictionary of named Trackables. The keys of the
        Trackable dictionary are string names that uniquely identify the
        Trackable in the checkpoint.
      call_with_mapped_captures: TODO
    N )r   r5   r6   r?   r   zReceived multiple tensors with the same checkpoint key and slice spec. This is invalid because one will overwrite the other in the checkpoint. This indicates a bug in the Checkpoint key-generation.)	r>   r   r?   r   r6   r_   r5   r3   	trackable)$_shardable_tensors_by_task_keys_to_restore_fn_restore_fn_to_keyssetr+   _restore_noop_restore_from_tensors
isinstancedictr   SaveSpecr?   r   
ValueErrorrB   r-   str
device_lib
DeviceSpecfrom_stringr   set_cpu0	to_stringr   ShardableTensorr6   stripaddlen_num_unique_tasks_registered_saversro   r   get_save_functionru   get_restore_function)selfrz   r{   rT   unique_tasksobjtensor_dictrs   r3   tensor_slice_dictr5   tensor_save_spectensor_valuer   r$   registered_namerS   rZ   r9   r9   r:   __init__   s   


1zMultiDeviceSaver.__init__	saveablesr'   c                 C   s:   t  }|D ]}tj||gd}| ||< q| |||S )z?Constructs a MultiDeviceSaver from a list of `SaveableObject`s.)r   )r!   ObjectIdentityDictionaryr   SaveableCompatibilityConverter_serialize_to_tensors)clsr   r{   rT   rz   saveabler}   r9   r9   r:   from_saveablesK  s   zMultiDeviceSaver.from_saveablesc                 C   sD   t jg tjdd}| |}| |j}tj|j	|j	|j	tjj
dS )z7Serializes to a SaverDef referencing the current graph.saver_filename)r_   r?   r6   )filename_tensor_namesave_tensor_namerestore_op_nameversion)r   placeholderr   rl   _traced_save_traced_restoreopr   SaverDefr6   V2)r   rJ   save_tensor
restore_opr9   r9   r:   to_protoZ  s   
zMultiDeviceSaver.to_protor9   r^   F)input_signaturer]   r"   c              	   C   s~   |  |}td+ t|g t|W  d    W  d    S 1 s(w   Y  W d    d S 1 s8w   Y  d S Nr=   )saver   r   control_dependenciesr   identity)r   r"   save_opr9   r9   r:   r   f  s   
"zMultiDeviceSaver._traced_savec              	   C   s   |  |}td, t|  t|W  d    W  d    S 1 s)w   Y  W d    d S 1 s9w   Y  d S r   )restorer   r   r   valuesr   r   )r   r"   restore_opsr9   r9   r:   r   o  s   
"z MultiDeviceSaver._traced_restoresharding_callbackc           	         s   dd   fdd| j  D }|pt }tj|jd t d }g }| D ]\}}||||f q)t d }t	
|| }tjtd|d td	| |S )
zCalls the sharding callback with shardable_tensors.

    Args:
      sharding_callback: ShardingCallback. The callback function wrapper that
        splits shardable_tensors into shards.

    Returns:
      A list of (task, shards) tuples.
    c                 S   s   | j }| j}| j}t| j |j }W d    n1 sw   Y  |d u r,|d u r,d S |d urK|}|j}t|jtjr@|j|_	t| j
tjrK|j
|_tj| ||dS )N)r   r_   )r   r_   r>   r   r   r   r6   rg   rh   r(   r5   r)   dataclassesreplace)rD   
tensor_valtensor_shape	save_specsave_spec_tensorr9   r9   r:   wrap_tensor  s(   z9MultiDeviceSaver._get_shards_by_task.<locals>.wrap_tensorc                    s&   i | ]\}}|d d t  |D qS )c                 S   s   g | ]}|d ur|qS ra   r9   ).0rD   r9   r9   r:   
<listcomp>  s
    zCMultiDeviceSaver._get_shards_by_task.<locals>.<dictcomp>.<listcomp>)map)r   r$   r<   r   r9   r:   
<dictcomp>  s    z8MultiDeviceSaver._get_shards_by_task.<locals>.<dictcomp>)descriptiong    .A   )callback_durationz+Sharding callback duration: %s microseconds)r~   r+   r
   ShardByTaskPolicyr   SetShardingCallbackDescriptionr   timer-   mathceilAddShardingCallbackDurationmaxr   info)	r   r   shardable_tensors_by_taskcallback_start_timeshards_by_taskr$   r<   callback_end_timer   r9   r   r:   _get_shards_by_tasky  s,   

z$MultiDeviceSaver._get_shards_by_taskr%   r&   c                    s   pt  td* tt dt	dt	d}t
 |g fddjD W d   n1 s8w   Y  dtjf fd	d
t rfjdkrftjdddfdd}|  dS  S )a%  Save the saveable objects to a checkpoint with `file_prefix`.

    Args:
      file_prefix: A string or scalar string Tensor containing the prefix to
        save under.
      options: Optional `CheckpointOptions` object.
    Returns:
      An `Operation`, or None when executing eagerly.
    CPUz^s3://.*z.partz
_temp/partc                    s   i | ]}|t  |qS r9   )rQ   )r   rM   rX   r9   r:   r     s    
z)MultiDeviceSaver.save.<locals>.<dictcomp>Nr'   c               
      s  g } j  D ]+\}\}}|| }|d ur2t|}tdd |D s-td| d| | qj}t	dd |D }t
j|d tj|dd	}g }	d
}
|D ]7\}}|D ]0}t| t|
|}|
d7 }
W d    n1 sww   Y  | | |	t||| q[qUt|	@ tj d }jpt| }t| tj|  ddW  d    W  d    S 1 sw   Y  W d    d S 1 sw   Y  d S )Nc                 s   s&    | ]}t |o|jtjkV  qd S ra   )r   
is_tf_typer?   r   rl   )r   xr9   r9   r:   	<genexpr>  s
    
z9MultiDeviceSaver.save.<locals>.save_fn.<locals>.<genexpr>zNRegistered saver must return a (maybe empty) list of string type tensors. Got .c                 S   s   g | ]\}}t |qS r9   r   )r   _shardsr9   r9   r:   r     s    z:MultiDeviceSaver.save.<locals>.save_fn.<locals>.<listcomp>)rK   rK   )r6   r   r   T)delete_old_dirs)r   r+   r    flattenallr   extendr   experimental_sharding_callbacksumr   AddNumCheckpointShardsWrittenr   rP   r   r   rL   r-   r;   r   listr~   keysr.   r   r   r   r   merge_v2_checkpoints)saved_prefixesrM   rZ   r   maybe_saved_prefixesflattened_saved_prefixesr   rK   num_shards_tensorsharded_saves	shard_idxr$   r   r#   shard_prefixtensor_device_specmerge_device_spec)r"   r%   registered_pathsr   tmp_checkpoint_prefixr9   r:   rZ     sb   



	"z&MultiDeviceSaver.save.<locals>.save_fnr   F)jit_compilec                      s
      d S ra   r9   r9   )rZ   r9   r:   tf_function_save+  s   
z/MultiDeviceSaver.save.<locals>.tf_function_save)r'   N)r	   r*   r   r   r   wherer   regex_full_matchr   rP   rO   r   	Operationr   executing_eagerlyr   r   ri   )r   r"   r%   sharded_suffixr   r9   )r"   r%   r   rZ   r   r   r:   r     s(   

4

zMultiDeviceSaver.savec                    s   pt  dtttjf f fddd}j D ]}tdd |D r,d} nqt	
 rRjdks8|rRtjddd	dtttjf ffd
d}| }|S  }|S )a  Restore the saveable objects from a checkpoint with `file_prefix`.

    Args:
      file_prefix: A string or scalar string Tensor containing the prefix for
        files to read from.
      options: Optional `CheckpointOptions` object.

    Returns:
      When not run eagerly or when saving on a single device, returns a
      dictionary mapping from SaveableObject names to restore operations;
      otherwise, returns an empty dict.
    r'   c               
      sJ  i } dd j  D }i }j D ]\}}t|n t |}| D ][\}}| D ]R\}}	j||f }
|rI|	| |
i |i |< n|	| |
i |< ||
  d8  < ||
 dkri }| |
  D ]\}}	|	|t	|< qg|
|}t
|tr|| q/q'W d    n1 sw   Y  qj D ]
\}\}}
|
  q|S )Nc                 S   s   i | ]	\}}|t |qS r9   r   )r   rR   r   r9   r9   r:   r   G  s    z@MultiDeviceSaver.restore.<locals>.restore_fn.<locals>.<dictcomp>r   r   )r   r+   r~   r   r   rI   r   rB   r   extract_local_namer   r   updater   )restore_fn_inputsrestore_fn_input_countr   r$   r#   rG   ckpt_keyslice_and_tensorr5   r   rs   rF   retr   )r"   r%   r   r9   r:   rs   E  s^   

)
z,MultiDeviceSaver.restore.<locals>.restore_fnFc                 S   s   g | ]
}t |j qS r9   )r   is_custom_devicer   r   )r   str9   r9   r:   r   |  s    z,MultiDeviceSaver.restore.<locals>.<listcomp>Tr   )r   r]   c                      s
      i S ra   r9   r9   )rs   r9   r:   tf_function_restore  s   z5MultiDeviceSaver.restore.<locals>.tf_function_restore)r	   r*   r   r   r   r   r~   r   anyr   r   r   r   ri   )r   r"   r%   has_custom_device_saverstsr  r   r9   )r"   r%   rs   r   r:   r   2  s"    5zMultiDeviceSaver.restore)NNra   )"__name__
__module____qualname____doc__r   r   	Trackabler   Shardr   classmethodr   r   r   r   r   r   ri   r   rk   r   rl   rg   rh   r   r   ShardingCallbacktupler   r   r   r   r   r   r9   r9   r9   r:   ry      sv    

_
G
xry   ra   )Kr  r   r   r   typingr   r   r   r   r   abslr   tensorflow.core.protobufr   tensorflow.python.checkpointr	   %tensorflow.python.checkpoint.shardingr
   r   tensorflow.python.eagerr   r   tensorflow.python.frameworkr   r   r   r   r   r   rg   r   r   tensorflow.python.opsr   r   r   r   tensorflow.python.saved_modelr   0tensorflow.python.saved_model.pywrap_saved_modelr   tensorflow.python.trackabler   r   !tensorflow.python.training.savingr   r   tensorflow.python.typesr   tensorflow.python.utilr    r!   RegisteredSaverr   r  RegisteredSaversDictConcreteFunctionrh   MappedCapturesCallabler  r   r   r;   r   rI   intrL   rQ   ro   ru   r   r  TensorKeyAndSliceSpec	RestoreFnry   r9   r9   r9   r:   <module>   s   
2
-



