From 7b093f277ef041112f790c740a08e1461b26078e Mon Sep 17 00:00:00 2001 From: Jean-Pierre Busch Date: Thu, 3 Nov 2022 17:00:10 +0100 Subject: [PATCH 1/8] added possibility to build TensorFlow on arm64 architectures --- Makefile | 4 +++- docker/Dockerfile | 18 ++++++++++++++---- scripts/.common.sh | 7 +++++-- scripts/1-build-official-devel-image.sh | 11 ++++++++--- scripts/2-build-cpp-image.sh | 3 ++- scripts/3-export-libtensorflow-cc.sh | 8 ++++---- scripts/5-print-versions.sh | 4 ++-- 7 files changed, 38 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index b23175c..6a566d3 100644 --- a/Makefile +++ b/Makefile @@ -28,11 +28,13 @@ DEFAULT_TF_VERSION := 2.9.2 TF_VERSIONS := 2.9.2 2.9.1 2.9.0 2.8.3 2.8.2 2.8.1 2.8.0 2.7.4 2.7.3 2.7.2 2.7.1 2.7.0 2.6.5 2.6.4 2.6.3 2.6.2 2.6.1 2.6.0 2.5.3 2.5.2 2.5.1 2.5.0 2.4.4 2.4.3 2.4.2 2.4.1 2.4.0 2.3.4 2.3.3 2.3.2 2.3.1 2.3.0 2.2.3 2.2.2 2.2.1 2.2.0 2.1.4 2.1.3 2.1.2 2.1.1 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 DEFAULT_JOBS := $(shell nproc) DEFAULT_GPU := 1 +DEFAULT_ARCH := $(shell dpkg --print-architecture) # arguments TF_VERSION := $(if $(TF_VERSION),$(TF_VERSION),$(DEFAULT_TF_VERSION)) JOBS := $(if $(JOBS),$(JOBS),$(DEFAULT_JOBS)) GPU := $(if $(GPU),$(GPU),$(DEFAULT_GPU)) +ARCH := $(if $(ARCH),$(ARCH),$(DEFAULT_ARCH)) # variables ifeq ($(GPU), 1) @@ -42,7 +44,7 @@ else endif OFFICIAL_DEVEL_IMAGE := tensorflow/tensorflow:$(TF_VERSION)-devel$(GPU_POSTFIX) OFFICIAL_DEVEL_IMAGES := tensorflow/tensorflow:*-devel$(GPU_POSTFIX) -CPP_IMAGE := rwthika/tensorflow-cc:$(TF_VERSION)$(GPU_POSTFIX) +CPP_IMAGE := rwthika/tensorflow-cc:$(TF_VERSION)$(GPU_POSTFIX)* CPP_IMAGES := rwthika/tensorflow-cc:* LIBTENSORFLOW_CC_IMAGE := rwthika/tensorflow-cc:$(TF_VERSION)-libtensorflow_cc* LIBTENSORFLOW_CC_IMAGES := rwthika/tensorflow-cc:*-libtensorflow_cc* diff --git a/docker/Dockerfile b/docker/Dockerfile index 0b4b4fc..184ed30 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -21,8 +21,10 @@ # --- build stage for building libtensorflow_cc -------------------------------- ARG TF_VERSION=master ARG GPU_POSTFIX=-gpu -FROM tensorflow/tensorflow:${TF_VERSION}-devel${GPU_POSTFIX} AS build +ARG TARGETARCH +FROM tensorflow/tensorflow:${TF_VERSION}-devel${GPU_POSTFIX}-${TARGETARCH} as build +ARG TARGETARCH ARG TF_VERSION ARG GPU_POSTFIX ARG JOBS="auto" @@ -35,7 +37,7 @@ WORKDIR /tensorflow ENV PYTHON_BIN_PATH=/usr/bin/python3 ENV PYTHON_LIB_PATH=/usr/lib/python3/dist-packages ENV TF_NEED_ROCM=0 -ENV TF_CUDA_COMPUTE_CAPABILITIES=5.3,6.0,6.1,7.0,7.2,7.5,8.0,8.6 +ENV TF_CUDA_COMPUTE_CAPABILITIES=5.3,6.0,6.1,7.0,7.2,7.5,8.0,8.6,8.7 ENV TF_CUDA_CLANG=0 ENV GCC_HOST_COMPILER_PATH=/usr/bin/gcc ENV CC_OPT_FLAGS="-march=native -Wno-sign-compare" @@ -72,6 +74,7 @@ RUN apt-get install -y autoconf automake libtool curl make g++ unzip && \ # --- deb-package stage providing libtensorflow-cc.deb ------------------------- FROM ubuntu:focal as deb-package +ARG TARGETARCH ARG TF_VERSION ARG GPU_POSTFIX @@ -95,7 +98,13 @@ RUN dpkg-deb --build --root-owner-group libtensorflow-cc_${TF_VERSION}${GPU_POST rm -rf libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}/ # --- final stage with TensorFlow Python and C++ Library ----------------------- -FROM tensorflow/tensorflow:${TF_VERSION}${GPU_POSTFIX} as final +FROM --platform=amd64 tensorflow/tensorflow:${TF_VERSION}${GPU_POSTFIX} as final-amd64 +ARG TARGETARCH + +FROM --platform=arm64 nvcr.io/nvidia/l4t-tensorflow:r35.1.0-tf2.9-py3 as final-arm64 +ARG TARGETARCH + +FROM "final-${TARGETARCH}" as final ARG TF_VERSION ARG GPU_POSTFIX @@ -103,4 +112,5 @@ ARG GPU_POSTFIX # install TensorFlow C++ API incl. protobuf COPY --from=deb-package /libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb /tmp RUN dpkg -i /tmp/libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb && \ - ldconfig + ldconfig && \ + rm /tmp/libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb diff --git a/scripts/.common.sh b/scripts/.common.sh index fbfbfca..bed9682 100644 --- a/scripts/.common.sh +++ b/scripts/.common.sh @@ -24,11 +24,13 @@ set -o pipefail DEFAULT_TF_VERSION="2.9.2" DEFAULT_JOBS=$(nproc) DEFAULT_GPU=1 +DEFAULT_ARCH=$(dpkg --print-architecture) TF_VERSION=${TF_VERSION:-${DEFAULT_TF_VERSION}} JOBS=${JOBS:-${DEFAULT_JOBS}} GPU=${GPU:-${DEFAULT_GPU}} [[ $GPU == "1" ]] && GPU_POSTFIX="-gpu" || GPU_POSTFIX="" +ARCH=${ARCH:-${DEFAULT_ARCH}} SCRIPT_NAME=$(basename "$0") SCRIPT_DIR=$(realpath $(dirname "$0")) @@ -41,6 +43,7 @@ mkdir -p ${LOG_DIR} DOWNLOAD_DOCKERFILES_DIR=${DOCKER_DIR}/.Dockerfiles DOWNLOAD_DOCKERFILE_DIR=${DOWNLOAD_DOCKERFILES_DIR}/${TF_VERSION} -IMAGE_DEVEL="tensorflow/tensorflow:${TF_VERSION}-devel${GPU_POSTFIX}" +IMAGE_DEVEL_ARCH="tensorflow/tensorflow:${TF_VERSION}-devel${GPU_POSTFIX}-${ARCH}" IMAGE_CPP="rwthika/tensorflow-cc:${TF_VERSION}${GPU_POSTFIX}" -IMAGE_LIBTENSORFLOW_CC="rwthika/tensorflow-cc:${TF_VERSION}-libtensorflow_cc${GPU_POSTFIX}" +IMAGE_CPP_ARCH="${IMAGE_CPP}-${ARCH}" +IMAGE_LIBTENSORFLOW_CC_ARCH="rwthika/tensorflow-cc:${TF_VERSION}-libtensorflow_cc${GPU_POSTFIX}-${ARCH}" diff --git a/scripts/1-build-official-devel-image.sh b/scripts/1-build-official-devel-image.sh index 4bec829..ddd5a9e 100755 --- a/scripts/1-build-official-devel-image.sh +++ b/scripts/1-build-official-devel-image.sh @@ -22,8 +22,13 @@ source $(dirname "$0")/.common.sh CPU_GPU_POSTFIX=${GPU_POSTFIX:--cpu} -DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/devel${CPU_GPU_POSTFIX}.Dockerfile +if [ "$ARCH" = "amd64" ]; then \ + DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/devel${CPU_GPU_POSTFIX}.Dockerfile ; \ +elif [ "$ARCH" = "arm64" ]; then \ + DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/arm64v8/devel-cpu-arm64v8.Dockerfile && \ + sed -i "s/ubuntu:\${UBUNTU_VERSION}/nvcr.io\/nvidia\/l4t-tensorflow:r35.1.0-tf2.9-py3/" $DOCKERFILE ; \ +fi BUILD_DIR=${DOWNLOAD_DOCKERFILE_DIR} -echo "Building ${IMAGE_DEVEL} ... " -docker build -t ${IMAGE_DEVEL} -f ${DOCKERFILE} ${BUILD_DIR} | tee ${LOG_FILE} +echo "Building ${IMAGE_DEVEL_ARCH} ... " +docker build -t ${IMAGE_DEVEL_ARCH} -f ${DOCKERFILE} ${BUILD_DIR} | tee ${LOG_FILE} diff --git a/scripts/2-build-cpp-image.sh b/scripts/2-build-cpp-image.sh index c23e4be..c24b342 100755 --- a/scripts/2-build-cpp-image.sh +++ b/scripts/2-build-cpp-image.sh @@ -22,4 +22,5 @@ source $(dirname "$0")/.common.sh echo "Building ${IMAGE_CPP} ... " -docker build --build-arg TF_VERSION=${TF_VERSION} --build-arg JOBS=${JOBS} --build-arg GPU_POSTFIX=${GPU_POSTFIX} -t ${IMAGE_CPP} ${DOCKER_DIR} | tee ${LOG_FILE} +docker build --build-arg TARGETARCH=$ARCH --build-arg TF_VERSION=${TF_VERSION} --build-arg JOBS=${JOBS} --build-arg GPU_POSTFIX=${GPU_POSTFIX} -t ${IMAGE_CPP_ARCH} ${DOCKER_DIR} | tee ${LOG_FILE} +docker tag ${IMAGE_CPP_ARCH} ${IMAGE_CPP} \ No newline at end of file diff --git a/scripts/3-export-libtensorflow-cc.sh b/scripts/3-export-libtensorflow-cc.sh index fcd6e09..c9d34c8 100755 --- a/scripts/3-export-libtensorflow-cc.sh +++ b/scripts/3-export-libtensorflow-cc.sh @@ -23,13 +23,13 @@ source $(dirname "$0")/.common.sh EXPORT_DIR=${REPOSITORY_DIR}/libtensorflow-cc CONTAINER_FILE="libtensorflow-cc_${TF_VERSION}.deb" -EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb" +EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}-${ARCH}.deb" STAGE="deb-package" -echo "Building ${IMAGE_LIBTENSORFLOW_CC} ... " -docker build --build-arg TF_VERSION=${TF_VERSION} --build-arg JOBS=${JOBS} --build-arg GPU_POSTFIX=${GPU_POSTFIX} --target ${STAGE} -t ${IMAGE_LIBTENSORFLOW_CC} ${DOCKER_DIR} | tee ${LOG_FILE} +echo "Building ${IMAGE_LIBTENSORFLOW_CC_ARCH} ... " +docker build --build-arg TF_VERSION=${TF_VERSION} --build-arg JOBS=${JOBS} --build-arg GPU_POSTFIX=${GPU_POSTFIX} --target ${STAGE} -t ${IMAGE_LIBTENSORFLOW_CC_ARCH} ${DOCKER_DIR} | tee ${LOG_FILE} echo "Exporting to $(realpath ${EXPORT_DIR})/${EXPORT_FILE} ... " -TMP_CONTAINER=$(docker create ${IMAGE_LIBTENSORFLOW_CC}) +TMP_CONTAINER=$(docker create ${IMAGE_LIBTENSORFLOW_CC_ARCH}) docker cp ${TMP_CONTAINER}:/${EXPORT_FILE} ${EXPORT_DIR}/ docker rm -v ${TMP_CONTAINER} diff --git a/scripts/5-print-versions.sh b/scripts/5-print-versions.sh index b9b0a3a..87da3d5 100755 --- a/scripts/5-print-versions.sh +++ b/scripts/5-print-versions.sh @@ -26,6 +26,6 @@ SCRIPT_RUN=${SCRIPT_DIR}/.versions.run.sh SCRIPT_MOUNT=/.versions.sh CMD="bash ${SCRIPT_MOUNT}" -echo "Getting version information from ${IMAGE_DEVEL} and ${IMAGE_CPP} ... " -docker run --rm --gpus all -v ${SCRIPT_DEVEL}:${SCRIPT_MOUNT} ${IMAGE_DEVEL} ${CMD} | tee ${LOG_FILE} +echo "Getting version information from ${IMAGE_DEVEL_ARCH} and ${IMAGE_CPP} ... " +docker run --rm --gpus all -v ${SCRIPT_DEVEL}:${SCRIPT_MOUNT} ${IMAGE_DEVEL_ARCH} ${CMD} | tee ${LOG_FILE} docker run --rm --gpus all -v ${SCRIPT_RUN}:${SCRIPT_MOUNT} ${IMAGE_CPP} ${CMD}| tee -a ${LOG_FILE} From 9b18b87a6eab4483bc4ab3497eb29753c1630271 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Busch Date: Wed, 9 Nov 2022 09:54:21 +0100 Subject: [PATCH 2/8] fix for generating the .deb package on arm64 --- docker/DEBIAN/control | 2 +- docker/Dockerfile | 1 + scripts/1-build-official-devel-image.sh | 10 +++++----- scripts/3-export-libtensorflow-cc.sh | 4 ++-- scripts/4-test-libtensorflow-cc.sh | 6 +++++- scripts/5-print-versions.sh | 9 +++++++-- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/docker/DEBIAN/control b/docker/DEBIAN/control index a4610ec..0b94a9e 100644 --- a/docker/DEBIAN/control +++ b/docker/DEBIAN/control @@ -1,5 +1,5 @@ Package: libtensorflow-cc Version: TF_VERSION -Architecture: amd64 +Architecture: TARGETARCH Maintainer: Lennart Reiher Description: TensorFlow C++ Library diff --git a/docker/Dockerfile b/docker/Dockerfile index 184ed30..3bee565 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -91,6 +91,7 @@ COPY --from=build /usr/local/lib usr/local/lib/protob RUN cp -d usr/local/lib/tensorflow/lib* usr/local/lib/protobuf/lib* usr/local/lib/ && \ rm -rf usr/local/lib/tensorflow usr/local/lib/protobuf RUN sed -i "s/TF_VERSION/$TF_VERSION/" DEBIAN/control +RUN sed -i "s/TARGETARCH/$TARGETARCH/" DEBIAN/control # build .deb WORKDIR / diff --git a/scripts/1-build-official-devel-image.sh b/scripts/1-build-official-devel-image.sh index ddd5a9e..1c3b8f1 100755 --- a/scripts/1-build-official-devel-image.sh +++ b/scripts/1-build-official-devel-image.sh @@ -22,11 +22,11 @@ source $(dirname "$0")/.common.sh CPU_GPU_POSTFIX=${GPU_POSTFIX:--cpu} -if [ "$ARCH" = "amd64" ]; then \ - DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/devel${CPU_GPU_POSTFIX}.Dockerfile ; \ -elif [ "$ARCH" = "arm64" ]; then \ - DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/arm64v8/devel-cpu-arm64v8.Dockerfile && \ - sed -i "s/ubuntu:\${UBUNTU_VERSION}/nvcr.io\/nvidia\/l4t-tensorflow:r35.1.0-tf2.9-py3/" $DOCKERFILE ; \ +if [ "$ARCH" = "amd64" ]; then + DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/devel${CPU_GPU_POSTFIX}.Dockerfile +elif [ "$ARCH" = "arm64" ]; then + DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/arm64v8/devel-cpu-arm64v8.Dockerfile + sed -i "s/ubuntu:\${UBUNTU_VERSION}/nvcr.io\/nvidia\/l4t-tensorflow:r35.1.0-tf2.9-py3/" $DOCKERFILE fi BUILD_DIR=${DOWNLOAD_DOCKERFILE_DIR} diff --git a/scripts/3-export-libtensorflow-cc.sh b/scripts/3-export-libtensorflow-cc.sh index c9d34c8..cafacbf 100755 --- a/scripts/3-export-libtensorflow-cc.sh +++ b/scripts/3-export-libtensorflow-cc.sh @@ -23,11 +23,11 @@ source $(dirname "$0")/.common.sh EXPORT_DIR=${REPOSITORY_DIR}/libtensorflow-cc CONTAINER_FILE="libtensorflow-cc_${TF_VERSION}.deb" -EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}-${ARCH}.deb" +EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb" STAGE="deb-package" echo "Building ${IMAGE_LIBTENSORFLOW_CC_ARCH} ... " -docker build --build-arg TF_VERSION=${TF_VERSION} --build-arg JOBS=${JOBS} --build-arg GPU_POSTFIX=${GPU_POSTFIX} --target ${STAGE} -t ${IMAGE_LIBTENSORFLOW_CC_ARCH} ${DOCKER_DIR} | tee ${LOG_FILE} +docker build --build-arg TARGETARCH=$ARCH --build-arg TF_VERSION=${TF_VERSION} --build-arg JOBS=${JOBS} --build-arg GPU_POSTFIX=${GPU_POSTFIX} --target ${STAGE} -t ${IMAGE_LIBTENSORFLOW_CC_ARCH} ${DOCKER_DIR} | tee ${LOG_FILE} echo "Exporting to $(realpath ${EXPORT_DIR})/${EXPORT_FILE} ... " TMP_CONTAINER=$(docker create ${IMAGE_LIBTENSORFLOW_CC_ARCH}) diff --git a/scripts/4-test-libtensorflow-cc.sh b/scripts/4-test-libtensorflow-cc.sh index 7ed65fe..59f4f82 100755 --- a/scripts/4-test-libtensorflow-cc.sh +++ b/scripts/4-test-libtensorflow-cc.sh @@ -26,4 +26,8 @@ EXAMPLE_MOUNT="/example" CMD="./build-and-run.sh" echo "Testing libtensorflow_cc in ${IMAGE_CPP} ... " -docker run --rm --gpus all -v ${EXAMPLE_DIR}:${EXAMPLE_MOUNT} -w ${EXAMPLE_MOUNT} ${IMAGE_CPP} ${CMD} | tee ${LOG_FILE} +if [ "$ARCH" = "amd64" ]; then + docker run --rm --gpus all -v ${EXAMPLE_DIR}:${EXAMPLE_MOUNT} -w ${EXAMPLE_MOUNT} ${IMAGE_CPP} ${CMD} | tee ${LOG_FILE} +elif [ "$ARCH" = "arm64" ]; then + docker run --rm --runtime nvidia -v ${EXAMPLE_DIR}:${EXAMPLE_MOUNT} -w ${EXAMPLE_MOUNT} ${IMAGE_CPP} ${CMD} | tee ${LOG_FILE} +fi diff --git a/scripts/5-print-versions.sh b/scripts/5-print-versions.sh index 87da3d5..133bafa 100755 --- a/scripts/5-print-versions.sh +++ b/scripts/5-print-versions.sh @@ -27,5 +27,10 @@ SCRIPT_MOUNT=/.versions.sh CMD="bash ${SCRIPT_MOUNT}" echo "Getting version information from ${IMAGE_DEVEL_ARCH} and ${IMAGE_CPP} ... " -docker run --rm --gpus all -v ${SCRIPT_DEVEL}:${SCRIPT_MOUNT} ${IMAGE_DEVEL_ARCH} ${CMD} | tee ${LOG_FILE} -docker run --rm --gpus all -v ${SCRIPT_RUN}:${SCRIPT_MOUNT} ${IMAGE_CPP} ${CMD}| tee -a ${LOG_FILE} +if [ "$ARCH" = "amd64" ]; then + docker run --rm --gpus all -v ${SCRIPT_DEVEL}:${SCRIPT_MOUNT} ${IMAGE_DEVEL_ARCH} ${CMD} | tee ${LOG_FILE} + docker run --rm --gpus all -v ${SCRIPT_RUN}:${SCRIPT_MOUNT} ${IMAGE_CPP} ${CMD}| tee -a ${LOG_FILE} +elif [ "$ARCH" = "arm64" ]; then + docker run --rm --runtime nvidia -v ${SCRIPT_DEVEL}:${SCRIPT_MOUNT} ${IMAGE_DEVEL_ARCH} ${CMD} | tee ${LOG_FILE} + docker run --rm --runtime nvidia -v ${SCRIPT_RUN}:${SCRIPT_MOUNT} ${IMAGE_CPP} ${CMD}| tee -a ${LOG_FILE} +fi From ceb74cc3b1afe09f68c8ddad0fb0f23fedb20ae8 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Busch Date: Thu, 10 Nov 2022 13:40:37 +0100 Subject: [PATCH 3/8] adjustments in versions file for arm64 --- scripts/.versions.run.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/.versions.run.sh b/scripts/.versions.run.sh index f47da1d..f98708b 100755 --- a/scripts/.versions.run.sh +++ b/scripts/.versions.run.sh @@ -19,10 +19,10 @@ # SOFTWARE. # ============================================================================== -PYTHON_VERSION=$(python --version 2>&1 | awk '{print $2}') +PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}') if [[ $(command -v python) ]]; then - TENSORFLOW_PYTHON_VERSION=$(python -c "exec(\"try:\n import os; os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'; import tensorflow as tf; print(tf.__version__);\n\rexcept ImportError:\n pass\")" 2> /dev/null) + TENSORFLOW_PYTHON_VERSION=$(python3 -c "exec(\"try:\n import os; os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'; import tensorflow as tf; print(tf.__version__);\n\rexcept ImportError:\n pass\")" 2> /dev/null) fi if [[ -f /usr/local/include/tensorflow/tensorflow/core/public/version.h ]]; then @@ -47,10 +47,10 @@ if [[ -f /usr/include/cudnn_version.h ]]; then CUDNN_VERSION=$CUDNN_MAJOR.$CUDNN_MINOR.$CUDNN_PATCH fi -if [[ -f /usr/include/x86_64-linux-gnu/NvInferVersion.h ]]; then - TENSORRT_MAJOR=$(cat /usr/include/x86_64-linux-gnu/NvInferVersion.h | grep "#define NV_TENSORRT_MAJOR" | sed "s/#define NV_TENSORRT_MAJOR //" | sed "s#//.*##" | sed "s/ //") - TENSORRT_MINOR=$(cat /usr/include/x86_64-linux-gnu/NvInferVersion.h | grep "#define NV_TENSORRT_MINOR" | sed "s/#define NV_TENSORRT_MINOR //" | sed "s#//.*##" | sed "s/ //") - TENSORRT_PATCH=$(cat /usr/include/x86_64-linux-gnu/NvInferVersion.h | grep "#define NV_TENSORRT_PATCH" | sed "s/#define NV_TENSORRT_PATCH //" | sed "s#//.*##" | sed "s/ //") +if [[ -f /usr/include/$(uname -m)-linux-gnu/NvInferVersion.h ]]; then + TENSORRT_MAJOR=$(cat /usr/include/$(uname -m)-linux-gnu/NvInferVersion.h | grep "#define NV_TENSORRT_MAJOR" | sed "s/#define NV_TENSORRT_MAJOR //" | sed "s#//.*##" | sed "s/ //") + TENSORRT_MINOR=$(cat /usr/include/$(uname -m)-linux-gnu/NvInferVersion.h | grep "#define NV_TENSORRT_MINOR" | sed "s/#define NV_TENSORRT_MINOR //" | sed "s#//.*##" | sed "s/ //") + TENSORRT_PATCH=$(cat /usr/include/$(uname -m)-linux-gnu/NvInferVersion.h | grep "#define NV_TENSORRT_PATCH" | sed "s/#define NV_TENSORRT_PATCH //" | sed "s#//.*##" | sed "s/ //") TENSORRT_VERSION=$TENSORRT_MAJOR.$TENSORRT_MINOR.$TENSORRT_PATCH fi From c9b976ac9715eccd3b07c0b4ec2c71e1b106208d Mon Sep 17 00:00:00 2001 From: Jean-Pierre Busch Date: Fri, 11 Nov 2022 11:45:35 +0100 Subject: [PATCH 4/8] add architecture tag to exported deb file --- Makefile | 2 +- scripts/3-export-libtensorflow-cc.sh | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 6a566d3..1c99615 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ else endif OFFICIAL_DEVEL_IMAGE := tensorflow/tensorflow:$(TF_VERSION)-devel$(GPU_POSTFIX) OFFICIAL_DEVEL_IMAGES := tensorflow/tensorflow:*-devel$(GPU_POSTFIX) -CPP_IMAGE := rwthika/tensorflow-cc:$(TF_VERSION)$(GPU_POSTFIX)* +CPP_IMAGE := rwthika/tensorflow-cc:$(TF_VERSION)$(GPU_POSTFIX)-$(ARCH) CPP_IMAGES := rwthika/tensorflow-cc:* LIBTENSORFLOW_CC_IMAGE := rwthika/tensorflow-cc:$(TF_VERSION)-libtensorflow_cc* LIBTENSORFLOW_CC_IMAGES := rwthika/tensorflow-cc:*-libtensorflow_cc* diff --git a/scripts/3-export-libtensorflow-cc.sh b/scripts/3-export-libtensorflow-cc.sh index cafacbf..2846d18 100755 --- a/scripts/3-export-libtensorflow-cc.sh +++ b/scripts/3-export-libtensorflow-cc.sh @@ -22,8 +22,8 @@ source $(dirname "$0")/.common.sh EXPORT_DIR=${REPOSITORY_DIR}/libtensorflow-cc -CONTAINER_FILE="libtensorflow-cc_${TF_VERSION}.deb" -EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb" +CONTAINER_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb" +EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}-${ARCH}.deb" STAGE="deb-package" echo "Building ${IMAGE_LIBTENSORFLOW_CC_ARCH} ... " @@ -31,5 +31,5 @@ docker build --build-arg TARGETARCH=$ARCH --build-arg TF_VERSION=${TF_VERSION} - echo "Exporting to $(realpath ${EXPORT_DIR})/${EXPORT_FILE} ... " TMP_CONTAINER=$(docker create ${IMAGE_LIBTENSORFLOW_CC_ARCH}) -docker cp ${TMP_CONTAINER}:/${EXPORT_FILE} ${EXPORT_DIR}/ +docker cp ${TMP_CONTAINER}:/${CONTAINER_FILE} ${EXPORT_DIR}/${EXPORT_FILE} docker rm -v ${TMP_CONTAINER} From ceabafc720d316246b47bfe5163632e0ac7d966d Mon Sep 17 00:00:00 2001 From: Lennart Reiher Date: Fri, 11 Nov 2022 11:51:14 +0100 Subject: [PATCH 5/8] refer to arm64 support in README --- README.md | 122 +++++++++++++++++++++++++++--------------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index 71fe8f4..c850c3d 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ We provide a **pre-built library and a Docker image** for easy installation and In order to, e.g., run TensorFlow models from C++ source code, one usually needs to build the C++ API in the form of the `libtensorflow_cc.so` library from source. There is no official release of the library and the build from source is only sparsely documented. We try to remedy this current situation by providing two main components: -1. We provide the pre-built `libtensorflow_cc.so` including accompanying headers as a one-command-install deb-package. The build supports x86_64 machines running Ubuntu. See [Installation](#installation). -2. We provide a pre-built Docker image based on the official TensorFlow Docker image. Our Docker image has both TensorFlow Python and TensorFlow C++ installed. See [Docker Images](#docker-images). +1. We provide the pre-built `libtensorflow_cc.so` including accompanying headers as a one-command-install deb-package. The package is available for both x86_64/amd64 and arm64 machines running Ubuntu. See [Installation](#installation). +2. We provide a pre-built Docker image based on the official TensorFlow Docker image. Our Docker image has both TensorFlow Python and TensorFlow C++ installed. The Docker images support both x86_64/amd64 and arm64 architectures. The arm64 version is specifically targeted at [NVIDIA Jetson Orin](https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/). See [Docker Images](#docker-images). If you want to use the TensorFlow C++ API to load, inspect, and run saved models and frozen graphs in C++, we suggest that you also check out our helper library [*tensorflow_cpp*](https://github.com/ika-rwth-aachen/tensorflow_cpp). @@ -60,21 +60,21 @@ docker run --rm \ ## Installation -The pre-built `libtensorflow_cc.so` library and accompanying headers are packaged as a deb-package that can be installed as shown below. The deb-package can also be downloaded manually from the [Releases page](https://github.com/ika-rwth-aachen/libtensorflow_cc/releases). +The pre-built `libtensorflow_cc.so` library and accompanying headers are packaged as a deb-package that can be installed as shown below. The deb-package can also be downloaded manually from the [Releases page](https://github.com/ika-rwth-aachen/libtensorflow_cc/releases). We provide versions with and without GPU support for x86_64/amd64 and arm64 architectures. #### GPU ```bash -wget https://github.com/ika-rwth-aachen/libtensorflow_cc/releases/download/v2.9.2/libtensorflow-cc_2.9.2-gpu.deb -sudo dpkg -i libtensorflow-cc_2.9.2-gpu.deb +wget https://github.com/ika-rwth-aachen/libtensorflow_cc/releases/download/v2.9.2/libtensorflow-cc_2.9.2-gpu_$(dpkg --print-architecture).deb +sudo dpkg -i libtensorflow-cc_2.9.2-gpu_$(dpkg --print-architecture).deb ldconfig ``` #### CPU ```bash -wget https://github.com/ika-rwth-aachen/libtensorflow_cc/releases/download/v2.9.2/libtensorflow-cc_2.9.2.deb -sudo dpkg -i libtensorflow-cc_2.9.2.deb +wget https://github.com/ika-rwth-aachen/libtensorflow_cc/releases/download/v2.9.2/libtensorflow-cc_2.9.2_$(dpkg --print-architecture).deb +sudo dpkg -i libtensorflow-cc_2.9.2_$(dpkg --print-architecture).deb ldconfig ``` @@ -95,71 +95,71 @@ target_link_libraries(foo PRIVATE ${TensorFlow_LIBRARIES}) ## Docker Images -Instead of installing the TensorFlow C++ API using our deb-package, you can also run or build on top the pre-built Docker images in our [Docker Hub repository](https://hub.docker.com/r/rwthika/tensorflow-cc). +Instead of installing the TensorFlow C++ API using our deb-package, you can also run or build on top the pre-built Docker images in our [Docker Hub repository](https://hub.docker.com/r/rwthika/tensorflow-cc). If supported, we offer CPU-only and GPU-supporting images. Starting with TensorFlow 2.9.2, we offer multi-arch images, supporting x86_64/amd64 and arm64 architectures. -All images are based on the [official TensorFlow Docker images](https://hub.docker.com/r/tensorflow/tensorflow) and only install the TensorFlow C++ API on top of those. The resulting images therefore enable you to run TensorFlow in both Python and C++. If supported, we offer CPU-only and GPU-supporting images. +The amd64 images are based on the [official TensorFlow Docker images](https://hub.docker.com/r/tensorflow/tensorflow). The arm64 images are based on [NVIDIA's official L4T TensorFlow images for Jetson](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-tensorflow), targeted at [NVIDIA Jetson Orin](https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/). Our provided images only install the TensorFlow C++ API on top of those. The resulting images therefore enable you to run TensorFlow in both Python and C++. -| TensorFlow Version | CPU/GPU | Image:Tag | -| :---: | :---: | --- | -| 2.9.2 | GPU | `rwthika/tensorflow-cc:latest-gpu` | -| 2.9.2 | CPU | `rwthika/tensorflow-cc:latest` | +| TensorFlow Version | CPU/GPU | Architecture | Image:Tag | +| :---: | :---: | :---: | --- | +| 2.9.2 | GPU | amd64, arm64 | `rwthika/tensorflow-cc:latest-gpu` | +| 2.9.2 | CPU | amd64, arm64 | `rwthika/tensorflow-cc:latest` |
All TensorFlow Versions (GPU) -| TensorFlow Version | Image:Tag | -| :---: | --- | -| latest | `rwthika/tensorflow-cc:latest-gpu` | -| 2.9.2 | `rwthika/tensorflow-cc:2.9.2-gpu` | -| 2.9.1 | `rwthika/tensorflow-cc:2.9.1-gpu` | -| 2.9.0 | `rwthika/tensorflow-cc:2.9.0-gpu` | -| 2.8.3 | `rwthika/tensorflow-cc:2.8.3-gpu` | -| 2.8.2 | `rwthika/tensorflow-cc:2.8.2-gpu` | -| 2.8.1 | `rwthika/tensorflow-cc:2.8.1-gpu` | -| 2.8.0 | `rwthika/tensorflow-cc:2.8.0-gpu` | -| 2.7.4 | `rwthika/tensorflow-cc:2.7.4-gpu` | -| 2.7.3 | `rwthika/tensorflow-cc:2.7.3-gpu` | -| 2.7.2 | `rwthika/tensorflow-cc:2.7.2-gpu` | -| 2.7.1 | `rwthika/tensorflow-cc:2.7.1-gpu` | -| 2.7.0 | `rwthika/tensorflow-cc:2.7.0-gpu` | +| TensorFlow Version | Architecture | Image:Tag | +| :---: | :---: | --- | +| latest | amd64, arm64 | `rwthika/tensorflow-cc:latest-gpu` | +| 2.9.2 | amd64, arm64 | `rwthika/tensorflow-cc:2.9.2-gpu` | +| 2.9.1 | amd64 | `rwthika/tensorflow-cc:2.9.1-gpu` | +| 2.9.0 | amd64 | `rwthika/tensorflow-cc:2.9.0-gpu` | +| 2.8.3 | amd64 | `rwthika/tensorflow-cc:2.8.3-gpu` | +| 2.8.2 | amd64 | `rwthika/tensorflow-cc:2.8.2-gpu` | +| 2.8.1 | amd64 | `rwthika/tensorflow-cc:2.8.1-gpu` | +| 2.8.0 | amd64 | `rwthika/tensorflow-cc:2.8.0-gpu` | +| 2.7.4 | amd64 | `rwthika/tensorflow-cc:2.7.4-gpu` | +| 2.7.3 | amd64 | `rwthika/tensorflow-cc:2.7.3-gpu` | +| 2.7.2 | amd64 | `rwthika/tensorflow-cc:2.7.2-gpu` | +| 2.7.1 | amd64 | `rwthika/tensorflow-cc:2.7.1-gpu` | +| 2.7.0 | amd64 | `rwthika/tensorflow-cc:2.7.0-gpu` |
All TensorFlow Versions (CPU) -| TensorFlow Version | Image:Tag | -| :---: | --- | -| latest | `rwthika/tensorflow-cc:latest` | -| 2.9.2 | `rwthika/tensorflow-cc:2.9.2` | -| 2.9.1 | `rwthika/tensorflow-cc:2.9.1` | -| 2.9.0 | `rwthika/tensorflow-cc:2.9.0` | -| 2.8.3 | `rwthika/tensorflow-cc:2.8.3` | -| 2.8.2 | `rwthika/tensorflow-cc:2.8.2` | -| 2.8.1 | `rwthika/tensorflow-cc:2.8.1` | -| 2.8.0 | `rwthika/tensorflow-cc:2.8.0` | -| 2.7.4 | `rwthika/tensorflow-cc:2.7.4` | -| 2.7.3 | `rwthika/tensorflow-cc:2.7.3` | -| 2.7.2 | `rwthika/tensorflow-cc:2.7.2` | -| 2.7.1 | `rwthika/tensorflow-cc:2.7.1` | -| 2.7.0 | `rwthika/tensorflow-cc:2.7.0` | -| 2.6.1 | `rwthika/tensorflow-cc:2.6.1` | -| 2.6.0 | `rwthika/tensorflow-cc:2.6.0` | -| 2.5.1 | `rwthika/tensorflow-cc:2.5.1` | -| 2.5.0 | `rwthika/tensorflow-cc:2.5.0` | -| 2.4.3 | `rwthika/tensorflow-cc:2.4.3` | -| 2.4.2 | `rwthika/tensorflow-cc:2.4.2` | -| 2.4.1 | `rwthika/tensorflow-cc:2.4.1` | -| 2.4.0 | `rwthika/tensorflow-cc:2.4.0` | -| 2.3.4 | `rwthika/tensorflow-cc:2.3.4` | -| 2.3.3 | `rwthika/tensorflow-cc:2.3.3` | -| 2.3.2 | `rwthika/tensorflow-cc:2.3.2` | -| 2.3.1 | `rwthika/tensorflow-cc:2.3.1` | -| 2.3.0 | `rwthika/tensorflow-cc:2.3.0` | -| 2.0.4 | `rwthika/tensorflow-cc:2.0.4` | -| 2.0.3 | `rwthika/tensorflow-cc:2.0.3` | -| 2.0.1 | `rwthika/tensorflow-cc:2.0.1` | -| 2.0.0 | `rwthika/tensorflow-cc:2.0.0` | +| TensorFlow Version | Architecture | Image:Tag | +| :---: | :---: | --- | +| latest | amd64, arm64 | `rwthika/tensorflow-cc:latest` | +| 2.9.2 | amd64, arm64 | `rwthika/tensorflow-cc:2.9.2` | +| 2.9.1 | amd64 | `rwthika/tensorflow-cc:2.9.1` | +| 2.9.0 | amd64 | `rwthika/tensorflow-cc:2.9.0` | +| 2.8.3 | amd64 | `rwthika/tensorflow-cc:2.8.3` | +| 2.8.2 | amd64 | `rwthika/tensorflow-cc:2.8.2` | +| 2.8.1 | amd64 | `rwthika/tensorflow-cc:2.8.1` | +| 2.8.0 | amd64 | `rwthika/tensorflow-cc:2.8.0` | +| 2.7.4 | amd64 | `rwthika/tensorflow-cc:2.7.4` | +| 2.7.3 | amd64 | `rwthika/tensorflow-cc:2.7.3` | +| 2.7.2 | amd64 | `rwthika/tensorflow-cc:2.7.2` | +| 2.7.1 | amd64 | `rwthika/tensorflow-cc:2.7.1` | +| 2.7.0 | amd64 | `rwthika/tensorflow-cc:2.7.0` | +| 2.6.1 | amd64 | `rwthika/tensorflow-cc:2.6.1` | +| 2.6.0 | amd64 | `rwthika/tensorflow-cc:2.6.0` | +| 2.5.1 | amd64 | `rwthika/tensorflow-cc:2.5.1` | +| 2.5.0 | amd64 | `rwthika/tensorflow-cc:2.5.0` | +| 2.4.3 | amd64 | `rwthika/tensorflow-cc:2.4.3` | +| 2.4.2 | amd64 | `rwthika/tensorflow-cc:2.4.2` | +| 2.4.1 | amd64 | `rwthika/tensorflow-cc:2.4.1` | +| 2.4.0 | amd64 | `rwthika/tensorflow-cc:2.4.0` | +| 2.3.4 | amd64 | `rwthika/tensorflow-cc:2.3.4` | +| 2.3.3 | amd64 | `rwthika/tensorflow-cc:2.3.3` | +| 2.3.2 | amd64 | `rwthika/tensorflow-cc:2.3.2` | +| 2.3.1 | amd64 | `rwthika/tensorflow-cc:2.3.1` | +| 2.3.0 | amd64 | `rwthika/tensorflow-cc:2.3.0` | +| 2.0.4 | amd64 | `rwthika/tensorflow-cc:2.0.4` | +| 2.0.3 | amd64 | `rwthika/tensorflow-cc:2.0.3` | +| 2.0.1 | amd64 | `rwthika/tensorflow-cc:2.0.1` | +| 2.0.0 | amd64 | `rwthika/tensorflow-cc:2.0.0` |
@@ -168,7 +168,7 @@ All images are based on the [official TensorFlow Docker images](https://hub.dock If you would like to build the deb-package and Docker images yourself, use the [`Makefile`](Makefile) as instructed below. -All `make` targets support the flags `TF_VERSION` (defaults to `2.9.2`) and `GPU` (defaults to `1`) in order to build a specific TensorFlow version in CPU/GPU mode. +All `make` targets support the flags `TF_VERSION` (defaults to `2.9.2`), `GPU` (defaults to `1`), and `ARCH` (defaults to host architecture) in order to build a specific TensorFlow version in CPU/GPU mode for a specific architecture. All `make` targets listed below also have a counterpart named `-all`, which can be used to build multiple TensorFlow versions one after the other using the `TF_VERSIONS` flag like so: From 524ff24359332ab6b45889de9e69975e59c66675 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Busch Date: Fri, 11 Nov 2022 12:42:38 +0100 Subject: [PATCH 6/8] add gpu arg to script 4 and 5 --- scripts/4-test-libtensorflow-cc.sh | 11 +++++++---- scripts/5-print-versions.sh | 14 ++++++++------ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/scripts/4-test-libtensorflow-cc.sh b/scripts/4-test-libtensorflow-cc.sh index 59f4f82..82e66d5 100755 --- a/scripts/4-test-libtensorflow-cc.sh +++ b/scripts/4-test-libtensorflow-cc.sh @@ -26,8 +26,11 @@ EXAMPLE_MOUNT="/example" CMD="./build-and-run.sh" echo "Testing libtensorflow_cc in ${IMAGE_CPP} ... " -if [ "$ARCH" = "amd64" ]; then - docker run --rm --gpus all -v ${EXAMPLE_DIR}:${EXAMPLE_MOUNT} -w ${EXAMPLE_MOUNT} ${IMAGE_CPP} ${CMD} | tee ${LOG_FILE} -elif [ "$ARCH" = "arm64" ]; then - docker run --rm --runtime nvidia -v ${EXAMPLE_DIR}:${EXAMPLE_MOUNT} -w ${EXAMPLE_MOUNT} ${IMAGE_CPP} ${CMD} | tee ${LOG_FILE} +if [[ "$GPU" == "1" && "$ARCH" = "amd64" ]]; then + GPU_ARG = "--gpus all" +elif [[ "$GPU" == "1" && "$ARCH" = "arm64" ]]; then + GPU_ARG="--runtime nvidia" +else + GPU_ARG="" fi +docker run --rm ${GPU_ARG} -v ${EXAMPLE_DIR}:${EXAMPLE_MOUNT} -w ${EXAMPLE_MOUNT} ${IMAGE_CPP} ${CMD} | tee ${LOG_FILE} diff --git a/scripts/5-print-versions.sh b/scripts/5-print-versions.sh index 133bafa..af61169 100755 --- a/scripts/5-print-versions.sh +++ b/scripts/5-print-versions.sh @@ -27,10 +27,12 @@ SCRIPT_MOUNT=/.versions.sh CMD="bash ${SCRIPT_MOUNT}" echo "Getting version information from ${IMAGE_DEVEL_ARCH} and ${IMAGE_CPP} ... " -if [ "$ARCH" = "amd64" ]; then - docker run --rm --gpus all -v ${SCRIPT_DEVEL}:${SCRIPT_MOUNT} ${IMAGE_DEVEL_ARCH} ${CMD} | tee ${LOG_FILE} - docker run --rm --gpus all -v ${SCRIPT_RUN}:${SCRIPT_MOUNT} ${IMAGE_CPP} ${CMD}| tee -a ${LOG_FILE} -elif [ "$ARCH" = "arm64" ]; then - docker run --rm --runtime nvidia -v ${SCRIPT_DEVEL}:${SCRIPT_MOUNT} ${IMAGE_DEVEL_ARCH} ${CMD} | tee ${LOG_FILE} - docker run --rm --runtime nvidia -v ${SCRIPT_RUN}:${SCRIPT_MOUNT} ${IMAGE_CPP} ${CMD}| tee -a ${LOG_FILE} +if [[ "$GPU" == "1" && "$ARCH" = "amd64" ]]; then + GPU_ARG = "--gpus all" +elif [[ "$GPU" == "1" && "$ARCH" = "arm64" ]]; then + GPU_ARG="--runtime nvidia" +else + GPU_ARG="" fi +docker run --rm ${GPU_ARG} -v ${SCRIPT_DEVEL}:${SCRIPT_MOUNT} ${IMAGE_DEVEL_ARCH} ${CMD} | tee ${LOG_FILE} +docker run --rm ${GPU_ARG} -v ${SCRIPT_RUN}:${SCRIPT_MOUNT} ${IMAGE_CPP} ${CMD}| tee -a ${LOG_FILE} From 7eda6136f7f26f8e9130cde1fb7d4c5d0f5b8c72 Mon Sep 17 00:00:00 2001 From: Lennart Reiher Date: Fri, 11 Nov 2022 17:09:41 +0100 Subject: [PATCH 7/8] fix file naming in export script --- scripts/3-export-libtensorflow-cc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/3-export-libtensorflow-cc.sh b/scripts/3-export-libtensorflow-cc.sh index 2846d18..45cc6b0 100755 --- a/scripts/3-export-libtensorflow-cc.sh +++ b/scripts/3-export-libtensorflow-cc.sh @@ -23,7 +23,7 @@ source $(dirname "$0")/.common.sh EXPORT_DIR=${REPOSITORY_DIR}/libtensorflow-cc CONTAINER_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb" -EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}-${ARCH}.deb" +EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}_${ARCH}.deb" STAGE="deb-package" echo "Building ${IMAGE_LIBTENSORFLOW_CC_ARCH} ... " From 8316e01325e2c096d00205bafae4542e250a4601 Mon Sep 17 00:00:00 2001 From: Lennart Reiher Date: Fri, 11 Nov 2022 17:14:49 +0100 Subject: [PATCH 8/8] add version information for arm-build --- README.md | 190 +++++++++++++++++++++++++++--------------------------- 1 file changed, 96 insertions(+), 94 deletions(-) diff --git a/README.md b/README.md index c850c3d..cf339d5 100644 --- a/README.md +++ b/README.md @@ -230,54 +230,55 @@ make 5-print-versions
Show Table -| Version | Step 1 (CPU) | Step 2 (CPU) | Step 4 (CPU) | Step 1 (GPU) | Step 2 (GPU) | Step 4 (GPU) | Notes | -| :---: | :---: | :---: | :---: | :---: | :---: | :---: | --- | -| 2.9.2 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.9.1 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.9.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.8.3 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.8.2 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.8.1 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.8.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.7.4 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.7.3 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.7.2 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.7.1 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.7.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | -| 2.6.5 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.6.5`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.6.4 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.6.4`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.6.3 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.6.3`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.6.2 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.6.2`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.6.1 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.6.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.5.3 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.5.3`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.5.2 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.5.2`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.5.1 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.5.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | -| 2.4.4 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.4.4`; unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | -| 2.4.3 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | -| 2.4.2 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | -| 2.4.1 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | -| 2.4.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | -| 2.3.4 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | -| 2.3.3 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | -| 2.3.2 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | -| 2.3.1 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | -| 2.3.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | -| 2.2.3 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | -| 2.2.2 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | -| 2.2.1 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | -| 2.2.0 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | -| 2.1.4 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | -| 2.1.3 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | -| 2.1.2 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | -| 2.1.1 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | -| 2.1.0 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | -| 2.0.4 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | -| 2.0.3 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | -| 2.0.2 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.0.2`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | -| 2.0.1 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | -| 2.0.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| Version | Architecture | Step 1 (CPU) | Step 2 (CPU) | Step 4 (CPU) | Step 1 (GPU) | Step 2 (GPU) | Step 4 (GPU) | Notes | +| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | --- | +| 2.9.2 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.9.2 | arm64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.9.1 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.9.0 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.8.3 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.8.2 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.8.1 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.8.0 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.7.4 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.7.3 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.7.2 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.7.1 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.7.0 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | +| 2.6.5 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.6.5`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.6.4 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.6.4`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.6.3 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.6.3`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.6.2 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.6.2`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.6.1 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.6.0 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.5.3 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.5.3`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.5.2 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.5.2`; unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.5.1 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.5.0 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.1.0.77-1+cuda11.2` | +| 2.4.4 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.4.4`; unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | +| 2.4.3 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | +| 2.4.2 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | +| 2.4.1 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | +| 2.4.0 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=8.0.4.30-1+cuda11.0` | +| 2.3.4 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | +| 2.3.3 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | +| 2.3.2 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | +| 2.3.1 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | +| 2.3.0 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | +| 2.2.3 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | +| 2.2.2 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | +| 2.2.1 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | +| 2.2.0 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.4.38-1+cuda10.1` | +| 2.1.4 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| 2.1.3 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| 2.1.2 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| 2.1.1 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| 2.1.0 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | no module named `numpy`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| 2.0.4 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| 2.0.3 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| 2.0.2 | amd64 | :white_check_mark: | :x: | - | :x: | - | - | missing image `tensorflow/tensorflow:2.0.2`; unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| 2.0.1 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` | +| 2.0.0 | amd64 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | - | - | unable to locate `libcudnn7=7.6.2.24-1+cuda10.0` |
@@ -289,52 +290,53 @@ make 5-print-versions | TensorFlow | Architecture | Ubuntu | GCC | Bazel | Python | protobuf | CUDA | cuDNN | TensorRT | GPU Compute Capability | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 2.9.2 | x86_64 | 20.04 | 9.4.0 | 5.3.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.9.1 | x86_64 | 20.04 | 9.4.0 | 5.3.0 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.9.0 | x86_64 | 20.04 | 9.4.0 | 5.3.0 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.8.3 | x86_64 | 20.04 | 9.4.0 | 4.2.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.8.2 | x86_64 | 20.04 | 9.4.0 | 4.2.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.8.1 | x86_64 | 20.04 | 9.4.0 | 4.2.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.8.0 | x86_64 | 20.04 | 9.4.0 | 4.2.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.7.4 | x86_64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.7.3 | x86_64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.7.2 | x86_64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.7.1 | x86_64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.7.0 | x86_64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | -| 2.6.5 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.6.4 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.6.3 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.6.2 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.6.1 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.6.0 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.5.3 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.5.2 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.5.1 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.5.0 | x86_64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.4.4 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.4.3 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.4.2 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.4.1 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.4.0 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.3.4 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.3.3 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.3.2 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.3.1 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.3.0 | x86_64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | -| 2.2.3 | x86_64 | 18.04 | 7.5.0 | 2.0.0 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.2.2 | x86_64 | 18.04 | 7.5.0 | 2.0.0 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.2.1 | x86_64 | 18.04 | 7.5.0 | 2.0.0 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.2.0 | x86_64 | 18.04 | 7.5.0 | 2.0.0 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.1.4 | x86_64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.1.3 | x86_64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.1.2 | x86_64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.1.1 | x86_64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.1.0 | x86_64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.0.4 | x86_64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.0.3 | x86_64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.0.2 | x86_64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.0.1 | x86_64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - | -| 2.0.0 | x86_64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.9.2 | amd64 | 20.04 | 9.4.0 | 5.3.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.7, 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.9.2 | arm64 | 20.04 | 9.4.0 | 5.3.2 | 3.8.10 | 3.9.2 | 11.4.239 | 8.4.1 | 8.4.1 | 8.7, 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.9.1 | amd64 | 20.04 | 9.4.0 | 5.3.0 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.9.0 | amd64 | 20.04 | 9.4.0 | 5.3.0 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.8.3 | amd64 | 20.04 | 9.4.0 | 4.2.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.8.2 | amd64 | 20.04 | 9.4.0 | 4.2.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.8.1 | amd64 | 20.04 | 9.4.0 | 4.2.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.8.0 | amd64 | 20.04 | 9.4.0 | 4.2.1 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 7.2.2 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.7.4 | amd64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.7.3 | amd64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.7.2 | amd64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.7.1 | amd64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.7.0 | amd64 | 20.04 | 9.4.0 | 3.7.2 | 3.8.10 | 3.9.2 | 11.2.152 | 8.1.0 | 8.0.0 | 8.6, 8.0, 7.5, 7.2, 7.0, 6.1, 6.0, 5.3 | +| 2.6.5 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.6.4 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.6.3 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.6.2 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.6.1 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.6.0 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.5.3 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.5.2 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.5.1 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.5.0 | amd64 | 18.04 | 7.5.0 | 3.7.2 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.4.4 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.4.3 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.4.2 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.4.1 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.4.0 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.3.4 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.3.3 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.3.2 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.3.1 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.3.0 | amd64 | 18.04 | 7.5.0 | 3.1.0 | 3.6.9 | 3.9.2 | - | - | - | - | +| 2.2.3 | amd64 | 18.04 | 7.5.0 | 2.0.0 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.2.2 | amd64 | 18.04 | 7.5.0 | 2.0.0 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.2.1 | amd64 | 18.04 | 7.5.0 | 2.0.0 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.2.0 | amd64 | 18.04 | 7.5.0 | 2.0.0 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.1.4 | amd64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.1.3 | amd64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.1.2 | amd64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.1.1 | amd64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.1.0 | amd64 | 18.04 | 7.5.0 | 0.29.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.0.4 | amd64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.0.3 | amd64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.0.2 | amd64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.0.1 | amd64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - | +| 2.0.0 | amd64 | 18.04 | 7.5.0 | 0.26.1 | 2.7.17 | 3.8.0 | - | - | - | - |