a
    ==ic6,  ã                   @   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   úk/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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   sˆ  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²zh| ¡  td | |¡ƒ t||jƒ tdƒ t |j¡}	|	 |¡ W d   ƒ n1 s 0    Y  W n8 tyd }
 ztd | |
¡ƒ ‚ W Y d }
~
n
d }
~
0 0 W t  |j¡ nt  |j¡ 0 |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Úcloser   r   ÚnameÚtarfileÚopenÚ
extractallÚ	ExceptionÚremove)Ú
model_namer   Z	onnx_homeZ
models_dirÚ	model_dirÚbiÚdestÚurlÚdownload_fileÚtÚer   r   r   Ú_download_onnx_model,   sB    ÿ
ÿ.ÿrA   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 |
¡H ˆ  d|¡ ˆ  |	g¡ ‡ fdd„|D ƒ}td|ƒ|Ž }W d   ƒ n1 s0    Y  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>^   ó    z3TensorRTOpTest._test_relu_graph.<locals>.<listcomp>)Zmax_batch_sizer   c                    s   g | ]}ˆ   |¡‘qS r   ©Ú	FetchBlob©rS   r3   ©Úwsr   r   rT   g   rU   ÚOutputs)r   Úc2Zrun_noder   r   rD   ZTensorProtoÚFLOATr   Úgraphr   r   r   ÚDeviceOptionr   ÚCUDAÚdevice_optionÚCopyFromr   ÚDeviceScopeÚFeedBlobÚRunOperatorsOncer	   ÚnpÚtestingZassert_almost_equal)rH   rJ   Ú
batch_sizeZtrt_max_batch_sizeZnode_defÚY_c2Z	graph_defÚ	model_defÚ
op_outputsr   ra   ÚY_trtÚoutput_valuesr   rY   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$   rM   rN   é2   ©rf   ÚrandomÚrandnÚastypeÚfloat32rn   ©rH   rJ   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$   rM   rN   rp   rq   rv   r   r   r   Útest_relu_graph_big_batchr   s    z(TensorRTOpTest.test_relu_graph_big_batchc                    sX  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 |¡` ˆ  || |	¡ |d
kröˆ  d|	¡ ˆ   |g¡ ‡ fdd„|D ƒ}t!d|ƒ|Ž }W d   ƒ n1 s80    Y  tj"j#|
|dd d S )Nr#   c                 S   s   g | ]}t |jƒ‘qS r   )ÚintZ	dim_valuerR   r   r   r   rT   z   rU   z6TensorRTOpTest._test_onnx_importer.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r   rQ   rR   r   r   r   rT   {   rU   c                 S   s   g | ]
}|j ‘qS r   rQ   rR   r   r   r   rT   |   rU   z{}rM   )Ú	verbosityr   é   Zdata_0c                    s   g | ]}ˆ   |¡‘qS r   rV   rX   rY   r   r   rT   ‹   rU   r[   çü©ñÒMbP?©Zrtol)$rA   rD   Úloadr'   r(   r+   r^   r   r   Ztensor_typeÚshapeÚdimr   r   r   rf   rr   rs   rt   ru   r\   Z	run_modelr   r   r_   r   r`   ra   rb   r   rc   rd   re   r	   rg   Úassert_allclose)rH   r9   Zdata_input_indexr   r:   rj   Úinput_blob_dimsZ	op_inputsrk   Údatari   r   ra   rl   rm   r   rY   r   Ú_test_onnx_importerw   s*    
.z"TensorRTOpTest._test_onnx_importerc                 C   s   |   ddd¡ d S )NÚresnet50r   é	   ©r…   rG   r   r   r   Útest_resnet50   s    zTensorRTOpTest.test_resnet50c                 C   s   |   ddd¡ d S )NZbvlc_alexnetr   r‡   rˆ   rG   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éÿÿÿÿrM   rˆ   rG   r   r   r   Útest_densenet121—   s    zTensorRTOpTest.test_densenet121c                 C   s   |   ddd¡ d S )NZinception_v1éýÿÿÿr‡   rˆ   rG   r   r   r   Útest_inception_v1›   s    z TensorRTOpTest.test_inception_v1c                 C   s   |   ddd¡ d S )NZinception_v2r   r‡   rˆ   rG   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ˆ   rG   r   r   r   Útest_shufflenet£   s    zTensorRTOpTest.test_shufflenetc                 C   s   |   ddd¡ d S )NZ
squeezenetr‹   r‡   rˆ   rG   r   r   r   Útest_squeezenet§   s    zTensorRTOpTest.test_squeezenetc                 C   s   |   ddd¡ d S )NZvgg16r   r‡   rˆ   rG   r   r   r   Ú
test_vgg16«   s    zTensorRTOpTest.test_vgg16c                 C   s   |   ddd¡ d S )NZvgg19éþÿÿÿr‡   rˆ   rG   r   r   r   Ú
test_vgg19¯   s    zTensorRTOpTest.test_vgg19N)Ú__name__Ú
__module__Ú__qualname__rI   rn   ÚunittestÚskipIfr   ÚCÚuse_trtrw   ry   rD   rE   rF   r…   r‰   rŠ   ÚskiprŒ   rŽ   r   r   r‘   r’   r”   r   r   r   r   rB   Q   s2   









