
    9i                        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y)    N)Mapping)DictListOptionalUnion   )is_safetensors_availablec                    d }t        | j                        dk(  r!| j                  t        j                        } d}| j                         j                         }t        j                  j                  || d      }|2|t        |j                        }|t        |j                        d||<   |j                  dk(  r|d    }t        j                  ||j                  d|j                        }|d d  |d d  |j                          |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           b/var/www/html/backtest/airagagent/rag_env/lib/python3.12/site-packages/accelerate/utils/offload.pyoffload_weightr&      s    E
6<<,,U[[)JJL E'',,~+d/CDK=$E',tEKK7HIkzzQd;ekkEKKXJ!HJqML    c                    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|j                  t        j                        }|S )
Nr    )r   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
YY{%u3GF
;w A%\\&!F7z)U^^,Mr'   c                    | t        |       dk(  ry t        j                  j                  |d      }t        j                  j	                  |      r-t        |dd      5 }t        j                  |      }d d d        ni }j                  |        t        |dd      5 }t        j                  ||d       d d d        y # 1 sw Y   JxY w# 1 sw Y   y xY w)	Nr   
index.jsonr*   z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@   E   s    }E
anlC	ww~~()$cG< 	) IIaLM	) 	) 	 #	8 .A		-1-. .	) 	). .s   CCC
Csave_dir
state_dictc                     t        j                  | d       i }|j                         D ]  \  }}t        ||| |      } t	        ||        y)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   V   sQ     KK4(E%++- Giy$FG uh'r'   c                   2    e Zd ZdZdedefdZd Zd Zd Z	y)	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                      || _         || _        y NrL   rM   )selfrL   rM   s      r%   __init__zPrefixedDataset.__init__r   s    r'   c                 <    | j                   | j                   |    S rO   rP   rQ   keys     r%   __getitem__zPrefixedDataset.__getitem__v   s    ||t{{mC5122r'   c                     t        | j                  D cg c]   }|j                  | j                        s|" c}      S c c}w rO   )iterrL   
startswithrM   rT   s     r%   __iter__zPrefixedDataset.__iter__y   s.    DLLPSCNN4;;4OSPQQPs
    A A c                 ,    t        | j                        S rO   )r,   rL   rQ   s    r%   __len__zPrefixedDataset.__len__|   s    4<<  r'   N)
__name__
__module____qualname____doc__r   r   rR   rV   rZ   r]   r)   r'   r%   rK   rK   i   s*      3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y)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|| _        || _        |I|Gt        t        j
                  j                  |d            5 }t        j                  |      }d d d        |i n|| _	        t        | j                  j                               | _        | j                  j                  | j                  D cg c]  }|| j                  vs| c}       || _        y # 1 sw Y   xY wc c}w )NzWNeed either a `state_dict`, a `save_folder` or an `index` containing offloaded weights.r2   )
ValueErrorrB   rd   r8   r   r   r   r9   r:   r!   r   keysall_keysextenddevice)rQ   rB   rd   r!   rj   r>   rU   s          r%   rR   zOffloadedWeightsLoader.__init__   s     +"5%-vww * 2"
&=[4bggll;=> %!		!% =Re
T__1134TZZTc3dmm;ScTU% % Us   C,C8C8,C5rU   c                 0   || j                   v r| j                   |   S | j                  |   }|j                  d      t               st	        d      ddlm} | j                  dn| j                  } ||d   d|      5 }|j                  |j                  d|            }d d d        d	|v r"j                  t        t        |d	               S S t        j                  j                  | j                  | d
      }t!        ||      S # 1 sw Y   jxY w)Nsafetensors_filezRThese offloaded weights require the use of safetensors: `pip install safetensors`.r   )	safe_openr   pt)	frameworkrj   r   r   r   )rB   r!   getr	   ImportErrorsafetensorsrm   rj   
get_tensortogetattrr   r   r   r   rd   r0   )rQ   rU   r/   rm   rj   r>   r-   r.   s           r%   rV   z"OffloadedWeightsLoader.__getitem__   s   $//!??3''jjo??-.:+-!"vww-"kk1Ut{{F;'9:dSYZ K^_koomS&IJK +%yyG0D!EFFggll4#3#3uD\B$[+>>K Ks   "DDc                 ,    t        | j                        S rO   )rX   rh   r\   s    r%   rZ   zOffloadedWeightsLoader.__iter__   s    DMM""r'   c                 ,    t        | j                        S rO   )r,   rh   r\   s    r%   r]   zOffloadedWeightsLoader.__len__   s    4==!!r'   )NNNN)r^   r_   r`   ra   r   r   r   Tensorr   r   r   PathLiker   rR   rV   rZ   r]   r)   r'   r%   rc   rc      sm     /39=ell*+ eC$456 	(?s ?.#"r'   rc   submodule_namesc                     i }|D ]N  }|j                  | j                         D ci c]!  \  }}||k(  s|j                  |dz         r||# c}}       P |S c c}}w )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.
    .)r;   rF   rY   )rB   rz   resultmodule_namerU   params         r%   extract_submodules_state_dictr      ss     F& 	
 	 #-"2"2"4C+%c8I)J U
	
	
 Ms   &ArO   )r9   r   collections.abcr   typingr   r   r   r   r   r   r   importsr	   r&   r0   r@   r   ry   rx   rI   rK   rc   r   r)   r'   r%   <module>r      s     	 # . .   -*,."(sBKK'7!8 (d3PUP\P\K\F] (&!g !.="W ="@d33D.E X\]`Xa r'   