
    sgU                     |   d Z ddlZddlmZ ddlmZmZ ddlZddlm	Z
 ddl	ZddlmZ ddlmZmZ ddlZddlmZmZ dd	lmZ  e       rddlZ e       rdd
lmZ ddlmZ  ej:                  e      Z	 ddZ dee!   dejD                  dee!e
jD                  f   de!dee!   ejD                  ff
dZ#d Z$d Z%d Z&d Z'y)z!PyTorch - Flax general utilities.    N)UnpicklingError)DictTuple)
from_bytes)flatten_dictunflatten_dict   )is_safetensors_availableis_torch_available)logging)	safe_open)	load_filec                 ~   |st         j                  j                  |      }t        j	                  d|        |j                  d      rCi }t        |d      5 }|j                         D ]  }|j                  |      ||<    	 ddd       n`	 ddl	}ddl
m}	 |	rd
dini }
 |j                  |fddi|
}t        j	                  dt!        d |j#                         D              dd       t%        ||       }|S t'        ||       }|S # 1 sw Y   %xY w# t        t        f$ r t        j                  d	        w xY w)z(Load pytorch checkpoints in a flax modelzLoading PyTorch weights from .safetensorsflax)	frameworkNr   r	   #is_torch_greater_or_equal_than_1_13zLoading a PyTorch model in Flax, requires both PyTorch and Flax to be installed. Please see https://pytorch.org/ and https://flax.readthedocs.io/en/latest/installation.html for installation instructions.weights_onlyTmap_locationcpuzPyTorch checkpoint contains c              3   <   K   | ]  }|j                           y wN)numel).0ts     [/var/www/html/venv/lib/python3.12/site-packages/transformers/modeling_flax_pytorch_utils.py	<genexpr>z=load_pytorch_checkpoint_in_flax_state_dict.<locals>.<genexpr>N   s     :e1779:es   ,z parameters.)ospathabspathloggerinfoendswithr   keys
get_tensortorchpytorch_utilsr   ImportErrorModuleNotFoundErrorerrorloadsumvalues"convert_pytorch_state_dict_to_flax*convert_pytorch_sharded_state_dict_to_flax)
flax_modelpytorch_checkpoint_path
is_shardedallow_missing_keyspt_pathpt_state_dictfkr(   r   weights_only_kwargflax_state_dicts               r   *load_pytorch_checkpoint_in_flax_state_dictr<   1   sM   
 ''//"9:3G9=>N+M7f5 7 7A'(||AM!$77 7
N <_.$!7df&EJJwYUYFXYMKK6s:emNbNbNd:e7efg6hhtuv<]JW  EE\^hi17 7  !45 %
 s   *D

D 
D&D<pt_tuple_key	pt_tensorrandom_flax_state_dictmodel_prefixreturnc                    dt         t           dt        ffd}| dd dz   }| d   dv r ||      r||fS | dd dz   }| d   d	k(  r ||       s||fS | dd d
z   }| d   dk(  r ||       s||fS | dd dz   }| d   dk(  r ||      r||fS | dd dz   }| d   dk(  r/|j                  dk(  r  ||       s|j	                  dddd      }||fS | dd dz   }| d   dk(  r ||       s|j
                  }||fS | dd dz   }| d   dk(  r||fS | dd dz   }| d   dk(  r||fS d}| ddd   dk(  r	| d   dz   }n| ddd   dk(  r| d   dz   }|| dd |fz   }||fS | |fS )zYRename PT weight names to corresponding Flax weight names and reshape tensor if necessarykeyrA   c                 D    t        t              | f| z   hz        dkD  S )zAChecks if `key` of `(prefix,) + key` is in random_flax_state_dictr   )lenset)rC   r@   r?   s    r   is_key_or_prefix_key_in_dictzCrename_key_and_reshape_tensor.<locals>.is_key_or_prefix_key_in_dict_   s+    3-.#7L1MMNQRRR    N)scale)weightgamma)meanrunning_mean)varrunning_var)	embeddingrK   )kernel         r	   r   rK   rL   )biasbeta)parametrizations	original0_g)rZ   	original1_v)r   strboolndim	transposeT)r=   r>   r?   r@   rG   renamed_pt_tuple_keynames     ``   r   rename_key_and_reshape_tensorrg   W   sX   S%* S S
 (,z9B..3OPd3e#Y.. (,y8B>)2N|2\#Y.. (,x7B=(1Ml1[#Y.. (,~=B8#(DEY(Z#Y.. (,{:B8#	!(;D`amDn''1a3	#Y.. (,{:B8#,H,VKK	#Y.. (,{:B7"#Y.. (,y8B6!#Y.. DBEE??B$&	be!e	 A	AB$&+CR0D7:#Y..""rH   c           
         t               xr: t        t        t        | j	                                     t
        j                        }|rt
        j                  nd}| j                         D ci c]  \  }}||j                   }}}|rX| j                         D ]E  \  }}|j                  |k(  r|j                         }|j                         j                         | |<   G |j                  }d|j                  v r|j                  d   }n|j                  }t        |      }	d|j                  v r)t        |j                  d         }
