U
    ‰d0  ã                   @   s¼   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lm	Z	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d	Zd
d„ ZG dd„ deƒZG dd„ deƒZdS )é    N)Únamedtupledict)Ú	make_nodeÚ
make_graphÚmake_tensor_value_infoÚ
make_model)Ú
caffe2_pb2)ÚcoreÚ	workspace)ÚModelDownloader)Úonnxifi_caffe2_net)ÚTestCaseé   c                 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   úC/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/onnx/test_onnxifi.pyÚ
_print_net   s    




r   c                   @   s0   e Zd Ze d¡dd„ ƒZe d¡dd„ ƒZdS )ÚOnnxifiTestúNeed ONNXIFI backend supportc                 C   sÜ   d}t j |ddd¡ t j¡}ttddgdgƒ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
}tjddgdg| ¡ dgdgt|dddgd}t d|¡ t |¡ t d¡}t j |t  |d¡¡ d S )Nr   é   é   ZReluÚXÚYÚtest©ÚnameÚinputsÚoutputsz	relu-test©Zproducer_nameÚOnnxifi)Ú
onnx_modelÚinput_namesÚoutput_namesÚoutput_shape_hint_0r   )ÚnpÚrandomÚrandnÚastypeÚfloat32r   r   r   ÚonnxÚTensorProtoÚFLOATr   r   ÚCreateOperatorÚSerializeToStringÚONNXIFI_DATATYPE_FLOAT32r	   ÚFeedBlobÚRunOperatorOnceÚ	FetchBlobÚtestingÚassert_almost_equalÚmaximum)ÚselfZ
batch_sizer!   Ú	graph_defÚ	model_defr   r"   r   r   r   Útest_relu_graph%   s4    

ÿ

ÿûù

zOnnxifiTest.test_relu_graphc                 C   s   t  dddddgdddd	d
gdddddgdddddgdddddgggg¡ t j¡}t  dddgdddgdddgggg¡ t j¡}t  dddgdddgd d!d"gggg¡ t j¡}ttd#d$d%gd&gd'd'gd(d(d(d(gd)gd*td$tjj	d+d+d,d,gƒtd%tjj	d+d+d'd'gƒgtd&tjj	d+d+d'd'gƒgd-}t
|d.d/}tjd0d1gd2g| ¡ d%d3gd$gd&gtd+d+d'd'gd4}t d1|¡ t d3|¡ t |¡ t d2¡}t j ||¡ d S )5Ng        g      ð?g       @g      @g      @g      @g      @g      @g       @g      "@g      $@g      &@g      (@g      *@g      ,@g      .@g      0@g      1@g      2@g      3@g      4@g      5@g      6@g      7@g      8@g      K@g     €O@g      R@g     ÀX@g      [@g     @]@g      b@g      c@g     @d@ZConvr!   ÚWr"   r   r   )r&   r'   Zkernel_shapeZpadsr#   r   é   r$   z	conv-testr(   r)   ZX0ZY0ZW0)r*   Zinitializersr+   r,   r-   )r.   Úarrayr1   r2   r   r   r   r3   r4   r5   r   r   r6   r7   r8   r	   r9   r:   r;   r<   r=   )r?   r!   rC   ZY_without_paddingr@   rA   r   r"   r   r   r   Útest_conv_graph>   sh    ü
üþ
þþ
þ
úÿ

ÿóø	

zOnnxifiTest.test_conv_graphN)Ú__name__Ú
__module__Ú__qualname__ÚunittestÚskiprB   rF   r   r   r   r   r   $   s   
r   c                   @   s.   e Zd Zdd„ Zdd„ Ze d¡dd„ ƒZdS )	ÚOnnxifiTransformTestc                 C   s   t ƒ | _d S )N)r
   Úmodel_downloader)r?   r   r   r   ÚsetUpn   s    zOnnxifiTransformTest.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)	r?   Úpred_netZnew_headZnew_tailZ	orig_headZ	orig_tailÚheadÚdummyÚtailr   r   r   Ú_add_head_tailq   s$    


z#OnnxifiTransformTest._add_head_tailr   c              	   C   sb  d}d}t d ||¡ƒ | j d¡\}}}|  |dd¡ |dddf}d}t tjd¡}|j	 
|¡ |j	 
|¡ |jD ]}	|	j	 
|¡ qt|j}
d }tjj|Ž  tj¡}d}t d	d
¡ t |¡t t ||¡ t |¡ t |¡ 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}~~d }|jd }t d |¡ƒ t |¡¢ t ||¡ t |¡ t ¡ }t d || ¡ƒ t ¡ }t|ƒD ]}t |j¡ qæt ¡ }|| }t d ||| | d ¡ƒ dd„ |
D ƒ}td|
ƒ|Ž }W 5 Q R X tj j!||dd d S )Nr   z)Batch size: {}, repeat inference {} timesZresnet50Z	real_dataZreal_softmaxr   éà   r   Zonnxifi_testTc                 S   s   g | ]}t  |¡‘qS r   ©r	   r;   ©Ú.0r%   r   r   r   Ú
<listcomp>¦   s     z;OnnxifiTransformTest.test_resnet50_core.<locals>.<listcomp>ZOutputs)Zinfer_shapeszC2 runtime: {}szConversion time: {:.2f}sz&Onnxifi runtime: {}s, improvement: {}%éd   c                 S   s   g | ]}t  |¡‘qS r   rW   rX   r   r   r   rZ   Å   s     gü©ñÒMbP?)Zrtol)"r   r   rM   Zget_c2_modelrU   r   ZDeviceOptionr   ZCPUÚdevice_optionZCopyFromr   r   r.   r/   r0   r1   r2   r	   ZSwitchWorkspaceZDeviceScoper9   Z
RunNetOnceZ	CreateNetÚtimeÚrangeZRunNetr%   r   ZResetWorkspacer   r   r<   Zassert_allclose)r?   ÚNÚrepeatZinit_netrQ   Ú_Zinput_blob_dimsZ
input_namer\   r   Znet_outputsZY_c2ÚdataZc2_timeÚstartÚendZoutput_valuesZpred_net_cutZY_trtZtrt_timer   r   r   Útest_resnet50_core‰   sl    


þ

z'OnnxifiTransformTest.test_resnet50_coreN)rG   rH   rI   rN   rU   rJ   rK   re   r   r   r   r   rL   m   s   rL   )Znumpyr.   r]   rJ   r3   Z	onnx.defsZonnx.backend.baser   Zonnx.helperr   r   r   r   Zcaffe2.protor   Zcaffe2.pythonr   r	   Zcaffe2.python.models.downloadr
   Zcaffe2.python.onnx.onnxifir   Z#caffe2.python.onnx.tests.test_utilsr   r8   r   r   rL   r   r   r   r   Ú<module>   s   I