o
    Xi                      @  s   d dl mZ d dlmZmZ d dlZd dlZ							d8d9ddZ										d:d;d+d,Z		-	.	/	0			d<d=d6d7Z
dS )>    )annotations)AnySequenceN            F
batch_sizeint
seq_length
vocab_sizetype_sequence_label_sizetype_vocab_size
num_labelsnum_choicesuse_input_maskbooluse_token_type_ids
use_labelsreturn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_labels r$   \/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/tools/transformers_models/phi.py_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}
 ddlm  ddddi}|	r|ddddi |
|||||||d}|r/||_|	r[G  fd	d
d
tjj}ddd}g }| D ]\}}|	|||| qF||||fS G  fdddtjj}ddd}g }| D ]\}}|	|||| qp||||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   )	PhiConfigPhiModelbatchlength)r      rB   )r3   r4   r   r5   r6   r7   r8   c                      &   e Zd Z fddZdd Z  ZS )z&get_phi_model.<locals>.PhiModelWrapperc                      t     || _d S Nsuper__init__modelselfconfigr?   	__class__r$   r%   rH   n      
z/get_phi_model.<locals>.PhiModelWrapper.__init__c                 S  s   | j ||dd}| S )NF)attention_mask	use_cacherI   to_tuple)rK   r   rP   model_outputr$   r$   r%   forwardr   s   z.get_phi_model.<locals>.PhiModelWrapper.forward__name__
__module____qualname__rH   rU   __classcell__r$   r>   rN   r%   PhiModelWrapperm       r\   r
   seqr   c                 S  s$   t | ||dd\}}}}}}||fS NT)r	   r   r   r   r&   )r@   r^   r   r   _r   r$   r$   r%   generate_example_inputsx   s   z.get_phi_model.<locals>.generate_example_inputsc                      rC   )z,get_phi_model.<locals>.PhiModelWrapperNoMaskc                   rD   rE   rF   rJ   rM   r$   r%   rH      rO   z5get_phi_model.<locals>.PhiModelWrapperNoMask.__init__c                 S  s   | j |dd}| S )NF)rQ   rR   )rK   r   rT   r$   r$   r%   rU      s   z4get_phi_model.<locals>.PhiModelWrapperNoMask.forwardrV   r$   r>   r[   r%   PhiModelWrapperNoMask   r]   rc   c                 S  s"   t | ||dd\}}}}}}|fS r_   r`   )r@   r^   r   r   ra   r$   r$   r%   generate_example_inputs_no_mask   s   z6get_phi_model.<locals>.generate_example_inputs_no_maskN)r@   r
   r^   r
   r   r
   )
transformersr=   $transformers.models.phi.modeling_phir?   updater9   r   nnModuleappend)r1   r3   r4   r   r5   r6   r7   r8   r9   r;   r=   dynamic_shapesrL   r\   rb   example_args_collectionbsrc   rd   r$   r>   r%   get_phi_modelE   s:   	

	ro      
   smallrB   warmuprepeatrL   implementationrk   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.
    rr   r-   r.   r   r/   r   r   )
r1   r3   r4   r   r5   r6   r7   r8   r9   r;   mediumi   )
r1   r3   r4   r   r5   r7   r8   r6   r9   r;   )largedefaulti   i   i    NzUnexpected configuration .r$   )dictr   r   r   get_input_dims_for_llm
ValueErrorro   )rs   rt   rL   r4   ru   rk   r;   	conf_dictr$   r$   r%   get_phi_model_from_config   s^   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'   r-   r   r.   r   r/   r   r   r0   T)r1   r2   r3   r
   r4   r
   r   r
   r5   r
   r6   r
   r7   r
   r8   r
   r9   r:   r;   r   r   r<   )rp   rq   rr   rB   r0   FT)rs   r
   rt   r
   rL   r:   r4   r
   ru   r:   rk   r   r;   r   r   r<   )
__future__r   typingr   r   r   $onnxscript.tools.transformers_modelsr   r&   ro   r~   r$   r$   r$   r%   <module>   s>   7l