o
    Xi[                     @  sh   d dl mZ d dlmZmZ d dlZd dlZ										
d'd(ddZ								
d)d*d%d&Z	dS )+    )annotations)AnySequenceN)      )      )	               r   eagerT
input_dimsSequence[tuple[int, int]]hidden_sizeintnum_hidden_layers
vocab_sizeintermediate_sizemax_position_embeddingsnum_attention_heads_attn_implementationstr	with_maskboolreturn0tuple[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.||_|rZG  fd	d
d
tjj}ddd}g }| D ]\}}|	|||| qE||||
fS G  fdddtjj}ddd}g }| D ]\}}|	|||| qo||||
fS )z
    Returns a model.
    See `LlamaConfig
    <https://huggingface.co/docs/transformers/main/en/model_doc/llama#transformers.LlamaConfig>`_.
    The parameters are chosen for a unit test configuration.
    r   )LlamaConfig
LlamaModelbatchlength)r   r   r   )r   r   r   r   r   r   c                      &   e Zd Z fddZdd Z  ZS )z.get_llama_model.<locals>.LlamaModelWrapperMaskc                      t     || _d S Nsuper__init__modelselfconfigr!   	__class__ ^/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/tools/transformers_models/llama.pyr)   5      
z7get_llama_model.<locals>.LlamaModelWrapperMask.__init__c                 S  s   | j ||dd}| S )NF)attention_mask	use_cacher*   to_tuple)r,   	input_idsr3   model_outputr0   r0   r1   forward9   s   z6get_llama_model.<locals>.LlamaModelWrapperMask.forward__name__
__module____qualname__r)   r9   __classcell__r0   r    r/   r1   LlamaModelWrapperMask4       r@   r   seqr   c                 S  sD   t jj| |g|}ttj| |tjd}|jtjksJ ||fS )N)dtype)	
onnxscripttoolstransformers_models
ids_tensortorchtrilonesfloat32rC   )r"   rB   r   r7   
input_maskr0   r0   r1   generate_example_inputs_mask?   s   z5get_llama_model.<locals>.generate_example_inputs_maskc                      r$   )z*get_llama_model.<locals>.LlamaModelWrapperc                   r%   r&   r'   r+   r.   r0   r1   r)   P   r2   z3get_llama_model.<locals>.LlamaModelWrapper.__init__c                 S  s   | j |dd}| S )NF)r4   r5   )r,   r7   r8   r0   r0   r1   r9   T   s   z2get_llama_model.<locals>.LlamaModelWrapper.forwardr:   r0   r    r?   r1   LlamaModelWrapperO   rA   rN   c                 S  s   t jj| |g|}|fS r&   )rD   rE   rF   rG   )r"   rB   r   r7   r0   r0   r1   generate_example_inputsX   s   z0get_llama_model.<locals>.generate_example_inputsN)r"   r   rB   r   r   r   )
transformersr   (transformers.models.llama.modeling_llamar!   updater   rH   nnModuleappend)r   r   r   r   r   r   r   r   r   r   dynamic_shapesr-   r@   rM   example_args_collectionbsrN   rO   r0   r    r1   get_llama_model   s8   

	rZ      
   smallFwarmuprepeatr-   implementationrV   c                 C  s   |dkrt tjj|| |d|dddd||d	}n:|dkr2t tjj|| |d|dddd||d	}n!|dv rKt tjj|| |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.
    r]   r   r   r   )	r   r   r   r   r   r   r   r   r   medium)largedefaulti   i }  i +  i       zUnexpected configuration .Nr0   )dictrD   rE   rF   get_input_dims_for_llm
ValueErrorrZ   )r^   r_   r-   r   r`   rV   r   	conf_dictr0   r0   r1   get_llama_model_from_configc   sX   rj   )	r   r   r   r   r   r   r   r   T)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   FT)r^   r   r_   r   r-   r   r   r   r`   r   rV   r   r   r   r   r   )

__future__r   typingr   r   rH   $onnxscript.tools.transformers_modelsrD   rZ   rj   r0   r0   r0   r1   <module>   s,   U