
     Ti                        S SK Jr  S SKJrJr  S SKrS SKrSS jr       S	                     S
S jjr	          S                     SS jjr
       S               SS jjrg)    )annotations)AnySequenceNc                 F     SSK Jn   U (       d   e g! [         a     gf = f)z8Tells if package *transformers* contains the phi3 model.r   
Phi3ConfigFT)transformersr   ImportErrorr   s    h/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxscript/tools/transformers_models/phi3.pyhas_phi3r      s+    +z   s    
  c
                   [         R                  R                  R                  X/U5      n
S nU(       a*  [        R
                  " [        R                  " X5      5      nS nU(       a8  US:  d   S5       e[         R                  R                  R                  X/U5      nS nS nS nU	(       a  US:  d   S5       eUS:  d   S5       eUS:  d   S5       e[         R                  R                  R                  U /U5      n[         R                  R                  R                  X/U5      n[         R                  R                  R                  U /U5      nU
UUUUU4$ )Nr   ztype_vocab_size is nullz type_sequence_label_size is nullznum_labels is nullznum_choices is null)
onnxscripttoolstransformers_models
ids_tensortorchtrilones)
batch_size
seq_length
vocab_sizetype_sequence_label_sizetype_vocab_size
num_labelsnum_choicesuse_input_maskuse_token_type_ids
use_labels	input_ids
input_masktoken_type_idssequence_labelstoken_labelschoice_labelss                   r   _prepare_config_and_inputsr%      sb      44??	 *I JZZ

: BC
N"=$=="#))==HH$o
 OLM'!+O-OO+A~333~Q5 55$**>>IIL2
 "'';;FF$j
 #((<<GGL+

 	     c
                (  ^ SSK Jn
Jm  SSSS.0nU	(       a  UR                  SSSS.05        U
" UUUUUUU[	        SUS-
  5      S9nU(       a  Xl        U	(       a\   " U4S	 jS
[        R                  R                  5      nSS jn/ nU  H  u  nnUR                  U" UUU5      5        M!     U" U5      X4$  " U4S jS[        R                  R                  5      nSS jn/ nU  H  u  nnUR                  U" UUU5      5        M!     U" U5      X4$ )a0  
Returns a model.
See `PhiConfig
<https://huggingface.co/docs/transformers/main/en/model_doc/phi#transformers.PhiConfig>`_.
The parameters are chosen for a unit test configuration from `test_modeling_phi.py
<https://github.com/huggingface/transformers/blob/main/tests/models/phi/test_modeling_phi.py>`_.
r   )r   	Phi3Modelbatchlength)r      r+   i }  )hidden_sizenum_hidden_layersr   intermediate_sizemax_position_embeddingsnum_attention_headsnum_key_value_headspad_token_idc                  2   >^  \ rS rSrUU 4S jrS rSrU =r$ ).get_phi3_model.<locals>.Phi3ModelWrapperNoMaskw   c                <   > [         TU ]  5         T" U5      U l        g Nsuper__init__modelselfconfigr(   	__class__s     r   r:   7get_phi3_model.<locals>.Phi3ModelWrapperNoMask.__init__x   s     "&v.
r&   c                B    U R                  XSS9nUR                  5       $ )NF)attention_mask	use_cacher;   to_tuple)r=   r   rB   model_outputs       r   forward6get_phi3_model.<locals>.Phi3ModelWrapperNoMask.forward|   s+    #zz  *   $,,..r&   r;   __name__
__module____qualname____firstlineno__r:   rG   __static_attributes____classcell__r?   r(   s   @r   Phi3ModelWrapperNoMaskr4   w   s    // /r&   rR   c                .    [        U UUSS9u  nnnnnnX54$ NT)r   r   r   r   r%   )r)   seqr   r   _r    s         r   generate_example_inputs_no_mask7get_phi3_model.<locals>.generate_example_inputs_no_mask   s:     + %#	 ((r&   c                  2   >^  \ rS rSrUU 4S jrS rSrU =r$ )(get_phi3_model.<locals>.Phi3ModelWrapper   c                <   > [         TU ]  5         T" U5      U l        g r7   r8   r<   s     r   r:   1get_phi3_model.<locals>.Phi3ModelWrapper.__init__   s    G"6*DJr&   c                B    U R                  USS9nUR                  5       $ )NF)rC   rD   )r=   r   rF   s      r   rG   0get_phi3_model.<locals>.Phi3ModelWrapper.forward   s#    ::i5:AL((**r&   rI   rJ   rQ   s   @r   Phi3ModelWrapperr[      s    	+	+ 	+r&   ra   c                $    [        U UUSS9tnnU4$ rT   rU   )r)   rV   r   r   rW   s        r   generate_example_inputs/get_phi3_model.<locals>.generate_example_inputs   s-     '!	
	
 |r&   )r)   intrV   re   r   re   )
r	   r   r(   updatemin_attn_implementationr   nnModuleappend)
input_dimsr,   r-   r   r.   r/   r0   r1   rh   	with_maskr   dynamic_shapesr>   rR   rX   example_args_collectionbsra   rc   r(   s                       @r   get_phi3_modelrr   O   s"   & 3W23Nqg(";<=++ 7//
Q/	F &:#		/UXX__ 		/	)  #%DAq#**+J1aQ[+\]  &f-/FVV+588?? +" !1&&'>q!Z'PQ  F#%<LLr&   c                   US:X  a;  [        [        R                  R                  R	                  XPU5      SUSSSSSUUS9
nOUS	:X  a;  [        [        R                  R                  R	                  XPU5      S
US
S
SSS
UUS9
nOQUS;   a;  [        [        R                  R                  R	                  XPU5      SUSSSSSUUS9
nO[        SU< S35      e[        S0 UD6$ )ay  
Returns a model Phi to test or benchmark.

Args:
    warmup: Number of inputs to generate.
    repeat: Number of inputs to generate for repeat.
    config: small, medium or large
    num_hidden_layers: number of hidden layers
    implementation: eager or sdpa
    with_mask: One or two inputs.
    dynamic_shapes: dynamic shapes or not

Returns:
    Model and list of inputs.
small    c               )
rl   r,   r-   r   r.   r/   r0   r1   rh   rm   mediumi   )
rl   r,   r-   r   r.   r0   r1   r/   rh   rm   )largedefaulti   i   i    NzUnexpected configuration . )dictr   r   r   get_input_dims_for_llm
ValueErrorrr   )warmuprepeatr>   r-   implementationrn   rm   	conf_dicts           r   get_phi3_model_from_configr      s   0 !'';;RR / $' ! !!/
	 
8	!'';;RR /" ! !$(!/
	 
'	'!'';;RR /" " $$(!/
	 4VJa@AA&I&&r&   )returnbool)rz   rw      ry   FFF)r   re   r   re   r   re   r   re   r   re   r   re   r   re   r   r   r   r   r   r   r   ztuple[Any, ...])
))      )   r   )      ru   rz   rv   rw   rx   ry   rz   eagerT)rl   zSequence[tuple[int, int]]r,   re   r-   re   r   re   r.   re   r/   re   r0   re   r1   re   rh   strrm   r   r   0tuple[Any, list[tuple[torch.Tensor, ...]], dict])   
   rt   r+   r   FT)r   re   r   re   r>   r   r-   re   r   r   rn   r   rm   r   r   r   )
__future__r   typingr   r   r   $onnxscript.tools.transformers_modelsr   r   r%   rr   r   r   r&   r   <module>r      s  
 #    + %& $333 3 "	3
 3 3 3 3 3 3 3n -H#&   'iM)iMiM iM 	iM
 iM !iM iM iM iM iM 6iMZ ! H'H'H' H' 	H'
 H' H' H' 6H'r&   