
    ;i                        S SK r S SKrS SKJr  S SKJrJr  S SKrS SK	r	S SK
Jr  SS jrS rS rS\\\R                   4   S	\\\	R$                  4   4S
 jr " S S\5      r " S S\5      rS	\\\	R$                  4   S\\   4S jrg)    N)Mapping)OptionalUnion)	safe_openc                    S n[        U R                  5      S:X  a!  U R                  [        R                  5      n SnU R                  5       R                  5       n[        R                  R                  X! S35      nUb2  Uc  [        UR                  5      nU[        UR                  5      S.X1'   UR                  S:X  a  US    n[        R                  " XeR                  SUR                  S9nUS S  US S & UR                  5         U$ )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           h/home/dmtnaga/Documents/work/airagagent/rag_env/lib/python3.13/site-packages/accelerate/utils/offload.pyoffload_weightr#      s    E
6<<,,U[[)JJL E'',,~d/CDK=$E',tEKK7HIzzQd;kkEKKXJ!HJqML    c                 "   [        US   5      nUS:X  a  SnUS   nUS:X  a  Sn[        R                  " XUSS9n[        US   5      S	:X  a  US	   n[        R
                  " U5      nUS   S:X  a  UR                  [        R                  5      nU$ )
Nr    )   r
   r   r   r)r
   r   r   r   )tupler   r   lenr   tensorr   r   )weight_fileweight_infor   r
   r   s        r"   load_offloaded_weightr.   .   s    +g&'E{ E
YY{u3GF
;w A%\\&!F7z)U^^,Mr$   c                    U b  [        U 5      S:X  a  g [        R                  R                  US5      n[        R                  R	                  U5      (       a*  [        USS9 n[        R                  " U5      nS S S 5        O0 nWR                  U 5        [        USSS9 n[        R                  " XCSS9  S S S 5        g ! , (       d  f       NI= f! , (       d  f       g = f)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   s    }E
anlC	ww~~())$w71 IIaLM 87 	 #	8A		-1- 
9	8 87 
9	8s   "B? C?
C
Csave_dir
state_dictc                     [         R                  " U SS9  0 nUR                  5        H  u  p4[        XCXS9nM     [	        X 5        g)z
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>   )r?   r@   r   name	parameters        r"   offload_state_dictrG   U   sB     KK4(E%++-yF . u'r$   c                   <    \ rS rSrSrS\S\4S jrS rS r	S r
S	rg
)PrefixedDataseth   z
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                     Xl         X l        g NrK   rL   )selfrK   rL   s      r"   __init__PrefixedDataset.__init__q   s    r$   c                 <    U R                   U R                   U 3   $ rN   rO   rP   keys     r"   __getitem__PrefixedDataset.__getitem__u   s    ||t{{mC5122r$   c                     [        U R                   Vs/ s H&  oR                  U R                  5      (       d  M$  UPM(     sn5      $ s  snf rN   )iterrK   
startswithrL   rT   s     r"   __iter__PrefixedDataset.__iter__x   s0    DLLPLSNN4;;4OSLPQQPs
   #AAc                 ,    [        U R                  5      $ rN   )r*   rK   rP   s    r"   __len__PrefixedDataset.__len__{   s    4<<  r$   rO   N)__name__
__module____qualname____firstlineno____doc__r   r   rQ   rV   r[   r_   __static_attributes__r&   r$   r"   rI   rI   h   s*      3R!r$   rI   c                       \ rS rSrSr    SS\\\\R                  4      S\\
\\R                  4      S\\   4S jjrS\4S	 jrS
 rS rSrg)OffloadedWeightsLoader   a  
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`.
Nr@   save_folderr   c                    Uc  Uc  Uc  [        S5      eUc  0 OUU l        X l        UcK  UbH  [        [        R
                  R                  US5      5       n[        R                  " U5      nS S S 5        Uc  0 OUU l	        [        U R                  R                  5       5      U l        U R                  R                  U R                   Vs/ s H  ofU R                  ;  d  M  UPM     sn5        X@l        g ! , (       d  f       N= fs  snf )NzWNeed either a `state_dict`, a `save_folder` or an `index` containing offloaded weights.r0   )
ValueErrorr@   rj   r6   r   r   r   r7   r8   r   r   keysall_keysextenddevice)rP   r@   rj   r   rp   r<   rU   s          r"   rQ   OffloadedWeightsLoader.__init__   s     +"5%-vww * 2"
&=[4bggll;=>!		! ? =Re
T__1134TZZTZcdmm;ScZTU ?> Us   C7D#D7
DrU   c                 2   XR                   ;   a  U R                   U   $ U R                  U   nUR                  S5      b  U R                  c  SOU R                  nS n [	        US   SUS9 nUR                  UR                  SU5      5      nS S S 5        SU;   a"  UR                  [        [        US   5      5      nUR                  [        R                  " U5      :w  a  UR                  U5      nU$ [        R                  R                  U R                  U S35      n[        Xb5      $ ! , (       d  f       N= f! [         aN    [	        US   SSS9 nUR                  UR                  SU5      5      nS S S 5         M  ! , (       d  f        N= ff = f)Nsafetensors_filer   pt)	frameworkrp   r   r
   r	   )r@   r   getrp   r   
get_tensor	TypeErrortogetattrr   r   r   r   rj   r.   )rP   rU   r-   rp   r+   r<   r,   s          r"   rV   "OffloadedWeightsLoader.__getitem__   s\   //!??3''jjo??-.:"kk1Ut{{FFO{+=>$W]^bc\\+//-*MNF _ +%75+g2F#GH}}V 446*Mggll4#3#3uD\B$[>> _^ O{+=>$W\]ab\\+//-*MNF ^]]]OsH   D> ,"D-D> -
D;7D> ;D> >F"F8F
F	FFc                 ,    [        U R                  5      $ rN   )rY   rn   r^   s    r"   r[   OffloadedWeightsLoader.__iter__   s    DMM""r$   c                 ,    [        U R                  5      $ rN   )r*   rn   r^   s    r"   r_   OffloadedWeightsLoader.__len__   s    4==!!r$   )rn   rp   r   rj   r@   )NNNN)ra   rb   rc   rd   re   r   dictr   r   Tensorr   r   PathLiker   rQ   rV   r[   r_   rf   r&   r$   r"   rh   rh      sw     9=9=#'T#u||"345 eC$456  	(?s ?4#"r$   rh   submodule_namesc                     0 nU HW  nUR                  U R                  5        VVs0 s H'  u  pEXC:X  d  UR                  US-   5      (       d  M%  XE_M)     snn5        MY     U$ s  snnf )z
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.
.)r9   rD   rZ   )r@   r   resultmodule_namerU   params         r"   extract_submodules_state_dictr      so     F& 	 #-"2"2"4"4JC%c8I)J 
"4	
 ' Ms   $A"A"rN   )r7   r   collections.abcr   typingr   r   r   r   r   safetensorsr   r#   r.   r>   r   r   r   r   rG   rI   rh   r   r   r&   r$   r"   <module>r      s     	 # "   !*,."(sBKK'7!8 (d3PUP\P\K\F] (&!g !.@"W @"Fd33D.E X\]`Xa r$   