|	j!                  |
       i }||vxr2 || j#                         D ch c]  }|j%                  d      d    c}v }||v xr2 || j#                         D ch c]  }|j%                  d      d    c}v}| j                         D ]}  \  }}t'        |j%                  d            }||   |k(  }|d   |k(  }|r|r|dd  }t)        |||	|      \  }}|f|z   |	v }|r|r|f|z   }||	v rH|j*                  |	|   j*                  k7  r,t-        d| d|	|   j*                   d	|j*                   d      d|j                  v rd
|d   v sd|d   v rt/        j0                  |      |d|z   <   d|d   v r|j3                  |d        |st/        j0                  |      n$t/        j0                  |t.        j                        |d|z   <   ?|st/        j0                  |      n$t/        j0                  |t.        j                        ||<    t5        |      S c c}}w c c}w c c}w )Nbfloat16paramsbatch_stats.r   r	   1PyTorch checkpoint seems to be incorrect. Weight  was expected to be of shape 	, but is rM   rI   rO   rk   num_batches_trackeddtyperj   )r   
isinstancenextiterr/   r(   Tensorri   itemsrs   floatr   numpybase_model_prefixrj   r   updater&   splittuplerg   shape
ValueErrorjnpasarraypopr   )r7   r2   from_binri   r9   vweight_dtypesr@   flax_model_paramsr?   flax_batch_statsr;   $load_model_with_head_into_base_model$load_base_model_into_model_with_headpt_keyr>   r=   is_bfloat_16has_base_model_prefixflax_keyflax_tensorrequire_base_model_prefixs                         r   r0   r0      s   !#d
4]=Q=Q=S8T3UW\WcWc(dH!)u~~zH,9,?,?,ABDAqQZBMB!'') 	/DAqww("GGI uuw}}M!		/ //L :$$$&--h7&--)*;< 
)))'
(9(9-(HI%%&67O,8@Q,Q ,-2D2D2FGQaGG ) -9<M,M ,m6H6H6JKQWWS\!_KK )
 +002 ,	V\\#./$V,8 !-Q< ?/4I'+L !>)%;\!
+
 &2Oh$>BX$X!/4M$1H--  $:8$D$J$JJ GxOl-h7==>iHYHYGZZ[]  J---"%(2,)>?B{{;?W 08 ;<$4##Hd3 1=K(#++kadamamBn K(23 1=K(#++kadamamBn H%U,\ /**_ C4 H Ls   .M(5M.-M3c                    dd l }ddlm} i }| D ]O  }|rddini } |j                  |fi |}|j	                         D 	ci c]  \  }}	||	j
                   }
}}	|j	                         D 	ci c]M  \  }}	||	j
                  |j                  k7  r|	j                         n|	j                         j                         O }}}	|j                  }d|j                  v rB|j                  d   }t        |      }|j                  t        |j                  d                n|j                  }t        |      }||vxr2 ||j                         D ch c]  }|j                  d      d    c}v }||v xr2 ||j                         D ch c]  }|j                  d      d    c}v}|j	                         D ]  \  }}t        |j                  d            }|
