o
    h *                     @   s   d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZmZmZ dd	lmZmZmZmZmZmZ e rCddlZdd
lmZ e rLddlmZ eeZG dd deZdS )zD
    Benchmarking the library on inference and training in PyTorch.
    N)CallableOptional   )PretrainedConfig)MODEL_MAPPINGMODEL_WITH_LM_HEAD_MAPPING)is_py3nvml_availableis_torch_availablelogging   )	BenchmarkMemoryMemorySummarymeasure_peak_memory_cpustart_memory_tracingstop_memory_tracing)PyTorchBenchmarkArgumentsc                
   @   s  e Zd ZU eed< eed< dZeed< edd Z	dede
d	e
d
efddZdede
d	e
d
eee gfddZdede
d	e
d
efddZdede
d	e
d
eee gfddZdede
d	e
d
eg df fddZdede
d	e
d
eg df fddZd
efddZdeg df d
eegfddZdS )PyTorchBenchmarkargsconfigsPyTorch	frameworkc                 C   s   t jS N)torch__version__)self r   V/var/www/html/ai/venv/lib/python3.10/site-packages/transformers/benchmark/benchmark.pyframework_version7   s   z"PyTorchBenchmark.framework_version
model_name
batch_sizesequence_lengthreturnc                 C      |  |||}| |S r   )_prepare_inference_func_measure_speedr   r   r    r!   
_inferencer   r   r   _inference_speed;      
z!PyTorchBenchmark._inference_speedc                 C   r#   r   )r$   _measure_memoryr&   r   r   r   _inference_memory?      
z"PyTorchBenchmark._inference_memoryc                 C   r#   r   )_prepare_train_funcr%   r   r   r    r!   _trainr   r   r   _train_speedE   r)   zPyTorchBenchmark._train_speedc                 C   r#   r   )r-   r*   r.   r   r   r   _train_memoryI   r,   zPyTorchBenchmark._train_memoryNc                    s  | j | }| jjrd|_t|dot|jtot|jdk}| jjsJ|rJz|jd }t	d|gd}t
||}||}	W n tyI   t| dw t|j |}	|	  |	| jj t|drd|jn|jj}
tj|
||ftj| jjd| jjrtd	 | jjstd
|	  | jjrt  tj|	 W d    n1 sw   Y  n|	  fdd} fdd}|jr|}|S |}|S )NTarchitecturesr   transformersfromlist does not exist. If you just want to test the pretrained model, you might want to set `--only_pretrain_model` or `args.only_pretrain_model=True`.
vocab_sizedtypedevice&Running training in Mixed Precision...)Mixed precision is possible only for GPU.c                     s:   t    d} W d    | S 1 sw   Y  | S )N)decoder_input_idsr   no_gradoutputsinference_model	input_idsr   r   encoder_decoder_forward}   s   

zIPyTorchBenchmark._prepare_inference_func.<locals>.encoder_decoder_forwardc                     s6   t    } W d    | S 1 sw   Y  | S r   r>   r@   rB   r   r   encoder_forward   s   


zAPyTorchBenchmark._prepare_inference_func.<locals>.encoder_forward) config_dictr   torchscripthasattr
isinstancer2   listlenonly_pretrain_model
__import__getattrImportErrorr   	__class__evaltor:   r7   encoderr   randintlongfp16loggerinfois_gpu
ValueErrorhalfr?   jittraceis_encoder_decoder)r   r   r    r!   confighas_model_class_in_configmodel_classtransformers_module	model_clsmodelr7   rE   rF   _forwardr   rB   r   r$   O   sR   







z(PyTorchBenchmark._prepare_inference_funcc                    sN  | j | }t|dot|jtot|jdk}| jjsC|rCz|jd }td|gd}t	||}||}	W n t
yB   t
| dw t|j |}	| jjrRtd|	|	  |	| jj t|drg|jn|jj}
tj|
||ftj| jjd | jjrtd	 | jjstd
|	   fdd} fdd}|jr|}|S |}|S )Nr2   r   r3   r4   r6   z5Training for torchscript is currently not implementedr7   r8   r;   r<   c                     s     dd } |    | S )N)labelsr   backwardlossrD   train_modelr   r   !compute_loss_and_backprob_encoder   s   zOPyTorchBenchmark._prepare_train_func.<locals>.compute_loss_and_backprob_encoderc                     s      dd } |    | S )N)r=   rg   r   rh   rj   rl   r   r   )compute_loss_and_backprob_encoder_decoder   s   zWPyTorchBenchmark._prepare_train_func.<locals>.compute_loss_and_backprob_encoder_decoder)rG   rI   rJ   r2   rK   rL   r   rM   rN   rO   rP   r   rQ   rH   NotImplementedErrortrainrS   r:   r7   rT   r   rU   rV   rW   rX   rY   rZ   r[   r\   r_   )r   r   r    r!   r`   ra   rb   rc   rd   re   r7   rn   ro   r/   r   rl   r   r-      sN   





z$PyTorchBenchmark._prepare_train_funcc              
   C   s   z>| j js	| j jrtd tj|ddd tj|| j jdd}| j jr8| j jr8dd lm	  m
} | |  t|d W S  tyY } z| d|  W Y d }~d	S d }~ww )
NzRDo inference on TPU or torchscript. Running model 5 times to stabilize compilationr      )repeatnumber
   r   g      $@Doesn't fit on GPU. N/A)r   is_tpurH   rX   rY   timeitrs   torch_xla_tpu_print_metricstorch_xla.debug.metricsdebugmetricsprint_fnmetrics_reportminRuntimeError)r   funcruntimesmeter   r   r   r%      s,   
zPyTorchBenchmark._measure_speedr   c           
   
   C   s   zb| j jr	td}| j jrtd| j jrDt s td d}n3t	d t
  |  t
| j j}t
|}|j}t|}t
  nt|}t|trQt|n|}| j jr\t|}nd }||fW S  ty} }	 z| d|	  W Y d }	~	dS d }	~	ww )Nr3   zMemory Benchmarking is currently not implemented for TPU. Please disable memory benchmarking with `--no-memory` or `args.memory=False`zypy3nvml not installed, we won't log GPU memory usage. Install py3nvml (pip install py3nvml) to log information about GPU.rw   zlMeasuring total GPU usage on GPU device. Make sure to not have additional processes running on the same GPU.rv   )rw   N)r   trace_memory_line_by_liner   rx   rp   rZ   r   rX   warningrY   nvmlnvmlInitnvmlDeviceGetHandleByIndex
device_idxnvmlDeviceGetMemoryInfousedr   nvmlShutdownr   rJ   intr   r   r~   )
r   r   r^   memoryhandlememinfomax_bytes_in_usememory_bytessummaryr   r   r   r   r*      sD   



z PyTorchBenchmark._measure_memory)__name__
__module____qualname__r   __annotations__r   r   strpropertyr   r   floatr(   r   r   r   r+   r0   r1   r   r$   r-   r%   r*   r   r   r   r   r   2   s<   
 




"";<"r   )__doc__ry   typingr   r   configuration_utilsr   models.auto.modeling_autor   r   utilsr   r	   r
   benchmark_utilsr   r   r   r   r   r   r   benchmark_argsr   py3nvml.py3nvmlpy3nvmlr   
get_loggerr   rX   r   r   r   r   r   <module>   s    

