diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 126a4ac4b2bee7f3eaaf610646855b48d07b9e32..42a18b2737e4bc2fc6e55d7ebc55973d6033dd6d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,11 +29,11 @@ exclude: '^docs/conf.py' default_language_version: - python: python3.8 + python: python3.10 repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.2.0 + rev: v4.4.0 hooks: - id: trailing-whitespace exclude: '\.dat$' @@ -56,13 +56,13 @@ repos: - id: isort - repo: https://github.com/psf/black - rev: 22.3.0 + rev: 23.3.0 hooks: - id: black language_version: python3 - repo: https://github.com/PyCQA/flake8 - rev: 3.9.2 + rev: 6.0.0 hooks: - id: flake8 # black-compatible flake-8 config diff --git a/docker/Dockerfile.finn b/docker/Dockerfile.finn index f823d3c42b8f958d0d7961c0bdeb931686999fce..d69ccc9725f72992434c1e6a29355752a4ac2aca 100644 --- a/docker/Dockerfile.finn +++ b/docker/Dockerfile.finn @@ -26,10 +26,10 @@ # 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. -FROM pytorch/pytorch:1.7.1-cuda11.0-cudnn8-runtime +FROM ubuntu:jammy-20230126 LABEL maintainer="Yaman Umuroglu <yamanu@xilinx.com>" -ARG XRT_DEB_VERSION="xrt_202210.2.13.466_18.04-amd64-xrt" +ARG XRT_DEB_VERSION="xrt_202220.2.14.354_22.04-amd64-xrt" WORKDIR /workspace @@ -57,12 +57,15 @@ RUN apt-get update && \ unzip \ zip \ locales \ - lsb-core + lsb-core \ + python3 \ + python-is-python3 \ + python3-pip RUN echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config RUN locale-gen "en_US.UTF-8" # install Verilator from source to get the right version -RUN apt-get install -y git perl python3 make autoconf g++ flex bison ccache libgoogle-perftools-dev numactl perl-doc libfl2 libfl-dev zlibc zlib1g zlib1g-dev +RUN apt-get install -y git perl make autoconf g++ flex bison ccache libgoogle-perftools-dev numactl perl-doc libfl2 libfl-dev zlib1g zlib1g-dev RUN git clone https://github.com/verilator/verilator RUN cd verilator && \ git checkout v4.224 && \ @@ -81,19 +84,23 @@ RUN rm /tmp/$XRT_DEB_VERSION.deb COPY requirements.txt . RUN pip install -r requirements.txt RUN rm requirements.txt + +# install PyTorch +RUN pip install torch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116 + # extra Python package dependencies (for testing and interaction) -RUN pip install pygments==2.4.1 -RUN pip install ipykernel==5.5.5 +RUN pip install pygments==2.14.0 +RUN pip install ipykernel==6.21.2 RUN pip install jupyter==1.0.0 --ignore-installed RUN pip install markupsafe==2.0.1 -RUN pip install matplotlib==3.3.1 --ignore-installed +RUN pip install matplotlib==3.7.0 --ignore-installed RUN pip install pytest-dependency==0.5.1 -RUN pip install pytest-xdist[setproctitle]==2.4.0 -RUN pip install pytest-parallel==0.1.0 +RUN pip install pytest-xdist[setproctitle]==3.2.0 +RUN pip install pytest-parallel==0.1.1 RUN pip install "netron>=5.0.0" -RUN pip install pandas==1.1.5 -RUN pip install scikit-learn==0.24.1 -RUN pip install tqdm==4.31.1 +RUN pip install pandas==1.5.3 +RUN pip install scikit-learn==1.2.1 +RUN pip install tqdm==4.64.1 RUN pip install -e git+https://github.com/fbcotter/dataset_loading.git@0.0.4#egg=dataset_loading # extra dependencies from other FINN deps diff --git a/docker/finn_entrypoint.sh b/docker/finn_entrypoint.sh index b5c702111ac706df8d29947ce8768e499ee3627a..4e0266ca6b2b1d2bcac43cb2cde5b36c42ab62aa 100644 --- a/docker/finn_entrypoint.sh +++ b/docker/finn_entrypoint.sh @@ -54,8 +54,9 @@ recho () { echo -e "${RED}ERROR: $1${NC}" } -# qonnx -pip install --user -e ${FINN_ROOT}/deps/qonnx +# qonnx (using workaround for https://github.com/pypa/pip/issues/7953) +# to be fixed in future Ubuntu versions (https://bugs.launchpad.net/ubuntu/+source/setuptools/+bug/1994016) +pip install --no-build-isolation --no-warn-script-location -e ${FINN_ROOT}/deps/qonnx # finn-experimental pip install --user -e ${FINN_ROOT}/deps/finn-experimental # brevitas diff --git a/fetch-repos.sh b/fetch-repos.sh index e039ca9144fbb45e39331045b1fcbc209825ba0d..ddae4020edc81b49aa354450a002a53b50e9c7f2 100755 --- a/fetch-repos.sh +++ b/fetch-repos.sh @@ -27,9 +27,9 @@ # 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. -QONNX_COMMIT="20a34289cf2297d2b2bbbe75d6ac152ece86e3b4" +QONNX_COMMIT="0c980ef410c7c99b33c5b96486233f5a723ca1bc" FINN_EXP_COMMIT="0aa7e1c44b20cf085b6fe42cff360f0a832afd2c" -BREVITAS_COMMIT="c65f9c13dc124971f14739349531bbcda5c2a4aa" +BREVITAS_COMMIT="d30ba0d6b3db4a333072624fa3d10827a686488d" PYVERILATOR_COMMIT="766e457465f5c0dd315490d7b9cc5d74f9a76f4f" CNPY_COMMIT="4e8810b1a8637695171ed346ce68f6984e585ef4" HLSLIB_COMMIT="c17aa478ae574971d115afa9fa4d9c215857d1ac" @@ -39,7 +39,7 @@ XIL_BDF_COMMIT="8cf4bb674a919ac34e3d99d8d71a9e60af93d14e" KV260_BDF_COMMIT="98e0d3efc901f0b974006bc4370c2a7ad8856c79" EXP_BOARD_FILES_MD5="30eecc497c31050bd46d10ea20eba232" -QONNX_URL="https://github.com/fastmachinelearning/qonnx.git" +QONNX_URL="https://github.com/iksnagreb/qonnx.git" FINN_EXP_URL="https://github.com/Xilinx/finn-experimental.git" BREVITAS_URL="https://github.com/Xilinx/brevitas.git" PYVERILATOR_URL="https://github.com/maltanar/pyverilator.git" diff --git a/requirements.txt b/requirements.txt index 223138932e4dbae3f67a70ee3bcb10ba905bf83f..e3f74c23f9701280812d26b9caa720d037bc26ab 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,19 +3,17 @@ clize==4.1.1 dataclasses-json==0.5.7 gspread==3.6.0 ipython==8.12.2 -numpy==1.22.0 +numpy==1.24.1 onnx==1.13.0 onnxoptimizer -onnxruntime==1.11.1 -pre-commit==2.9.2 +onnxruntime==1.15.0 +pre-commit==3.3.2 protobuf==3.20.3 psutil==5.9.4 -pyscaffold==3.2.1 -scipy==1.5.2 +pyscaffold==4.4 +scipy==1.10.1 setupext-janitor>=1.1.2 sigtools==2.0.3 -sphinx==5.0.2 -sphinx_rtd_theme==0.5.0 -toposort==1.5 +toposort==1.7.0 vcdvcd==1.0.5 wget==3.2 diff --git a/run-docker.sh b/run-docker.sh index 381be35293dddbabe077be2aeae609f8c5621842..c24dcec7246c0ce340378ef2df185c54ad6a9208 100755 --- a/run-docker.sh +++ b/run-docker.sh @@ -86,7 +86,7 @@ SCRIPTPATH=$(dirname "$SCRIPT") : ${ALVEO_BOARD="U250"} : ${ALVEO_TARGET_DIR="/tmp"} : ${PLATFORM_REPO_PATHS="/opt/xilinx/platforms"} -: ${XRT_DEB_VERSION="xrt_202210.2.13.466_18.04-amd64-xrt"} +: ${XRT_DEB_VERSION="xrt_202220.2.14.354_22.04-amd64-xrt"} : ${FINN_HOST_BUILD_DIR="/tmp/$DOCKER_INST_NAME"} : ${FINN_DOCKER_TAG="xilinx/finn:$(git describe --always --tags --dirty).$XRT_DEB_VERSION"} : ${FINN_DOCKER_PREBUILT="0"} @@ -201,6 +201,9 @@ DOCKER_EXEC+="-e PYNQ_PASSWORD=$PYNQ_PASSWORD " DOCKER_EXEC+="-e PYNQ_TARGET_DIR=$PYNQ_TARGET_DIR " DOCKER_EXEC+="-e OHMYXILINX=$OHMYXILINX " DOCKER_EXEC+="-e NUM_DEFAULT_WORKERS=$NUM_DEFAULT_WORKERS " +# Workaround for FlexLM issue, see: +# https://community.flexera.com/t5/InstallAnywhere-Forum/Issues-when-running-Xilinx-tools-or-Other-vendor-tools-in-docker/m-p/245820#M10647 +DOCKER_EXEC+="-e LD_PRELOAD=/lib/x86_64-linux-gnu/libudev.so.1 " if [ "$FINN_DOCKER_RUN_AS_ROOT" = "0" ];then DOCKER_EXEC+="-v /etc/group:/etc/group:ro " DOCKER_EXEC+="-v /etc/passwd:/etc/passwd:ro " diff --git a/setup.cfg b/setup.cfg index 50a91498ce994ba3672cd2e2bbc2aa73f7fa0406..fb070a436ec3ab140b2394b57717d74efe5c2e37 100644 --- a/setup.cfg +++ b/setup.cfg @@ -34,12 +34,12 @@ name = finn description = A Framework for Fast, Scalable Quantized Neural Network Inference author = Yaman Umuroglu -author-email = yamanu@xilinx.com +author_email = yamanu@xilinx.com license = new-bsd -long-description = file: README.md -long-description-content-type = text/markdown +long_description = file: README.md +long_description_content_type = text/markdown url = https://xilinx.github.io/finn/ -project-urls = +project_urls = Documentation = https://finn.readthedocs.io/ # Change if running only on Windows, Mac or Linux (comma-separated) platforms = any diff --git a/src/finn/analysis/fpgadataflow/post_synth_res.py b/src/finn/analysis/fpgadataflow/post_synth_res.py index 8b9c5d2a04fd4740979f9f67d15935f3e0d6a788..1202120529aa96e19093f4aeaef38b42167cec51 100644 --- a/src/finn/analysis/fpgadataflow/post_synth_res.py +++ b/src/finn/analysis/fpgadataflow/post_synth_res.py @@ -85,7 +85,7 @@ def post_synth_res(model, override_synth_report_filename=None): row = root.findall(".//*[@contents='%s']/.." % inst_name) if row != []: node_dict = {} - row = row[0].getchildren() + row = list(row[0]) for (restype, ind) in restype_to_ind.items(): node_dict[restype] = int(row[ind].attrib["contents"]) return node_dict diff --git a/src/finn/transformation/fpgadataflow/templates.py b/src/finn/transformation/fpgadataflow/templates.py index f52bad0ffb35ae4714acc24aef368d01967db426..bc34f61a8beba40386afced96a089b46ee68eda3 100644 --- a/src/finn/transformation/fpgadataflow/templates.py +++ b/src/finn/transformation/fpgadataflow/templates.py @@ -135,7 +135,7 @@ if {$BOARD == "ZCU104"} { create_bd_design "top" if {$ZYNQ_TYPE == "zynq_us+"} { - create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.4 zynq_ps + create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.5 zynq_ps apply_bd_automation -rule xilinx.com:bd_rule:zynq_ultra_ps_e -config {apply_board_preset "1" } [get_bd_cells zynq_ps] #activate one slave port, deactivate the second master port set_property -dict [list CONFIG.PSU__USE__S_AXI_GP2 {1}] [get_bd_cells zynq_ps] diff --git a/tests/brevitas/test_brevitas_avg_pool_export.py b/tests/brevitas/test_brevitas_avg_pool_export.py index 9550031b326b8002c74b943529ba24a193e26a5d..898f1fb732b82f773341f40c9f01829f7c4fcf89 100644 --- a/tests/brevitas/test_brevitas_avg_pool_export.py +++ b/tests/brevitas/test_brevitas_avg_pool_export.py @@ -31,7 +31,7 @@ import numpy as np import os import torch from brevitas.export import export_qonnx -from brevitas.nn import QuantAvgPool2d, QuantIdentity, QuantReLU +from brevitas.nn import TruncAvgPool2d, QuantIdentity, QuantReLU from qonnx.core.datatype import DataType from qonnx.core.modelwrapper import ModelWrapper from qonnx.transformation.infer_datatypes import InferDataTypes @@ -73,7 +73,7 @@ def test_brevitas_avg_pool_export( bit_width=input_bit_width, return_quant_tensor=True, ) - quant_avgpool = QuantAvgPool2d( + quant_avgpool = TruncAvgPool2d( kernel_size=kernel_size, stride=stride, bit_width=bit_width, diff --git a/tests/end2end/test_end2end_bnn_pynq.py b/tests/end2end/test_end2end_bnn_pynq.py index 62b76d2f1306a94bf850cf62e360cb0e63a8ce30..4c68a018dbf0275b1eab409e82b33c46f5952cda 100644 --- a/tests/end2end/test_end2end_bnn_pynq.py +++ b/tests/end2end/test_end2end_bnn_pynq.py @@ -328,13 +328,13 @@ class TestEnd2End: (model, ishape) = get_trained_network_and_ishape(topology, wbits, abits) chkpt_name = get_checkpoint_name(topology, wbits, abits, QONNX_export, "export") if QONNX_export: - export_qonnx(model, torch.randn(ishape), chkpt_name) + export_qonnx(model, torch.randn(ishape), chkpt_name, opset_version=13) qonnx_cleanup(chkpt_name, out_file=chkpt_name) model = ModelWrapper(chkpt_name) model = model.transform(ConvertQONNXtoFINN()) model.save(chkpt_name) else: - export_finn_onnx(model, torch.randn(ishape), chkpt_name) + export_finn_onnx(model, torch.randn(ishape), chkpt_name, opset_version=13) nname = "%s_w%da%d" % (topology, wbits, abits) update_dashboard_data(topology, wbits, abits, "network", nname) dtstr = datetime.now().strftime("%Y-%m-%d %H:%M:%S") @@ -374,7 +374,7 @@ class TestEnd2End: chkpt_preproc_name = get_checkpoint_name( topology, wbits, abits, QONNX_export, "preproc" ) - export_finn_onnx(totensor_pyt, torch.randn(ishape), chkpt_preproc_name) + export_finn_onnx(totensor_pyt, torch.randn(ishape), chkpt_preproc_name, opset_version=13) assert os.path.isfile(chkpt_preproc_name) # join preprocessing and core model pre_model = ModelWrapper(chkpt_preproc_name) diff --git a/tests/end2end/test_end2end_cybsec_mlp.py b/tests/end2end/test_end2end_cybsec_mlp.py index d2a4d0287fc16d6bf4281be07a6a7ed5027150f1..1ab2d012283ee4cd34cad002df7a95bfcb3c5a8a 100644 --- a/tests/end2end/test_end2end_cybsec_mlp.py +++ b/tests/end2end/test_end2end_cybsec_mlp.py @@ -146,7 +146,7 @@ def test_end2end_cybsec_mlp_export(QONNX_export): model.save(export_onnx_path) else: export_finn_onnx( - model_for_export, export_path=export_onnx_path, input_t=input_qt + model_for_export, export_path=export_onnx_path, input_t=input_qt, input_names=["onnx::Mul_0"] ) assert os.path.isfile(export_onnx_path) # fix input datatype diff --git a/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py b/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py index 73721b6cc5744bb1345815e4bcf1c98aadb2d4f1..001c353c8e796b4807e6829c485c9bab6e73623f 100644 --- a/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py +++ b/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py @@ -38,7 +38,7 @@ from qonnx.core.modelwrapper import ModelWrapper from qonnx.custom_op.registry import getCustomOp from qonnx.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount from qonnx.transformation.fold_constants import FoldConstants -from qonnx.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames +from qonnx.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames, GiveUniqueParameterTensors from qonnx.transformation.infer_data_layouts import InferDataLayouts from qonnx.transformation.infer_shapes import InferShapes from qonnx.transformation.lower_convs_to_matmul import LowerConvsToMatMul @@ -67,6 +67,7 @@ def test_convert_to_hls_layers_cnv_w1a1(fused_activation): model = model.transform(InferShapes()) model = model.transform(FoldConstants()) model = model.transform(GiveUniqueNodeNames()) + model = model.transform(GiveUniqueParameterTensors()) model = model.transform(GiveReadableTensorNames()) model = model.transform(Streamline()) model = model.transform(LowerConvsToMatMul()) diff --git a/tests/fpgadataflow/test_convert_to_hls_layers_fc.py b/tests/fpgadataflow/test_convert_to_hls_layers_fc.py index 5a45638ba1908582a0dd62c9d69f259b85376145..0fa7155ac54ea3df92c36481486f7bbd4c549bd7 100644 --- a/tests/fpgadataflow/test_convert_to_hls_layers_fc.py +++ b/tests/fpgadataflow/test_convert_to_hls_layers_fc.py @@ -39,7 +39,7 @@ from qonnx.core.modelwrapper import ModelWrapper from qonnx.custom_op.registry import getCustomOp from qonnx.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount from qonnx.transformation.fold_constants import FoldConstants -from qonnx.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames +from qonnx.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames, GiveUniqueParameterTensors from qonnx.transformation.infer_shapes import InferShapes import finn.core.onnx_exec as oxe @@ -64,6 +64,7 @@ def test_convert_to_hls_layers_tfc_w1a1(): model = model.transform(InferShapes()) model = model.transform(FoldConstants()) model = model.transform(GiveUniqueNodeNames()) + model = model.transform(GiveUniqueParameterTensors()) model = model.transform(GiveReadableTensorNames()) model = model.transform(Streamline()) model = model.transform(ConvertBipolarMatMulToXnorPopcount()) @@ -135,6 +136,7 @@ def test_convert_to_hls_layers_tfc_w1a2(): model = model.transform(InferShapes()) model = model.transform(FoldConstants()) model = model.transform(GiveUniqueNodeNames()) + model = model.transform(GiveUniqueParameterTensors()) model = model.transform(GiveReadableTensorNames()) model = model.transform(Streamline()) from finn.transformation.fpgadataflow.convert_to_hls_layers import ( diff --git a/tests/transformation/streamline/test_streamline_cnv.py b/tests/transformation/streamline/test_streamline_cnv.py index b7d6a825bba4ad33287516ba637804526d0b53f9..c5d8e2517fc855227d2b8605f17c9a33075a4878 100644 --- a/tests/transformation/streamline/test_streamline_cnv.py +++ b/tests/transformation/streamline/test_streamline_cnv.py @@ -38,6 +38,7 @@ from qonnx.transformation.fold_constants import FoldConstants from qonnx.transformation.general import ( GiveReadableTensorNames, GiveUniqueNodeNames, + GiveUniqueParameterTensors, RemoveStaticGraphInputs, RemoveUnusedTensors, ) @@ -69,6 +70,7 @@ def test_streamline_cnv(size, wbits, abits): model = model.transform(InferShapes()) model = model.transform(FoldConstants()) model = model.transform(GiveUniqueNodeNames()) + model = model.transform(GiveUniqueParameterTensors()) model = model.transform(GiveReadableTensorNames()) model = model.transform(RemoveStaticGraphInputs()) # load one of the test vectors diff --git a/tests/transformation/streamline/test_streamline_fc.py b/tests/transformation/streamline/test_streamline_fc.py index 6131c3b03ea8542f2a04e14e82b6007c6ae9c6b4..07c3a0f3cb916b7d3e2873b8f416a0f1ed8f7085 100644 --- a/tests/transformation/streamline/test_streamline_fc.py +++ b/tests/transformation/streamline/test_streamline_fc.py @@ -39,6 +39,7 @@ from qonnx.transformation.fold_constants import FoldConstants from qonnx.transformation.general import ( GiveReadableTensorNames, GiveUniqueNodeNames, + GiveUniqueParameterTensors, RemoveStaticGraphInputs, RemoveUnusedTensors, ) @@ -72,6 +73,7 @@ def test_streamline_fc(size, wbits, abits): model = model.transform(InferShapes()) model = model.transform(FoldConstants()) model = model.transform(GiveUniqueNodeNames()) + model = model.transform(GiveUniqueParameterTensors()) model = model.transform(GiveReadableTensorNames()) model = model.transform(RemoveStaticGraphInputs()) # load one of the test vectors diff --git a/tests/transformation/test_infer_data_layouts_cnv.py b/tests/transformation/test_infer_data_layouts_cnv.py index 71822a2903fd284cab9dfee119915a61940cd59b..245980f958f35da780889ebde3437579893f6850 100644 --- a/tests/transformation/test_infer_data_layouts_cnv.py +++ b/tests/transformation/test_infer_data_layouts_cnv.py @@ -35,7 +35,7 @@ from brevitas.export import export_finn_onnx from qonnx.core.modelwrapper import ModelWrapper from qonnx.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount from qonnx.transformation.fold_constants import FoldConstants -from qonnx.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames +from qonnx.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames, GiveUniqueParameterTensors from qonnx.transformation.infer_data_layouts import InferDataLayouts from qonnx.transformation.infer_shapes import InferShapes from qonnx.transformation.lower_convs_to_matmul import LowerConvsToMatMul @@ -57,6 +57,7 @@ def test_infer_data_layouts_cnv(): model = model.transform(InferShapes()) model = model.transform(FoldConstants()) model = model.transform(GiveUniqueNodeNames()) + model = model.transform(GiveUniqueParameterTensors()) model = model.transform(GiveReadableTensorNames()) model = model.transform(Streamline()) model = model.transform(InferDataLayouts())