U
    0-e                     @   s   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dZdd	 Zd
d Zeeejf eeejf dddZG dd deZG dd deZeeejf ee dddZdS )    N)Mapping)DictListOptionalUnion   )is_safetensors_availablec                 C   s   d }t | jdkr"| tj} d}|   }tj	|| d}|d k	rp|d kr\t |j}|t
|jd||< |jdkr|d  }tj||jd|jd}|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   arrayZtensor_fileZ
file_array r!   Y/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/accelerate/utils/offload.pyoffload_weight   s     

r#   c                 C   s|   t |d }|dkrd}|d }|dkr,d}tj| ||dd}t|d d	krV|d	 }t|}|d dkrx|tj}|S )
Nr   r!   )r   r   r	   r   r)r   r   r   r   )tupler   r   lenr   tensorr   r	   )weight_fileweight_infor   r   r   r!   r!   r"   load_offloaded_weight/   s    
r*   c              	   C   s   | d kst | dkrd S tj|d}tj|rXt|ddd}t|}W 5 Q R X ni }||  t|ddd}tj	||dd W 5 Q R X d S )	Nr   
index.jsonr$   zutf-8)encodingw   )indent)
r&   r   r   r   isfileopenjsonloadupdatedump)r   r   Zoffload_index_filefZcurrent_indexr!   r!   r"   save_offload_indexE   s    
r7   )save_dir
state_dictc                 C   sB   t j| dd i }| D ]\}}t||| |d}q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#   r7   )r8   r9   r   nameZ	parameterr!   r!   r"   offload_state_dictV   s
    
r>   c                   @   s8   e Zd ZdZeedddZdd Zdd Zd	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                 C   s   || _ || _d S Nr@   )selfrA   rB   r!   r!   r"   __init__r   s    zPrefixedDataset.__init__c                 C   s   | j | j |  S rC   r@   )rD   keyr!   r!   r"   __getitem__v   s    zPrefixedDataset.__getitem__c                    s   t  fdd jD S )Nc                    s   g | ]}|  jr|qS r!   )
startswithrB   .0rF   rD   r!   r"   
<listcomp>z   s      z,PrefixedDataset.__iter__.<locals>.<listcomp>)iterrA   rK   r!   rK   r"   __iter__y   s    zPrefixedDataset.__iter__c                 C   s
   t | jS rC   )r&   rA   rK   r!   r!   r"   __len__|   s    zPrefixedDataset.__len__N)
__name__
__module____qualname____doc__r   r   rE   rG   rN   rO   r!   r!   r!   r"   r?   i   s
   r?   c                   @   sZ   e Zd ZdZdeeejf ee	ee
jf  edddZedddZd	d
 Zd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`.
    N)r9   save_folderr   c              	      s   |d kr |d kr |d kr t d|d kr,i n| _| _|d krp|d k	rpttj|d}t|}W 5 Q R X |d kr|i n| _	t
 j  _ j fdd j	D  | _d S )NzWNeed either a `state_dict`, a `save_folder` or an `index` containing offloaded weights.r+   c                    s   g | ]}| j kr|qS r!   )all_keysrI   rK   r!   r"   rL      s     
 z3OffloadedWeightsLoader.__init__.<locals>.<listcomp>)
ValueErrorr9   rU   r1   r   r   r   r2   r3   r   r   keysrV   extenddevice)rD   r9   rU   r   rZ   r6   r!   rK   r"   rE      s    zOffloadedWeightsLoader.__init__)rF   c              	   C   s   || j kr| j | S | j| }|dd k	rt s:tdddlm} | jd krTdn| j}||d d|d}||d|}W 5 Q R X d	|kr|	t
t|d	 S |S tj| j| d
}t||S )NZsafetensors_filezRThese offloaded weights require the use of safetensors: `pip install safetensors`.r   )	safe_openr   pt)Z	frameworkrZ   r   r   r
   )r9   r   getr   ImportErrorZsafetensorsr[   rZ   Z
get_tensortogetattrr   r   r   r   rU   r*   )rD   rF   r)   r[   rZ   r6   r'   r(   r!   r!   r"   rG      s    


z"OffloadedWeightsLoader.__getitem__c                 C   s
   t | jS rC   )rM   rV   rK   r!   r!   r"   rN      s    zOffloadedWeightsLoader.__iter__c                 C   s
   t | jS rC   )r&   rV   rK   r!   r!   r"   rO      s    zOffloadedWeightsLoader.__len__)NNNN)rP   rQ   rR   rS   r   r   r   Tensorr   r   r   PathLiker   rE   rG   rN   rO   r!   r!   r!   r"   rT      s       rT   )r9   submodule_namesc                    s.   i }|D ]  |  fdd|  D  q|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                    s,   i | ]$\}}| ks"|  d  r||qS ).)rH   )rJ   rF   parammodule_namer!   r"   
<dictcomp>   s
     z1extract_submodules_state_dict.<locals>.<dictcomp>)r4   r<   )r9   rc   resultr!   rf   r"   extract_submodules_state_dict   s    
rj   )N)r2   r   collections.abcr   typingr   r   r   r   r   r   r   Zimportsr   r#   r*   r7   r   rb   ra   r>   r?   rT   rj   r!   r!   r!   r"   <module>   s   
$@