U
    ‰d6,  ã                   @   s  d dl mZ d dlmZmZ d dlZd dlZd dlmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlm  m  mZ d dlmZ d dlmZmZ d d	lmZ d dlZd dlZd dlZd dl Z d dl!Z!d dl"Z"d dl#Z#d d
l$m%Z% dd„ Z&dd„ Z'dd„ Z(G dd„ deƒZ)G dd„ deƒZ*dS )é    )Ú
caffe2_pb2)ÚcoreÚ	workspaceN)Ú	make_nodeÚ
make_graphÚmake_tensor_value_infoÚ
make_model)Únamedtupledict)ÚModelDownloader)Ú	Workspace)Úconvert_onnx_model_to_trt_opÚtransform_caffe2_net)ÚTestCase)Úurlretrievec                 C   sˆ   | j D ]}td |¡ƒ q| jD ]}td |¡ƒ q | jD ]H}td |j¡ƒ |jD ]}td |¡ƒ qT|jD ]}td |¡ƒ qnq:d S )Nz	Input: {}z
Output: {}zOp {}z  input: {}z  output: {})Úexternal_inputÚprintÚformatÚexternal_outputÚopÚtypeÚinputÚoutput)ÚnetÚir   ÚxÚy© r   ú>/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/trt/test_trt.pyÚ
_print_net   s    




