Skip to content

Commit 54ca7d6

Browse files
authored
Merge pull request #2 from ika-rwth-aachen/feature/arm64
Support arm64
2 parents f2d57c2 + 8316e01 commit 54ca7d6

File tree

11 files changed

+221
-183
lines changed

11 files changed

+221
-183
lines changed

Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ DEFAULT_TF_VERSION := 2.9.2
2828
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
2929
DEFAULT_JOBS := $(shell nproc)
3030
DEFAULT_GPU := 1
31+
DEFAULT_ARCH := $(shell dpkg --print-architecture)
3132

3233
# arguments
3334
TF_VERSION := $(if $(TF_VERSION),$(TF_VERSION),$(DEFAULT_TF_VERSION))
3435
JOBS := $(if $(JOBS),$(JOBS),$(DEFAULT_JOBS))
3536
GPU := $(if $(GPU),$(GPU),$(DEFAULT_GPU))
37+
ARCH := $(if $(ARCH),$(ARCH),$(DEFAULT_ARCH))
3638

3739
# variables
3840
ifeq ($(GPU), 1)
@@ -42,7 +44,7 @@ else
4244
endif
4345
OFFICIAL_DEVEL_IMAGE := tensorflow/tensorflow:$(TF_VERSION)-devel$(GPU_POSTFIX)
4446
OFFICIAL_DEVEL_IMAGES := tensorflow/tensorflow:*-devel$(GPU_POSTFIX)
45-
CPP_IMAGE := rwthika/tensorflow-cc:$(TF_VERSION)$(GPU_POSTFIX)
47+
CPP_IMAGE := rwthika/tensorflow-cc:$(TF_VERSION)$(GPU_POSTFIX)-$(ARCH)
4648
CPP_IMAGES := rwthika/tensorflow-cc:*
4749
LIBTENSORFLOW_CC_IMAGE := rwthika/tensorflow-cc:$(TF_VERSION)-libtensorflow_cc*
4850
LIBTENSORFLOW_CC_IMAGES := rwthika/tensorflow-cc:*-libtensorflow_cc*

README.md

Lines changed: 157 additions & 155 deletions
Large diffs are not rendered by default.

docker/DEBIAN/control

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Package: libtensorflow-cc
22
Version: TF_VERSION
3-
Architecture: amd64
3+
Architecture: TARGETARCH
44
Maintainer: Lennart Reiher <lennart.reiher@rwth-aachen.de>
55
Description: TensorFlow C++ Library

docker/Dockerfile

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
# --- build stage for building libtensorflow_cc --------------------------------
2222
ARG TF_VERSION=master
2323
ARG GPU_POSTFIX=-gpu
24-
FROM tensorflow/tensorflow:${TF_VERSION}-devel${GPU_POSTFIX} AS build
24+
ARG TARGETARCH
25+
FROM tensorflow/tensorflow:${TF_VERSION}-devel${GPU_POSTFIX}-${TARGETARCH} as build
2526

27+
ARG TARGETARCH
2628
ARG TF_VERSION
2729
ARG GPU_POSTFIX
2830
ARG JOBS="auto"
@@ -35,7 +37,7 @@ WORKDIR /tensorflow
3537
ENV PYTHON_BIN_PATH=/usr/bin/python3
3638
ENV PYTHON_LIB_PATH=/usr/lib/python3/dist-packages
3739
ENV TF_NEED_ROCM=0
38-
ENV TF_CUDA_COMPUTE_CAPABILITIES=5.3,6.0,6.1,7.0,7.2,7.5,8.0,8.6
40+
ENV TF_CUDA_COMPUTE_CAPABILITIES=5.3,6.0,6.1,7.0,7.2,7.5,8.0,8.6,8.7
3941
ENV TF_CUDA_CLANG=0
4042
ENV GCC_HOST_COMPILER_PATH=/usr/bin/gcc
4143
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 && \
7274
# --- deb-package stage providing libtensorflow-cc.deb -------------------------
7375
FROM ubuntu:focal as deb-package
7476

77+
ARG TARGETARCH
7578
ARG TF_VERSION
7679
ARG GPU_POSTFIX
7780

@@ -88,19 +91,27 @@ COPY --from=build /usr/local/lib usr/local/lib/protob
8891
RUN cp -d usr/local/lib/tensorflow/lib* usr/local/lib/protobuf/lib* usr/local/lib/ && \
8992
rm -rf usr/local/lib/tensorflow usr/local/lib/protobuf
9093
RUN sed -i "s/TF_VERSION/$TF_VERSION/" DEBIAN/control
94+
RUN sed -i "s/TARGETARCH/$TARGETARCH/" DEBIAN/control
9195

