a
    ==ic0  ã                   @   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   úp/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/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)ÚselfÚ
batch_sizer!   Ú	graph_defÚ	model_defr   r"   r   r   r   Útest_relu_graph%   s4    

ÿ

ÿûù

zOnnxifiTest.test_relu_graphc                 C   sf  t  g d¢g d¢g d¢g d¢g d¢ggg¡ t j¡}t  g d¢g d¢g d¢ggg¡ t j¡}t  g d¢g d¢g d	¢ggg¡ t j¡}ttd
ddgdgddgg d¢dgdtdtjj	g d¢ƒtdtjj	g d¢ƒgtdtjj	g d¢ƒgd}t
|dd}tjddgdg| ¡ ddgdgdgtddddgd}t d|¡ t d|¡ t |¡ t d¡}t j ||¡ d S )N)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@)rD   rD   rD   )g      K@g     €O@g      R@)g     ÀX@g      [@g     @]@)g      b@g      c@g     @d@ZConvr!   ÚWr"   r   )r   r   r   r   )r&   r'   Zkernel_shapeZpadsr#   )r   r   é   rF   )r   r   r   r   r$   z	conv-testr(   r)   ZX0ZY0ZW0r   )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!   rE   ZY_without_paddingrA   rB   r   r"   r   r   r   Útest_conv_graph>   sh    
ü
ü
þ
þ
þ
þúÿ
ÿóø	

zOnnxifiTest.test_conv_graphN)Ú__name__Ú
__module__Ú__qualname__ÚunittestÚskiprC   rH   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   s¤  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|ƒD ]}t |j¡ qðt ¡ }|| }dd„ |
D ƒ}td|
ƒ|Ž }W d   ƒ n1 sD0    Y  t ¡  t |¡ t |¡ W d   ƒ n1 s‚0    Y  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 d   ƒ n1 s„0    Y  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>¦   ó    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   rY   rZ   r   r   r   r\   Å   r]   gü©ñÒMbP?)Zrtol)"r   r   rO   Zget_c2_modelrW   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_netrS   Ú_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)rI   rJ   rK   rP   rW   rL   rM   rh   r   r   r   r   rN   m   s   rN   )Únumpyr.   r`   rL   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   rN   r   r   r   r   Ú<module>   s   I