
    g                        d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	Z
d dlZd dlmZ ddZd Zd Zdeeej        f         d	eeej        f         fd
Z G d de          Z G d de          Zd	eeej        f         dee         fdZdS )    N)Mapping)DictListOptionalUnion)	safe_openc                 "   d }t          | j                  dk    r!|                     t          j                  } d}|                                                                 }t          j        	                    || d          }|0|t          |j                  }|t          |j                  d||<   |j        dk    r|d          }t          j        ||j        d|j                  }|d d          |d d <   |                                 |S )Nztorch.bfloat16bfloat16.dat)dtypeshaper   zw+)r   moder   )strr   viewtorchint16cpunumpyospathjoinlistr   ndimnpmemmapflush)weightweight_nameoffload_folderindexr   arraytensor_file
file_arrays           T/var/www/html/ai-engine/env/lib/python3.11/site-packages/accelerate/utils/offload.pyoffload_weightr%      s    E
6<,,,U[))JJLL  E',,~+/C/C/CDDK=$$E',tEK7H7HIIkzQd;ekEKXXXJ!!!HJqqqML    c                 P   t          |d                   }|dk    rd}|d         }|dk    rd}t          j        | ||d          }t          |d                   d	k    r|d	         }t	          j        |          }|d         dk    r|                    t          j                  }|S )
Nr    )   r   r
   r   r)r   r   r   r   )tupler   r   lenr   tensorr   r
   )weight_fileweight_infor   r   r   s        r$   load_offloaded_weightr0   .   s    +g&''E{{ E
Y{%u3GGGF
;w  A%%\&!!F7z))U^,,Mr&   c                    | t          |           dk    rd S t          j                            |d          }t          j                            |          r>t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   ni }|                    |            t          |dd          5 }t          j	        ||d           d d d            d S # 1 swxY w Y   d S )Nr   
index.jsonzutf-8)encodingw   )indent)
r,   r   r   r   isfileopenjsonloadupdatedump)r    r   offload_index_filefcurrent_indexs        r$   save_offload_indexr@   D   sd   }E

