ó
    Eñ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           ÚU/home/mande/repo/quber/.venv/lib/python3.13/site-packages/accelerate/utils/offload.pyÚoffload_weightr#      sØ   € Ø€Eä
ˆ6�<‰<ÓÐ,Ó,à—‘œUŸ[™[Ó)ˆØˆØ�J‰J‹L×ÑÓ €EÜ—'‘'—,‘,˜~°¸dÐ/CÓD€KØÑØ‰=Ü˜Ÿ™Ó$ˆEØ',´t¸E¿K¹KÓ7HÑIˆÑØ‡z�z�QƒØ�d‘ˆÜ—’˜;¯k©kÀÈEÏKÉKÑX€JØ™!�H€J‰q€MØ×ÑÔØ€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Ø�
Óàˆä�YŠY�{°uÀ3ÑG€Fä
ˆ;�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›àäŸ™Ÿ™ n°lÓCÐÜ	‡w�w‡~�~Ð(×)Ñ)ÜÐ$¨wÒ7¸1Ü ŸIšI a›LˆM÷ 8Ð7ð ˆØ×Ñ˜Ôä	Ð  #°Ò	8¸AÜ�	Š	�-¨1Ò-÷ 
9Ð	8÷ 8Õ7ú÷ 
9Õ	8ús   Á"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   € ô ‡K‚K� 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
)ÚPrefixedDatasetéh   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Ÿ{™{˜m¨C¨5Ð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   € Ü D§L¢LÓP¢L˜S·N±NÀ4Ç;Á;×4O—S¡LÑ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Ü”b—g‘g—l‘l ;°Ó=Ô>À!ÜŸ	š	 !›�÷ ?à ™=‘R¨eˆŒ
Ü˜TŸ_™_×1Ñ1Ó3Ó4ˆŒØ�‰×Ñ¨T¯ZªZÓTªZ cÀdÇmÁmÑ;SŸc©ZÑ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Ñ'Ð'Ø—j‘j ‘oˆØ�?‰?Ð-Ó.Ñ:Ø"Ÿk™kÑ1‘U°t·{±{ˆFØˆFðOÜ˜{Ð+=Ñ>È$ÐW]Ò^ÐbcØŸ\™\¨+¯/©/¸-ÈÓ*MÓN�F÷ _ð ˜+Ó%ØŸ™¤7¬5°+¸gÑ2FÓ#GÓH�à�}‰}¤§¢¨VÓ 4Ó4ØŸ™ 6Ó*�ØˆMä—g‘g—l‘l 4×#3Ñ#3¸°u¸D°\ÓBˆÜ$ [Ó>Ð>÷ _Õ^ûäó Oä˜{Ð+=Ñ>È$ÐW\Ò]ÐabØŸ\™\¨+¯/©/¸-ÈÓ*MÓN�F÷ ^×]×]Ñ]úð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   € Ü�D—M‘MÓ"Ð"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ðð ˜e C¨¯©Ð$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ôâ"4‘J�CØÓ%¨¯©¸ÀcÑ8I×)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    ðó Û 	Ý #ß "ã Û Ý !ôò*ò,.ð"(  s¨B¯K©KÐ'7Ñ!8ð (ÀdÈ3ÐPU×P\ÑP\ÐK\ÑF]ô (ô&!�gô !ô.@"˜Wô @"ðF¨d°3¸¿¹Ð3DÑ.Eð ÐX\Ð]`ÑXaõ r$   