r   c                 C   s
   d  | ¡S )Nz6https://s3.amazonaws.com/download.onnx/models/opset_{})r   )Úopset_versionr   r   r   Ú	_base_url'   s    r    c              
   C   sd  t j t  dt j dd¡¡¡}t  dt j |d¡¡}t j || ¡}t j t j |d¡¡s`t j |¡rœd}d ||¡}t j |¡rŒ|d	7 }qjt ||¡ qœqjt  	|¡ d
 t
|ƒ| ¡}tjdd}zŽzR| ¡  td | |¡ƒ t||jƒ tdƒ t |j¡}	|	 |¡ W 5 Q R X W n6 tk
rL }
 ztd | |
¡ƒ ‚ W 5 d }
~
X Y nX W 5 t  |j¡ X |S )NZ	ONNX_HOMEú~z.onnxZONNX_MODELSÚmodelsú
model.onnxr   z	{}.old.{}é   z{}/{}.tar.gzF)Údeletez"Start downloading model {} from {}ÚDonez'Failed to prepare data for model {}: {})ÚosÚpathÚ
expanduserÚgetenvÚjoinÚexistsr   ÚshutilÚmoveÚmakedirsr    ÚtempfileÚNamedTemporaryFileÚremoveÚnameÚcloser   r   ÚtarfileÚopenÚ
extractallÚ	Exception)Ú
model_namer   Z	onnx_homeZ
models_dirÚ	model_dirZbiÚdestÚurlZdownload_fileÚtÚer   r   r   Ú_download_onnx_model,   sF    ÿ
 ÿ ÿr?   c                   @   s4  e Zd Zdd„ Zdd„ Ze ejj	 d¡dd„ ƒZ
e ejj	 d¡dd	„ ƒZej ¡ fd
d„Ze ejj	 d¡dd„ ƒZe ejj	 d¡dd„ ƒZe d¡dd„ ƒZe ejj	 d¡dd„ ƒZe d¡dd„ ƒZe d¡dd„ ƒZe ejj	 d¡dd„ ƒZe ejj	 d¡dd„ ƒZe ejj	 d¡dd„ ƒZd S )!ÚTensorRTOpTestc                 C   s   t j ¡ | _d S ©N)ÚonnxÚdefsÚonnx_opset_versionr   ©Úselfr   r   r   ÚsetUpR   s    zTensorRTOpTest.setUpc                    s  t ddgdgƒ}t |d|i¡}t|gdtdtjj|dddgƒgtdtjj|dddgƒgd}t|d	d
}dd„ |j	j
D ƒ}t||d}	t tjd¡}
|	j |
¡ d }tƒ ‰ t |
¡> ˆ  d|¡ ˆ  |	g¡ ‡ fdd„|D ƒ}td|ƒ|Ž }W 5 Q R X tj ||¡ d S )NZReluÚXÚYÚtestr$   é   é   )r3   ÚinputsÚoutputsz	relu-test)Zproducer_namec                 S   s   g | ]
}|j ‘qS r   ©r3   ©Ú.0r   r   r   r   Ú
<listcomp>^   s     z3TensorRTOpTest._test_relu_graph.<locals>.<listcomp>)Zmax_batch_sizer   c                    s   g | ]}ˆ   |¡‘qS r   ©Ú	FetchBlob©rQ   r3   ©Úwsr   r   rR   g   s     ÚOutputs)r   Úc2Zrun_noder   r   rB   ZTensorProtoÚFLOATr   Úgraphr   r   r   ÚDeviceOptionr   ÚCUDAÚdevice_optionÚCopyFromr   ÚDeviceScopeÚFeedBlobÚRunOperatorsOncer	   ÚnpÚtestingZassert_almost_equal)rF   rH   Z
batch_sizeZtrt_max_batch_sizeZnode_defÚY_c2Z	graph_defÚ	model_defÚ
op_outputsr   r^   ÚY_trtÚoutput_valuesr   rV   r   Ú_test_relu_graphU   s*    üzTensorRTOpTest._test_relu_graphúNo TensortRT supportc                 C   s,   t j dddd¡ t j¡}|  |dd¡ d S )Nr$   rK   rL   é2   ©rc   ÚrandomÚrandnÚastypeÚfloat32rj   ©rF   rH   r   r   r   Útest_relu_graph_simplel   s    z%TensorRTOpTest.test_relu_graph_simplec                 C   s,   t j dddd¡ t j¡}|  |dd¡ d S )Né4   r$   rK   rL   rl   rm   rr   r   r   r   Útest_relu_graph_big_batchr   s    z(TensorRTOpTest.test_relu_graph_big_batchc              	      sB  t ||ƒ}t tj |d¡¡}dd„ |jj| jj	j
jD ƒ}dd„ |jjD ƒ}dd„ |jjD ƒ}td |¡ƒ tjj|Ž  tj¡}	t ||| |	i¡}
t|dd}t tjd	¡}|j |¡ d }tƒ ‰ t |¡V ˆ  || |	¡ |d
kröˆ  d|	¡ ˆ   |g¡ ‡ fdd„|D ƒ}t!d|ƒ|Ž }W 5 Q R X tj"j#|
|dd d S )Nr#   c                 S   s   g | ]}t |jƒ‘qS r   )ÚintZ	dim_valuerP   r   r   r   rR   z   s     z6TensorRTOpTest._test_onnx_importer.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r   rO   rP   r   r   r   rR   {   s     c                 S   s   g | ]
}|j ‘qS r   rO   rP   r   r   r   rR   |   s     z{}rK   )Ú	verbosityr   é   Zdata_0c                    s   g | ]}ˆ   |¡‘qS r   rS   rU   rV   r   r   rR   ‹   s     rX   çü©ñÒMbP?©Zrtol)$r?   rB   Úloadr'   r(   r+   r[   r   r   Ztensor_typeÚshapeZdimr   r   r   rc   rn   ro   rp   rq   rY   Z	run_modelr   r   r\   r   r]   r^   r_   r   r`   ra   rb   r	   rd   Úassert_allclose)rF   r9   Zdata_input_indexr   r:   rf   Úinput_blob_dimsZ	op_inputsrg   Údatare   r   r^   rh   ri   r   rV   r   Ú_test_onnx_importerw   s*    
z"TensorRTOpTest._test_onnx_importerc                 C   s   |   ddd¡ d S )NÚresnet50r   é	   ©r€   rE   r   r   r   Útest_resnet50   s    zTensorRTOpTest.test_resnet50c                 C   s   |   ddd¡ d S )NZbvlc_alexnetr   r‚   rƒ   rE   r   r   r   Útest_bvlc_alexnet“   s    z TensorRTOpTest.test_bvlc_alexnetzUntil fixing Unsqueeze opc                 C   s   |   ddd¡ d S )NZdensenet121éÿÿÿÿrK   rƒ   rE   r   r   r   Útest_densenet121—   s    zTensorRTOpTest.test_densenet121c                 C   s   |   ddd¡ d S )NZinception_v1éýÿÿÿr‚   rƒ   rE   r   r   r   Útest_inception_v1›   s    z TensorRTOpTest.test_inception_v1c                 C   s   |   ddd¡ d S )NZinception_v2r   r‚   rƒ   rE   r   r   r   Útest_inception_v2Ÿ   s    z TensorRTOpTest.test_inception_v2zINeed to revisit our ChannelShuffle exporter to avoid generating 5D tensorc                 C   s   |   dd¡ d S )NZ
shufflenetr   rƒ   rE   r   r   r   Útest_shufflenet£   s    zTensorRTOpTest.test_shufflenetc                 C   s   |   ddd¡ d S )NZ
squeezenetr†   r‚   rƒ   rE   r   r   r   Útest_squeezenet§   s    zTensorRTOpTest.test_squeezenetc                 C   s   |   ddd¡ d S )NZvgg16r   r‚   rƒ   rE   r   r   r   Ú
test_vgg16«   s    zTensorRTOpTest.test_vgg16c                 C   s   |   ddd¡ d S )NZvgg19éþÿÿÿr‚   rƒ   rE   r   r   r   Ú
test_vgg19¯   s    zTensorRTOpTest.test_vgg19N)Ú__name__Ú
__module__Ú__qualname__rG   rj   ÚunittestÚskipIfr   ÚCÚuse_trtrs   ru   rB   rC   rD   r€   r„   r…   Úskipr‡   r‰   rŠ   r‹   rŒ   r   r   r   r   r   r   r@   Q   s2   