9296
# build .deb
9397
WORKDIR /
9498
RUN dpkg-deb --build --root-owner-group libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX} && \
9599
rm -rf libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}/
96100

97101
# --- final stage with TensorFlow Python and C++ Library -----------------------
98-
FROM tensorflow/tensorflow:${TF_VERSION}${GPU_POSTFIX} as final
102+
FROM --platform=amd64 tensorflow/tensorflow:${TF_VERSION}${GPU_POSTFIX} as final-amd64
103+
ARG TARGETARCH
104+
105+
FROM --platform=arm64 nvcr.io/nvidia/l4t-tensorflow:r35.1.0-tf2.9-py3 as final-arm64
106+
ARG TARGETARCH
107+
108+
FROM "final-${TARGETARCH}" as final
99109

100110
ARG TF_VERSION
101111
ARG GPU_POSTFIX
102112

103113
# install TensorFlow C++ API incl. protobuf
104114
COPY --from=deb-package /libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb /tmp
105115
RUN dpkg -i /tmp/libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb && \
106-
ldconfig
116+
ldconfig && \
117+
rm /tmp/libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb

scripts/.common.sh

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@ set -o pipefail
2424
DEFAULT_TF_VERSION="2.9.2"
2525
DEFAULT_JOBS=$(nproc)
2626
DEFAULT_GPU=1
27+
DEFAULT_ARCH=$(dpkg --print-architecture)
2728

2829
TF_VERSION=${TF_VERSION:-${DEFAULT_TF_VERSION}}
2930
JOBS=${JOBS:-${DEFAULT_JOBS}}
3031
GPU=${GPU:-${DEFAULT_GPU}}
3132
[[ $GPU == "1" ]] && GPU_POSTFIX="-gpu" || GPU_POSTFIX=""
33+
ARCH=${ARCH:-${DEFAULT_ARCH}}
3234

3335
SCRIPT_NAME=$(basename "$0")
3436
SCRIPT_DIR=$(realpath $(dirname "$0"))
@@ -41,6 +43,7 @@ mkdir -p ${LOG_DIR}
4143
DOWNLOAD_DOCKERFILES_DIR=${DOCKER_DIR}/.Dockerfiles
4244
DOWNLOAD_DOCKERFILE_DIR=${DOWNLOAD_DOCKERFILES_DIR}/${TF_VERSION}
4345

44-
IMAGE_DEVEL="tensorflow/tensorflow:${TF_VERSION}-devel${GPU_POSTFIX}"
46+
IMAGE_DEVEL_ARCH="tensorflow/tensorflow:${TF_VERSION}-devel${GPU_POSTFIX}-${ARCH}"
4547
IMAGE_CPP="rwthika/tensorflow-cc:${TF_VERSION}${GPU_POSTFIX}"
46-
IMAGE_LIBTENSORFLOW_CC="rwthika/tensorflow-cc:${TF_VERSION}-libtensorflow_cc${GPU_POSTFIX}"
48+
IMAGE_CPP_ARCH="${IMAGE_CPP}-${ARCH}"
49+
IMAGE_LIBTENSORFLOW_CC_ARCH="rwthika/tensorflow-cc:${TF_VERSION}-libtensorflow_cc${GPU_POSTFIX}-${ARCH}"

scripts/.versions.run.sh

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
# SOFTWARE.
2020
# ==============================================================================
2121

22-
PYTHON_VERSION=$(python --version 2>&1 | awk '{print $2}')
22+
PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}')
2323

2424
if [[ $(command -v python) ]]; then
25-
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)
25+
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)
2626
fi
2727

2828
if [[ -f /usr/local/include/tensorflow/tensorflow/core/public/version.h ]]; then
@@ -47,10 +47,10 @@ if [[ -f /usr/include/cudnn_version.h ]]; then
4747
CUDNN_VERSION=$CUDNN_MAJOR.$CUDNN_MINOR.$CUDNN_PATCH
4848
fi
4949

50-
if [[ -f /usr/include/x86_64-linux-gnu/NvInferVersion.h ]]; then
51-
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/ //")
52-
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/ //")
53-
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/ //")
50+
if [[ -f /usr/include/$(uname -m)-linux-gnu/NvInferVersion.h ]]; then
51+
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/ //")
52+
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/ //")
53+
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/ //")
5454
TENSORRT_VERSION=$TENSORRT_MAJOR.$TENSORRT_MINOR.$TENSORRT_PATCH
5555
fi
5656

