From c2c6f1085fb7b77ef82e5aa191c06b9024f75b0b Mon Sep 17 00:00:00 2001 From: Yaman Umuroglu <maltanar@gmail.com> Date: Mon, 23 Mar 2020 23:14:55 +0000 Subject: [PATCH] [Test] split ConvertToHLS tests into cnv and fc --- .../test_convert_to_hls_layers_cnv.py | 77 +++++++++++++++++++ ...rs.py => test_convert_to_hls_layers_fc.py} | 21 +---- 2 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 tests/fpgadataflow/test_convert_to_hls_layers_cnv.py rename tests/fpgadataflow/{test_convert_to_hls_layers.py => test_convert_to_hls_layers_fc.py} (90%) diff --git a/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py b/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py new file mode 100644 index 000000000..33a3f1926 --- /dev/null +++ b/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py @@ -0,0 +1,77 @@ +# Copyright (c) 2020, Xilinx +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of FINN nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import os +import pkg_resources as pk + +import brevitas.onnx as bo +import numpy as np + +import finn.core.onnx_exec as oxe +import finn.transformation.streamline.absorb as absorb +from finn.transformation.streamline.reorder import MakeMaxPoolNHWC +from finn.core.modelwrapper import ModelWrapper +from finn.transformation.fold_constants import FoldConstants +from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames +from finn.transformation.infer_shapes import InferShapes +from finn.transformation.streamline import Streamline +from finn.util.test import get_test_model_trained +from finn.transformation.double_to_single_float import DoubleToSingleFloat +from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul + +export_onnx_path_cnv = "test_output_cnv.onnx" + + +def test_convert_to_hls_layers_cnv_w1a1(): + cnv = get_test_model_trained("CNV", 1, 1) + bo.export_finn_onnx(cnv, (1, 3, 32, 32), export_onnx_path_cnv) + model = ModelWrapper(export_onnx_path_cnv) + model = model.transform(DoubleToSingleFloat()) + model = model.transform(InferShapes()) + model = model.transform(FoldConstants()) + model = model.transform(GiveUniqueNodeNames()) + model = model.transform(GiveReadableTensorNames()) + model = model.transform(Streamline()) + model.save("cnv-streamline.onnx") + # load one of the test vectors + fn = pk.resource_filename("finn", "data/cifar10/cifar10-test-data-class3.npz") + input_tensor = np.load(fn)["arr_0"].astype(np.float32) + assert input_tensor.shape == (1, 3, 32, 32) + # generate expected value from streamlined net + input_dict = {"global_in": input_tensor} + expected_ctx = oxe.execute_onnx(model, input_dict, True) + expected = expected_ctx[model.graph.output[0].name] + + model = model.transform(LowerConvsToMatMul()) + model = model.transform(MakeMaxPoolNHWC()) + model = model.transform(absorb.AbsorbTransposeIntoMultiThreshold()) + model.save("cnv-lower.onnx") + produced_ctx = oxe.execute_onnx(model, input_dict, True) + produced = produced_ctx[model.graph.output[0].name] + assert np.isclose(expected, produced, atol=1e-3).all() + os.remove(export_onnx_path_cnv) diff --git a/tests/fpgadataflow/test_convert_to_hls_layers.py b/tests/fpgadataflow/test_convert_to_hls_layers_fc.py similarity index 90% rename from tests/fpgadataflow/test_convert_to_hls_layers.py rename to tests/fpgadataflow/test_convert_to_hls_layers_fc.py index 365e684ed..1a2d65de0 100644 --- a/tests/fpgadataflow/test_convert_to_hls_layers.py +++ b/tests/fpgadataflow/test_convert_to_hls_layers_fc.py @@ -38,7 +38,6 @@ import torch import finn.core.onnx_exec as oxe import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls import finn.transformation.streamline.absorb as absorb -from finn.transformation.streamline.reorder import MakeMaxPoolNHWC from finn.core.modelwrapper import ModelWrapper from finn.custom_op.registry import getCustomOp from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount @@ -51,8 +50,7 @@ from finn.transformation.infer_shapes import InferShapes from finn.transformation.streamline import Streamline from finn.transformation.streamline.round_thresholds import RoundAndClipThresholds from finn.util.test import get_test_model_trained -from finn.transformation.double_to_single_float import DoubleToSingleFloat -from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul + export_onnx_path = "test_output_tfc.onnx" export_onnx_path_cnv = "test_output_cnv.onnx" @@ -127,23 +125,6 @@ def test_convert_to_hls_layers_tfc_w1a1(): assert np.isclose(produced, expected, atol=1e-3).all() -def test_convert_to_hls_layers_cnv_w1a1(): - tfc = get_test_model_trained("CNV", 1, 1) - bo.export_finn_onnx(tfc, (1, 3, 32, 32), export_onnx_path) - model = ModelWrapper(export_onnx_path_cnv) - model = model.transform(DoubleToSingleFloat()) - model = model.transform(InferShapes()) - model = model.transform(FoldConstants()) - model = model.transform(GiveUniqueNodeNames()) - model = model.transform(GiveReadableTensorNames()) - model = model.transform(Streamline()) - model.save("cnv-streamline.onnx") - model = model.transform(LowerConvsToMatMul()) - model = model.transform(MakeMaxPoolNHWC()) - model = model.transform(absorb.AbsorbTransposeIntoMultiThreshold()) - model.save("cnv-lower.onnx") - - def test_convert_to_hls_layers_tfc_w1a2(): tfc = get_test_model_trained("TFC", 1, 2) bo.export_finn_onnx(tfc, (1, 1, 28, 28), export_onnx_path) -- GitLab