r@   c                   @   s6   e Zd Zdd„ Zdd„ Ze ejj	 d¡dd„ ƒZ
dS )	ÚTensorRTTransformTestc                 C   s   t ƒ | _d S rA   )r
   Úmodel_downloaderrE   r   r   r   rG   µ   s    zTensorRTTransformTest.setUpc           	      C   sÄ   |j d }|jd }t ¡ }d|_|j |¡ |j |¡ t ¡ }|j	 
|j	¡ |j	d d …= |j	 
|g¡ |j	 
|j	¡ ||j d< t ¡ }d|_|j |¡ |j |¡ |j	 
|g¡ ||jd< d S )Nr   ZCopy)r   r   r   ZOperatorDefr   r   Úappendr   ZNetDefr   Úextend)	rF   Úpred_netZnew_headZnew_tailZ	orig_headZ	orig_tailÚheadÚdummyÚtailr   r   r   Ú_add_head_tail¸   s$    


z$TensorRTTransformTest._add_head_tailrk   c              	   C   sÌ  d}d}d}t d |||¡ƒ | j d¡\}}}|  |dd¡ |dd	d	f}d}t tjd
¡}	|j	 
|	¡ |j	 
|	¡ |jD ]}
|
j	 
|	¡ d|
_qz|j}d }tjj|Ž  tj¡}d}t dd¡ t |	¡ t ||¡ t |¡ t |¡ t|ƒD ]}t |j¡ qôt ¡ }t|ƒD ]}t |j¡ qt ¡ }|| }dd„ |D ƒ}td|ƒ|Ž }W 5 Q R X t ¡  t |	¡ t |¡ W 5 Q R X t ¡ }t|||idd}~~|j	 
|	¡ |jD ]}
|
j	 
|	¡ q¸d }|j d
 }t d |¡ƒ t |	¡¾ t ||¡ t |¡ t ¡ }t d || ¡ƒ t|ƒD ]}t |j¡ q,t ¡ }t|ƒD ]}t |j¡ qPt ¡ }|| }t d ||| | d ¡ƒ dd„ |D ƒ}td|ƒ|Ž }W 5 Q R X tj!j"||dd d S )NrL   é   éd   z:Batch size: {}, repeat inference {} times, warmup {} timesr   Z	real_dataZreal_softmaxrK   éà   r   ZCUDNNr$   Zgpu_testTc                 S   s   g | ]}t  |¡‘qS r   ©r   rT   rU   r   r   r   rR   ñ   s     z<TensorRTTransformTest.test_resnet50_core.<locals>.<listcomp>rX   F)Zbuild_serializable_opzC2 runtime: {}szConversion time: {:.2f}sz"TRT runtime: {}s, improvement: {}%c                 S   s   g | ]}t  |¡‘qS r   r¤   rU   r   r   r   rR     s     ry   rz   )#r   r   r™   Zget_c2_modelr    r   r\   r   r]   r^   r_   r   Zenginer   rc   rn   ro   rp   rq   r   ZSwitchWorkspacer`   ra   Z
RunNetOnceZ	CreateNetÚrangeZRunNetr3   Útimer	   ZResetWorkspacer   r   rd   r}   )rF   ÚNZwarmupÚrepeatZinit_netrœ   Ú_r~   Z
input_namer^   r   Znet_outputsre   r   Zc2_timeÚstartÚendri   Zpred_net_cutrh   Ztrt_timer   r   r   Útest_resnet50_coreÐ   s~    


þ


z(TensorRTTransformTest.test_resnet50_coreN)r   r‘   r’   rG   r    r“   r”   r   r•   r–   r¬   r   r   r   r   r˜   ´   s   r˜   )+Zcaffe2.protor   Zcaffe2.pythonr   r   rB   Z	onnx.defsZonnx.helperr   r   r   r   Zonnx.backend.baser	   Zcaffe2.python.models.downloadr
   Zcaffe2.python.onnx.backendÚpythonÚbackendrY   Zcaffe2.python.onnx.workspacer   Zcaffe2.python.trt.transformr   r   Z#caffe2.python.onnx.tests.test_utilsr   Znumpyrc   Úos.pathr'   r¦   r“   r5   r0   r-   Zsix.moves.urllib.requestr   r   r    r?   r@   r˜   r   r   r   r   Ú<module>   s.   %c