o
    Xi                      @  s   d dl mZ d dlmZmZ d dlZd dlZd:ddZ				
				d;d<ddZ												 d=d>d-d.Z
	/	0	1	2			 d?d@d8d9ZdS )A    )annotations)AnySequenceNreturnboolc                  C  s0   zddl m}  | sJ W dS  ty   Y dS w )z8Tells if package *transformers* contains the phi3 model.r   
Phi3ConfigFT)transformersr   ImportErrorr    r   ]/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/tools/transformers_models/phi3.pyhas_phi3   s   
r               F
batch_sizeint
seq_length
vocab_sizetype_sequence_label_sizetype_vocab_size
num_labelsnum_choicesuse_input_maskuse_token_type_ids
use_labelstuple[Any, ...]c
                 C  s   t jj| |g|}
d }|rtt| |}d }|r-|dks#J dt jj| |g|}d }d }d }|	ri|dks=J d|dksEJ d|dksMJ dt jj| g|}t jj| |g|}t jj| g|}|
|||||fS )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)r   r   r   r   r   r   r   r   r   r   	input_ids
input_masktoken_type_idssequence_labelstoken_labelschoice_labelsr   r   r   _prepare_config_and_inputs   sF   r+   )      )   r.   )          c      eagerT
input_dimsSequence[tuple[int, int]]hidden_sizenum_hidden_layersintermediate_sizemax_position_embeddingsnum_attention_headsnum_key_value_heads_attn_implementationstr	with_mask0tuple[Any, list[tuple[torch.Tensor, ...]], dict]c
                   s  ddl m}
m  ddddi}|	r|ddddi |
|||||||td|d d}|r1||_|	r]G  fd	d
d
tjj}ddd}g }| D ]\}}|	|||| qH||||fS G  fdddtjj}ddd}g }| D ]\}}|	|||| qr||||fS )aH  
    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      rE   i }  )r8   r9   r   r:   r;   r<   r=   pad_token_idc                      &   e Zd Z fddZdd Z  ZS )z.get_phi3_model.<locals>.Phi3ModelWrapperNoMaskc                      t     || _d S Nsuper__init__modelselfconfigrB   	__class__r   r   rL   x      
z7get_phi3_model.<locals>.Phi3ModelWrapperNoMask.__init__c                 S  s   | j ||dd}| S )NF)attention_mask	use_cacherM   to_tuple)rO   r%   rT   model_outputr   r   r   forward|   s   z6get_phi3_model.<locals>.Phi3ModelWrapperNoMask.forward__name__
__module____qualname__rL   rY   __classcell__r   rB   rR   r   Phi3ModelWrapperNoMaskw       ra   r   seqr   c                 S  s$   t | ||dd\}}}}}}||fS NT)r   r   r   r   r+   )rC   rc   r   r%   _r&   r   r   r   generate_example_inputs_no_mask   s   z7get_phi3_model.<locals>.generate_example_inputs_no_maskc                      rG   )z(get_phi3_model.<locals>.Phi3ModelWrapperc                   rH   rI   rJ   rN   rQ   r   r   rL      rS   z1get_phi3_model.<locals>.Phi3ModelWrapper.__init__c                 S  s   | j |dd}| S )NF)rU   rV   )rO   r%   rX   r   r   r   rY      s   z0get_phi3_model.<locals>.Phi3ModelWrapper.forwardrZ   r   r_   r`   r   Phi3ModelWrapper   rb   rh   c                 S  s   t | ||dd^}}|fS rd   re   )rC   rc   r   r%   rf   r   r   r   generate_example_inputs   s   	z/get_phi3_model.<locals>.generate_example_inputsN)rC   r   rc   r   r   r   )
r	   r   rB   updateminr>   r"   nnModuleappend)r6   r8   r9   r   r:   r;   r<   r=   r>   r@   r   dynamic_shapesrP   ra   rg   example_args_collectionbsrh   ri   r   r_   r   get_phi3_modelO   s:   


	rs      
   smallrE   warmuprepeatrP   implementationro   c                 C  s   |dkrt tjj|| |d|ddddd||d
}n<|d	kr4t tjj|| |d
|d
d
ddd
||d
}n"|dv rNt tjj|| |d|ddddd||d
}ntd|dtdi |S )a  
    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.
    rv   r2   r3   r   r4   r   r   )
r6   r8   r9   r   r:   r;   r<   r=   r>   r@   mediumi   )
r6   r8   r9   r   r:   r<   r=   r;   r>   r@   )largedefaulti   i   i    NzUnexpected configuration .r   )dictr   r   r    get_input_dims_for_llm
ValueErrorrs   )rw   rx   rP   r9   ry   ro   r@   	conf_dictr   r   r   get_phi3_model_from_config   s^   r   )r   r   )r   r   r   r   FFF)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )
r,   r2   r   r3   r   r4   r   r   r5   T)r6   r7   r8   r   r9   r   r   r   r:   r   r;   r   r<   r   r=   r   r>   r?   r@   r   r   rA   )rt   ru   rv   rE   r5   FT)rw   r   rx   r   rP   r?   r9   r   ry   r?   ro   r   r@   r   r   rA   )
__future__r   typingr   r   r"   $onnxscript.tools.transformers_modelsr   r   r+   rs   r   r   r   r   r   <module>   s@   
7m