|   |j                  k(  }|d   |k(  }|r|r|dd  }t!        ||||      \  }}|f|z   |v }|r|r|f|z   }||v rH|j"                  ||   j"                  k7  r,t%        d	| d
||   j"                   d|j"                   d      d|j                  v rd|d   v rt'        j(                  |      |d|z   <   d|d   v rt'        j(                  |      |d|z   <   d|d   v r|j+                  |d        #|st'        j(                  |      n$t'        j(                  |t&        j                        |d|z   <   g|st'        j(                  |      n$t'        j(                  |t&        j                        ||<    R t-        |      S c c}	}w c c}	}w c c}w c c}w )Nr   r	   r   r   Trk   rj   rl   rm   rn   ro   rM   rI   rp   rO   rq   rr   rt   )r(   r)   r   r-   ry   rs   ri   r{   rz   r|   rj   r   r}   r&   r~   r   rg   r   r   r   r   r   r   )shard_filenamesr2   r(   r   r;   
shard_filer:   r7   r9   r   r   r@   r   r?   r   r   r   r>   r=   r   r   r   r   r   s                           r   r1   r1      s   B O% K
7Znd3`b"

:D1CD0=0C0C0EF1AGGFFYfYlYlYn
QUQRTUAAGGu~~5qwwy1779??;LL
 
 "33 J--- * 1 1( ;%12C%D"")),z7H7H7W*XY * 1 1%12C%D"0<DU0U 0
m6H6H6JKQWWS\!_KK 	- 1=@Q0Q 0
-:L:L:N OQa OO 	- "/!4!4!6 /	FI c!23L(0ENNBL %1O|$C!38M+AB/ %Bi)?%!Hk *6((BF\(\%38Q(?X511$$(>x(H(N(NN$KF8Sp1(;AAB)KL]L]K^^_a  
 1 11Xb\)CF;;{C[O$4x$?@HRL(CF;;{C[O$4x$?@(HRL8#''$7 5ACKK,ckkR]eheqeqFr  h 67 5ACKK,ckkR]eheqeqFr  )[/	9KX /**Q G
" L !Ps   M-.AM3M9M>c                    t         j                  j                  |      }t        j	                  d|        t        t        d| j                  j                  z         }|j                  d      rt        |      }t        |d      }n1t        |d      5 }	 t        ||j                               }	 d	d	d	       t#        |       S # t        $ r t!        d| d      w xY w# 1 sw Y   1xY w)
(Load flax checkpoints in a PyTorch modelzLoading Flax weights from Flaxr   rl   )seprbzUnable to convert z  to Flax deserializable object. N)r    r!   r"   r#   r$   getattrtransformers	__class____name__r%   safe_load_filer   openr   readr   EnvironmentError"load_flax_weights_in_pytorch_model)modelflax_checkpoint_pathflax_clsr;   state_fs        r   %load_flax_checkpoint_in_pytorch_modelr   Q  s    77??+?@
KK,-A,BCD |Veoo.F.F%FGH $$^4()=>(cB&- 	tt",Xw||~"F	t .e_EE # t&);<P;QQq'rsst	t 	ts   C"CCC""C+c                 B
   	 ddl }t        t        j                  j                  d |            j                         }t        |      r6t        j                  d       t        j                  j                  d |      }t        |      }| j                         }| j                  |v xr< | j                  |j                         D ch c]  }|j                  d      d    c}v}| j                  |vxr< | j                  |j                         D ch c]  }|j                  d      d    c}v }g }	t!        |j                               }
|j#                         D ]Q  \  }}|d   | j                  k(  }dj%                  | j                  f|z         |v }|r|r|dd }n|r|r| j                  f|z   }|d	   d
k(  rA|j&                  dk(  r2dj%                  |      |vr|dd	 dz   }t)        j*                  |d      }n_|d	   d
k(  r(dj%                  |      |vr|dd	 dz   }|j,                  }n/|d	   dv r	|dd	 dz   }nd|d	   v r	|dd	 dz   }nd|d	   v r|dd	 dz   }d|v rdj%                  |dd       }ndj%                  |      }i }|D ]b  }|j                  d      }d}|ddd   ddgk(  r	|d   dz   }n|ddd   ddgk(  r|d   dz   }|D|dd |gz   }dj%                  |      }|||<   d ||v r||   }||v r|j.                  ||   j.                  k7  r,t1        d| d||   j.                   d|j.                   d      t3        |t4        j6                        st5        j8                  |      n|} |j:                  |      ||<   |
j=                  |       A|	j?                  |       T | jA                  |       tC        |
      }
tE        |	      dkD  r_t        j                  d| jF                  jH                   d |	 d!| jF                  jH                   d"| jF                  jH                   d#	       n-t        j                  d$| jF                  jH                   d%       tE        |
      dkD  r2t        j                  d&| jF                  jH                   d'|
 d(       | S t        j                  d)| jF                  jH                   d*| jF                  jH                   d+       | S # t        t        f$ r t        j	                  d        w xY wc c}w c c}w ),r   r   NzLoading a Flax weights in PyTorch, requires both PyTorch and Flax to be installed. Please see https://pytorch.org/ and https://flax.readthedocs.io/en/latest/installation.html for installation instructions.c                 <    | j                   t        j                  k(  S r   )rs   r   ri   )xs    r   <lambda>z4load_flax_weights_in_pytorch_model.<locals>.<lambda>u  s    CLLAX rH   zFound ``bfloat16`` weights in Flax model. Casting all ``bfloat16`` weights to ``float32`` before loading those in PyTorch model.c                 ~    | j                   t        j                  k(  r| j                  t        j
                        S | S r   )rs   r   ri   astypenpfloat32rt   s    r   r   z4load_flax_weights_in_pytorch_model.<locals>.<lambda>~  s'    8T6==4 Z` rH   rl   r	   rI   rR   rS   rV   )rU   rT   r   r	   )rJ   rQ   rM   )rN   rO   )rP   rk   rY   rT   rZ   r[   r\   r]   r^   r_   z.Flax checkpoint seems to be incorrect. Weight rn   ro   zQSome weights of the Flax model were not used when initializing the PyTorch model z: z,
