U
    d                  	   @   s   d dl mZ d dlmZmZmZmZ d dlZd dlZ	d dl
Z
d dlZe  edZeej dd Zdd Zd	d
 Zdd Zejdd Zdd Zedkre  \ZZedddge  eejZe e ee W 5 Q R X dS )    )
caffe2_pb2)	workspacecoreutilsmodel_helperNZembedding_generation_benchmarkc                 C   s   t d|  td}|jg dd| d}t| td}||dgdg t	j
d t| D ]`}|td	| d	  d
krt d||  t	t	||dg }td| t|  qft d |S )z&
    Fill a queue with input data
    zGenerating T={} batchesZgenerate_input_initZ
inputqueue   )Z	num_blobscapacityZgenerate_inputZscratchi+
  
   r   zGenerating data {}/{}zFinished data generation)loginfoformatr   NetZCreateBlobsQueuer   
RunNetOnceZEnqueueBlobsnprandomseedrangemaxZtileZarangeZ	transposeZFeedBlobProto)T
batch_sizeZmax_seq_lengthZgenerate_input_init_netqueueZgenerate_input_nettX r   P/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/embedding_generation_benchmark.pygenerate_data   s(    
   


r   c                 C   sB   t d| |g td}|jg dg| |gd}t| |S )Nz-Generating embedding table with dimensions {}Zgenerate_tableembedding_table)shape)r
   r   r   r   r   ZGaussianFillr   r   )Z
vocab_sizeembedding_sizeZgenerate_table_nettabler   r   r   generate_embedding_table1   s    

r!   c                 C   sT   t jdd}|j|d}| jdkr<|jj|gdg|d n|j||gdg |S )NZembedding_generation_bench)nameZ
input_datasinusoidoutput)r   )r   ZModelHelpernetZDequeueBlobsimplementationZSinusoidPositionEncodingZGather)argsr   r   r   modelZ
input_blobr   r   r   create_model@   s    
r)   c              
   C   sn  | j | j }t|| j| j}d }| jdkr8t| j| j}t| ||| j}t	|j
 t|j t }|}d}td t|j j td t }t }td|| jD ]l}	t| j||	 }
||
7 }t|j j|
 t }td|	||
| j | j ||  d d  |}q|d | j | j }|t |  d d }td	d
|  t | S )Nr    r   z------ Warming up ------z ------ Starting benchmark ------r   z4Iter: {} / {}. Embeddings Generated Per Second: {}k.d   r	   z,Done. Total embeddings generated per second zexcluding 1st iteration: {}k)	data_sizer   r   Z
seq_lengthr&   r!   r   r)   r   r   Zparam_init_netZ	CreateNetr%   timer
   r   ZRunNetr   r"   r   Ziters_to_reportminr   )r'   r   r   r   r(   
start_timeZ	num_itersZtotal_itersZ	last_time	iterationZ
iters_onceZnew_timeZtotal_per_secr   r   r   Caffe2EmbeddingGenerationS   sX    


r0   c                 C   s   t | S )N)r0   )r'   r   r   r   	Benchmark   s    r1   c                  C   s|   t jdd} | jdtddd | jdtdd	d | jd
tddd | jdtddd | jdtddd | jdtddd | S )NzEmbedding generation benchmark.)descriptionz--embedding_sizei   zEmbedding size)typedefaulthelpz--batch_size   zThe batch size.z--data_sizei'  zNumber of sequences to generatez--seq_length   zMax sequence lengthz--iters_to_report   z'Number of iterations to report progressz--implementationr#   z'table' or 'sinusoid')argparseArgumentParseradd_argumentintstr)parserr   r   r   GetArgumentParser   sP    r?   __main__Zcaffe2z--caffe2_log_level=0z#--caffe2_print_blob_sizes_at_exit=0)!Zcaffe2.protor   Zcaffe2.pythonr   r   r   r   r9   Znumpyr   r,   loggingbasicConfig	getLoggerr
   setLevelDEBUGr   r!   r)   r0   debugr1   r?   __name__parse_known_argsr'   
extra_argsZ
GlobalInitZDeviceOptionZCPUZdeviceZDeviceScoper   r   r   r   <module>   s6   
5
,