anlCC	w~~()) $w777 	)1 IaLLM	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	 #	8	8	8 .A	-1----. . . . . . . . . . . . . . . . . .s$   (B		BB>C##C'*C'save_dir
state_dictc                     t          j        | d           i }|                                D ]\  }}t          ||| |          }t	          ||            dS )a  
    Offload a state dict in a given folder.

    Args:
        save_dir (`str` or `os.PathLike`):
            The directory in which to offload the state dict.
        state_dict (`Dict[str, torch.Tensor]`):
            The dictionary of tensors to offload.
    T)exist_ok)r    N)r   makedirsitemsr%   r@   )rA   rB   r    name	parameters        r$   offload_state_dictrI   U   so     K4((((E%++-- G Giy$FFF uh'''''r&   c                   4    e Zd ZdZdedefdZd Zd Zd Z	dS )	PrefixedDatasetz
    Will access keys in a given dataset by adding a prefix.

    Args:
        dataset (`Mapping`): Any map with string keys.
        prefix (`str`): A prefix to add when trying to access any element in the underlying dataset.
    datasetprefixc                 "    || _         || _        d S NrL   rM   )selfrL   rM   s      r$   __init__zPrefixedDataset.__init__q   s    r&   c                 .    | j         | j         |          S rO   rP   )rQ   keys     r$   __getitem__zPrefixedDataset.__getitem__u   s    |t{1C1122r&   c                 D     t           fd j        D                       S )Nc                 H    g | ]}|                     j                  |S r(   )
startswithrM   .0rT   rQ   s     r$   
<listcomp>z,PrefixedDataset.__iter__.<locals>.<listcomp>y   s,    PPPSCNN4;4O4OPSPPPr&   )iterrL   rQ   s   `r$   __iter__zPrefixedDataset.__iter__x   s(    PPPPDLPPPQQQr&   c                 *    t          | j                  S rO   )r,   rL   r]   s    r$   __len__zPrefixedDataset.__len__{   s    4<   r&   N)
__name__
__module____qualname____doc__r   r   rR   rU   r^   r`   r(   r&   r$   rK   rK   h   sp              3 3 3R R R! ! ! ! !r&   rK   c                       e Zd ZdZ	 	 	 	 ddeeej        f         dee	ee
j        f                  defdZdefdZd	 Zd
 ZdS )OffloadedWeightsLoaderaC  
    A collection that loads weights stored in a given state dict or memory-mapped on disk.

    Args:
        state_dict (`Dict[str, torch.Tensor]`, *optional*):
            A dictionary parameter name to tensor.
        save_folder (`str` or `os.PathLike`, *optional*):
            The directory in which the weights are stored (by `offload_state_dict` for instance).
        index (`Dict`, *optional*):
            A dictionary from weight name to their information (`dtype`/ `shape` or safetensors filename). Will default
            to the index saved in `save_folder`.
    NrB   save_folderr    c                     |||t          d          |i n| _        | _        |[|Yt          t          j                            |d                    5 }t          j        |          }d d d            n# 1 swxY w Y   |i n| _	        t           j                                                   _         j                             fd j	        D                        | _        d S )NzWNeed either a `state_dict`, a `save_folder` or an `index` containing offloaded weights.r2   c                 &    g | ]}|j         v|S r(   )all_keysrY   s     r$   r[   z3OffloadedWeightsLoader.__init__.<locals>.<listcomp>   s%    TTTc3dm;S;Sc;S;S;Sr&   )
ValueErrorrB   rg   r8   r   r   r   r9   r:   r    r   keysrj   extenddevice)rQ   rB   rg   r    rn   r>   s   `     r$   rR   zOffloadedWeightsLoader.__init__   s&    +"5%-vwww * 2""
&=[4bgll;==>> %!	!% % % % % % % % % % % % % % % =RRe
T_113344TTTTTZTTTUUUs   A;;A?A?rT   c                 \   || j         v r| j         |         S | j        |         }|                    d          <| j        dn| j        }d }	 t	          |d         d|          5 }|                    |                    d|                    }d d d            n# 1 swxY w Y   ni# t          $ r\ t	          |d         dd          5 }|                    |                    d|                    }d d d            n# 1 swxY w Y   Y nw xY wd|v r.|                    t          t          |d                             }|j        t          j        |          k    r|                    |          }|S t          j                            | j        | d          }t          ||          S )Nsafetensors_filer   pt)	frameworkrn   r   r   r   )rB   r    getrn   r   
get_tensor	TypeErrortogetattrr   r   r   r   rg   r0   )rQ   rT   r/   rn   r-   r>   r.   s          r$   rU   z"OffloadedWeightsLoader.__getitem__   s=   $/!!?3''jo??-..:"k1UUt{FFO{+=>$W]^^^ Obc\\+//-*M*MNNFO O O O O O O O O O O O O O O O O O{+=>$W\]]] Oab\\+//-*M*MNNFO O O O O O O O O O O O O O OO
 +%%75+g2F#G#GHH}V 4 4446**Mgll4#3\\\BB$[+>>>sZ   B' %*BB' BB' "B#B' '"D	*C?3D?D	DD	DDc                 *    t          | j                  S rO   )r\   rj   r]   s    r$   r^   zOffloadedWeightsLoader.__iter__   s    DM"""r&   c                 *    t          | j                  S rO   )r,   rj   r]   s    r$   r`   zOffloadedWeightsLoader.__len__   s    4=!!!r&   )NNNN)ra   rb   rc   rd   r   r   r   Tensorr   r   r   PathLiker   rR   rU   r^   r`   r(   r&   r$   rf   rf      s          /39= el*+ eC$456 	   (?s ? ? ? ?4# # #" " " " "r&   rf   submodule_namesc                 |    i }|D ]5|                     fd|                                 D                        6|S )a  
    Extract the sub state-dict corresponding to a list of given submodules.

    Args:
        state_dict (`Dict[str, torch.Tensor]`): The state dict to extract from.
        submodule_names (`List[str]`): The list of submodule names we want to extract.
    c                 X    i | ]&\  }}|k    s|                     d z             #||'S ).)rX   )rZ   rT   parammodule_names      r$   
<dictcomp>z1extract_submodules_state_dict.<locals>.<dictcomp>   sJ       C+%%c8I)J)J% U%%%r&   )r;   rF   )rB   r|   resultr   s      @r$   extract_submodules_state_dictr      so     F& 	
 	
 	   ","2"2"4"4  	
 	
 	
 	
 Mr&   rO   )r9   r   collections.abcr   typingr   r   r   r   r   r   r   safetensorsr   r%   r0   r@   r   r{   rz   rI   rK   rf   r   r(   r&   r$   <module>r      s    				 # # # # # # . . . . . . . . . . . .      ! ! ! ! ! !   *  ,. . ."(sBK'7!8 (d3PUP\K\F] ( ( ( (&! ! ! ! !g ! ! !.@" @" @" @" @"W @" @" @"Fd33D.E X\]`Xa      r&   