- This IS expected if you are initializing z from a Flax model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a FlaxBertForPreTraining model).
- This IS NOT expected if you are initializing z from a Flax model that you expect to be exactly identical (e.g. initializing a BertForSequenceClassification model from a FlaxBertForSequenceClassification model).z3All Flax model weights were used when initializing z.
zSome weights of zE were not initialized from the Flax model and are newly initialized: zo
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.zAll the weights of z were initialized from the Flax model.
If your task is similar to the task the model of the checkpoint was trained on, you can already use z* for predictions without further training.)%r(   r*   r+   r#   r,   r   jax	tree_utiltree_mapr/   anywarning
state_dictr|   r&   r~   rF   ry   joinrb   r   rc   rd   r   r   ru   r   ndarrayr   
from_numpyremoveappendload_state_dictlistrE   r   r   )pt_model
flax_stater(   is_type_bf16r;   pt_model_dictr9   r   r   unexpected_keysmissing_keysflax_key_tupler   r   r   r   special_pt_namesrC   key_componentsrf   key_to_checks                        r   r   r   g  s      6 67XZd efmmoL
< 	5	
 ]]++`bl

 #:.O'')M,4,F,F*,T ,""MDVDVDX*Yq1773<?*YY ) -5,F,Fj,X ,""@R@R@T&U1qwws|A&UU )
 O}))+,L'6'<'<'> A-# .q 1X5O5O O$'HHh.H.H-J^-[$\`m$m! 04I+AB/N16O&88:^KN ")k.>.>!.CQ_H`huHu+CR0;>N--\BKB8+0HP]0]+CR0;>N%--KB#99+CR0;>N ~b))+CR03DDNnR((+CR03CCNJ&xxqr 23Hxx/H   
	5C YYs^NDbe!e$);[(II%b)D0A&+={*KK%b)D0!/!4v!="xx714 .
	5 '''1H}$  M($;$A$AA D^DT U&&3H&=&C&C%DIkN_N_M``ac  >HUWU_U_=`bjj5fq*:%*:*:;*Gh'##H- ""8,CA-F ]+ %L
?a""++,B.? @""++, -88@8J8J8S8S7T U9	9	
 	LXM_M_MhMhLiilmn
<1x11::; <)N +55	
 O 	!("4"4"="=!> ?##+#5#5#>#>"??ik	
 OI ,- 	

 	2 +Z 'Vs   S. TT.&T)F)(__doc__r    pickler   typingr   r   r   	jax.numpyr{   r   r   flax.serializationr   flax.traverse_utilr   r   r    r
   r   utilsr   r(   safetensorsr   safetensors.flaxr   r   
get_loggerr   r#   r<   r`   r   rg   r0   r1   r   r    rH   r   <module>r      s    ( 	 "  
   ) ;  :  %< 
		H	% IN#L@#*@#zz@# !ckk!12@# 	@#
 Cj"**@#FT+xS+vF,IrH   