scripts/1-build-official-devel-image.sh

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,13 @@
2222
source $(dirname "$0")/.common.sh
2323

2424
CPU_GPU_POSTFIX=${GPU_POSTFIX:--cpu}
25-
DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/devel${CPU_GPU_POSTFIX}.Dockerfile
25+
if [ "$ARCH" = "amd64" ]; then
26+
DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/devel${CPU_GPU_POSTFIX}.Dockerfile
27+
elif [ "$ARCH" = "arm64" ]; then
28+
DOCKERFILE=${DOWNLOAD_DOCKERFILE_DIR}/dockerfiles/arm64v8/devel-cpu-arm64v8.Dockerfile
29+
sed -i "s/ubuntu:\${UBUNTU_VERSION}/nvcr.io\/nvidia\/l4t-tensorflow:r35.1.0-tf2.9-py3/" $DOCKERFILE
30+
fi
2631
BUILD_DIR=${DOWNLOAD_DOCKERFILE_DIR}
2732

28-
echo "Building ${IMAGE_DEVEL} ... "
29-
docker build -t ${IMAGE_DEVEL} -f ${DOCKERFILE} ${BUILD_DIR} | tee ${LOG_FILE}
33+
echo "Building ${IMAGE_DEVEL_ARCH} ... "
34+
docker build -t ${IMAGE_DEVEL_ARCH} -f ${DOCKERFILE} ${BUILD_DIR} | tee ${LOG_FILE}

scripts/2-build-cpp-image.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@
2222
source $(dirname "$0")/.common.sh
2323

2424
echo "Building ${IMAGE_CPP} ... "
25-
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}
25+
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}
26+
docker tag ${IMAGE_CPP_ARCH} ${IMAGE_CPP}

scripts/3-export-libtensorflow-cc.sh

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222
source $(dirname "$0")/.common.sh
2323

2424
EXPORT_DIR=${REPOSITORY_DIR}/libtensorflow-cc
25-
CONTAINER_FILE="libtensorflow-cc_${TF_VERSION}.deb"
26-
EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb"
25+
CONTAINER_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}.deb"
26+
EXPORT_FILE="libtensorflow-cc_${TF_VERSION}${GPU_POSTFIX}_${ARCH}.deb"
2727
STAGE="deb-package"
2828

29-
echo "Building ${IMAGE_LIBTENSORFLOW_CC} ... "
30-
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}
29+
echo "Building ${IMAGE_LIBTENSORFLOW_CC_ARCH} ... "
30+
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}
3131

3232
echo "Exporting to $(realpath ${EXPORT_DIR})/${EXPORT_FILE} ... "
33-
TMP_CONTAINER=$(docker create ${IMAGE_LIBTENSORFLOW_CC})
34-
docker cp ${TMP_CONTAINER}:/${EXPORT_FILE} ${EXPORT_DIR}/
33+
TMP_CONTAINER=$(docker create ${IMAGE_LIBTENSORFLOW_CC_ARCH})
34+
docker cp ${TMP_CONTAINER}:/${CONTAINER_FILE} ${EXPORT_DIR}/${EXPORT_FILE}
3535
docker rm -v ${TMP_CONTAINER}

scripts/4-test-libtensorflow-cc.sh

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,11 @@ EXAMPLE_MOUNT="/example"
2626
CMD="./build-and-run.sh"
2727

2828
echo "Testing libtensorflow_cc in ${IMAGE_CPP} ... "
29-
docker run --rm --gpus all -v ${EXAMPLE_DIR}:${EXAMPLE_MOUNT} -w ${EXAMPLE_MOUNT} ${IMAGE_CPP} ${CMD} | tee ${LOG_FILE}
29+
if [[ "$GPU" == "1" && "$ARCH" = "amd64" ]]; then
30+
GPU_ARG = "--gpus all"
31+
elif [[ "$GPU" == "1" && "$ARCH" = "arm64" ]]; then
32+
GPU_ARG="--runtime nvidia"
33+
else
34+
GPU_ARG=""
35+
fi
36+
docker run --rm ${GPU_ARG} -v ${EXAMPLE_DIR}:${EXAMPLE_MOUNT} -w ${EXAMPLE_MOUNT} ${IMAGE_CPP} ${CMD} | tee ${LOG_FILE}

0 commit comments

Comments
 (0)