rB   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 rC   )r
   Úmodel_downloaderrG   r   r   r   rI   µ   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)	rH   Úpred_netZnew_headZnew_tailZ	orig_headZ	orig_tailÚheadÚdummyÚtailr   r   r   Ú_add_head_tail¸   s$    


z$TensorRTTransformTest._add_head_tailro   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 d   ƒ n1 sl0    Y  t ¡  t |	¡ t |¡ W d   ƒ n1 sª0    Y  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¡ qXt ¡ }t|ƒD ]}t |j¡ q|t ¡ }|| }t d ||| | d ¡ƒ dd„ |D ƒ}td|ƒ|Ž }W d   ƒ n1 sî0    Y  tj!j"||dd d S )NrN   é   éd   z:Batch size: {}, repeat inference {} times, warmup {} timesr†   Z	real_dataZreal_softmaxrM   éà   r   ZCUDNNr$   Zgpu_testTc                 S   s   g | ]}t  |¡‘qS r   ©r   rW   rX   r   r   r   rT   ñ   rU   z<TensorRTTransformTest.test_resnet50_core.<locals>.<listcomp>r[   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©   rX   r   r   r   rT     rU   r}   r~   )#r   r   rž   Zget_c2_modelr¥   r   r_   r   r`   ra   rb   r   Zenginer   rf   rr   rs   rt   ru   r   ZSwitchWorkspacerc   rd   Z
RunNetOnceZ	CreateNetÚrangeZRunNetr3   Útimer	   ZResetWorkspacer   r   rg   r‚   )rH   ÚNZwarmupÚrepeatZinit_netr¡   Ú_rƒ   Z
input_namera   r   Znet_outputsri   r„   Zc2_timeÚstartÚendrm   Zpred_net_cutrl   Ztrt_timer   r   r   Útest_resnet50_coreÐ   s~    


.*þ


.z(TensorRTTransformTest.test_resnet50_coreN)r•   r–   r—   rI   r¥   r˜   r™   r   rš   r›   r±   r   r   r   r   r   ´   s   r   )+Zcaffe2.protor   Zcaffe2.pythonr   r   rD   Z	onnx.defsZonnx.helperr   r   r   r   Zonnx.backend.baser	   Zcaffe2.python.models.downloadr
   Zcaffe2.python.onnx.backendÚpythonÚbackendr\   Zcaffe2.python.onnx.workspacer   Zcaffe2.python.trt.transformr   r   Z#caffe2.python.onnx.tests.test_utilsr   Únumpyrf   Úos.pathr'   r«   r˜   r4   r0   r-   Zsix.moves.urllib.requestr   r   r    rA   rB   r   r   r   r   r   Ú<module>   s.   %c