From 82c6768ab7134406800ac0a3eb1542cb95b30501 Mon Sep 17 00:00:00 2001
From: Moritz Maxeiner <mm@ucw.sh>
Date: Fri, 28 May 2021 15:20:45 +0200
Subject: [PATCH] Add support for CUDA 11

---
 .gitlab-ci.yml                  |  47 +++++++++++----
 jupyterhub/base/Dockerfile      |   3 +-
 jupyterhub/vim/Dockerfile       |   3 +-
 ubuntu/{ => cuda-10}/Dockerfile |   0
 ubuntu/cuda-11/Dockerfile       | 101 ++++++++++++++++++++++++++++++++
 5 files changed, 139 insertions(+), 15 deletions(-)
 rename ubuntu/{ => cuda-10}/Dockerfile (100%)
 create mode 100644 ubuntu/cuda-11/Dockerfile

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f9c46a2..e1600dd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,16 +2,27 @@ stages:
   - build
   - deploy
 
-build ubuntu:
+"build: [cuda-10]":
   stage: build
   tags: [linux, shell]
   script:
     - image_name="${CI_REGISTRY}/${CI_PROJECT_PATH,,}"
-    - podman build --cgroup-manager=cgroupfs --pull -t "${image_name}/ubuntu" ubuntu
-    - podman build --cgroup-manager=cgroupfs -t "${image_name}/jupyterhub" jupyterhub/base
-    - podman build --cgroup-manager=cgroupfs -t "${image_name}/jupyterhub_vim" jupyterhub/vim
+    - cuda_tag="cuda-10"
+    - podman build --cgroup-manager=cgroupfs --pull -t "${image_name}/ubuntu:${cuda_tag}" -f ubuntu/cuda-10/Dockerfile ubuntu
+    - podman build --cgroup-manager=cgroupfs --build-arg CUDA_TAG=${cuda_tag} -t "${image_name}/jupyterhub:${cuda_tag}" jupyterhub/base
+    - podman build --cgroup-manager=cgroupfs --build-arg CUDA_TAG=${cuda_tag} -t "${image_name}/jupyterhub_vim:${cuda_tag}" jupyterhub/vim
 
-deploy ubuntu:
+"build: [cuda-11]":
+  stage: build
+  tags: [linux, shell]
+  script:
+    - image_name="${CI_REGISTRY}/${CI_PROJECT_PATH,,}"
+    - cuda_tag="cuda-11"
+    - podman build --cgroup-manager=cgroupfs --pull -t "${image_name}/ubuntu:${cuda_tag}" -f ubuntu/cuda-11/Dockerfile ubuntu
+    - podman build --cgroup-manager=cgroupfs --build-arg CUDA_TAG=${cuda_tag} -t "${image_name}/jupyterhub:${cuda_tag}" jupyterhub/base
+    - podman build --cgroup-manager=cgroupfs --build-arg CUDA_TAG=${cuda_tag} -t "${image_name}/jupyterhub_vim:${cuda_tag}" jupyterhub/vim
+
+deploy:
   stage: deploy
   tags: [linux, shell]
   only:
@@ -22,13 +33,23 @@ deploy ubuntu:
     - image_name="${CI_REGISTRY}/${CI_PROJECT_PATH,,}"
     - podman push "${image_name}/ubuntu"
     - calver="$(date -u +'%Y%m%dT%H%MZ')"
-    - podman tag "${image_name}/jupyterhub" "${image_name}/jupyterhub:$calver"
-    - podman push "${image_name}/jupyterhub:$calver"
-    - podman image rm "${image_name}/jupyterhub:$calver"
-    - docker pull "${image_name}/jupyterhub:$calver"
-    - podman tag "${image_name}/jupyterhub_vim" "${image_name}/jupyterhub_vim:$calver"
-    - podman push "${image_name}/jupyterhub_vim:$calver"
-    - podman image rm "${image_name}/jupyterhub_vim:$calver"
-    - docker pull "${image_name}/jupyterhub_vim:$calver"
+    - cuda_tag="cuda-10"
+    - podman tag "${image_name}/jupyterhub:${cuda_tag}" "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman push "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman image rm "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - docker pull "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman tag "${image_name}/jupyterhub_vim:${cuda_tag}" "${image_name}/jupyterhub_vim:$calver_${cuda_tag}"
+    - podman push "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - podman image rm "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - docker pull "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - cuda_tag="cuda-11"
+    - podman tag "${image_name}/jupyterhub:${cuda_tag}" "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman push "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman image rm "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - docker pull "${image_name}/jupyterhub:$calver_${cuda_tag}"
+    - podman tag "${image_name}/jupyterhub_vim:${cuda_tag}" "${image_name}/jupyterhub_vim:$calver_${cuda_tag}"
+    - podman push "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - podman image rm "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
+    - docker pull "${image_name}/jupyterhub_vim:${calver}_${cuda_tag}"
   after_script:
     - podman logout "${CI_REGISTRY}"
diff --git a/jupyterhub/base/Dockerfile b/jupyterhub/base/Dockerfile
index d298e15..ca8a0c0 100755
--- a/jupyterhub/base/Dockerfile
+++ b/jupyterhub/base/Dockerfile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: Apache-2.0
-FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker/ubuntu
+ARG CUDA_TAG
+FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker/ubuntu:${CUDA_TAG}
 
 LABEL maintainer="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
 LABEL authors="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
diff --git a/jupyterhub/vim/Dockerfile b/jupyterhub/vim/Dockerfile
index 7db4243..daca3bc 100755
--- a/jupyterhub/vim/Dockerfile
+++ b/jupyterhub/vim/Dockerfile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: Apache-2.0
-FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker/jupyterhub
+ARG CUDA_TAG
+FROM git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker/jupyterhub:${CUDA_TAG}
 
 LABEL maintainer="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
 LABEL authors="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
diff --git a/ubuntu/Dockerfile b/ubuntu/cuda-10/Dockerfile
similarity index 100%
rename from ubuntu/Dockerfile
rename to ubuntu/cuda-10/Dockerfile
diff --git a/ubuntu/cuda-11/Dockerfile b/ubuntu/cuda-11/Dockerfile
new file mode 100644
index 0000000..31e4bf5
--- /dev/null
+++ b/ubuntu/cuda-11/Dockerfile
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: Apache-2.0
+
+ARG UBUNTU_VERSION=18.04
+ARG CUDA_VERSION=11.3.0
+FROM nvidia/cudagl:${CUDA_VERSION}-base-ubuntu${UBUNTU_VERSION}
+ENV CUDA ${CUDA_VERSION}
+
+LABEL maintainer="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
+LABEL authors="Moritz Maxeiner <moritz.maxeiner@fu-berlin.de>"
+
+ARG TZ=Europe/Berlin
+ARG DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update && \
+    apt-get install -y --no-install-recommends apt-utils >/dev/null 2>&1 && \
+    apt-get install -y --no-install-recommends software-properties-common && \
+    apt-get update && \
+    apt-get install -y locales && \
+    locale-gen en_US.UTF-8 && \
+    echo $TZ > /etc/timezone && \
+    apt-get install -y tzdata && \
+    rm /etc/localtime && \
+    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
+    dpkg-reconfigure -f noninteractive tzdata && \
+    apt-get install -y --no-install-recommends \
+        build-essential \
+        pkg-config \
+        git \
+        file \
+        nano \
+        zip \
+        unzip \
+        curl \
+        wget \
+        rsync \
+        && \
+    apt-get install -y \
+        python3-dev \
+        python3-pip \
+        python3-venv \
+        python3-setuptools \
+        python3-distutils \
+        && \
+    apt-get clean
+
+ARG CUDNN_VERSION=8.2.0.53-1
+ENV CUDNN ${CUDNN_VERSION}
+
+ARG CUDNN_MAJOR_VERSION=8
+ENV CUDNN_MAJOR_VERSION ${CUDNN_MAJOR_VERSION}
+
+ARG LIBNVINFER_VERSION=8.0.0-1
+ARG LIBNVINFER_MAJOR_VERSION=8
+
+ENV CUDA_TOOLKIT_PATH /usr/local/cuda
+
+RUN /bin/bash -c "apt-get update && \
+    CUDA_VERSION=\${CUDA%.*} && \
+    apt-get install -y --no-install-recommends \
+        cuda-command-line-tools-\${CUDA_VERSION//./-} \
+        libcublas-dev-\${CUDA_VERSION//./-} \
+        cuda-nvrtc-dev-\${CUDA_VERSION//./-} \
+        cuda-cudart-dev-\${CUDA_VERSION//./-} \
+        libcufft-dev-\${CUDA_VERSION//./-} \
+        libcurand-dev-\${CUDA_VERSION//./-} \
+        libcusolver-dev-\${CUDA_VERSION//./-} \
+        libcusparse-dev-\${CUDA_VERSION//./-} \
+        libcudnn\${CUDNN_MAJOR_VERSION}-dev=\${CUDNN}+cuda\${CUDA_VERSION} \
+        && \
+    find /usr/local/cuda-\${CUDA_VERSION}/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \
+    rm /usr/lib/x86_64-linux-gnu/libcudnn_static_v\${CUDNN_MAJOR_VERSION}.a && \
+    apt-get install -y --no-install-recommends \
+        libnvinfer\${LIBNVINFER_MAJOR_VERSION}=\${LIBNVINFER_VERSION}+cuda\${CUDA_VERSION} \
+        libnvinfer-dev=\${LIBNVINFER_VERSION}+cuda\${CUDA_VERSION} \
+        libnvinfer-plugin-dev=\${LIBNVINFER_VERSION}+cuda\${CUDA_VERSION} \
+        libnvinfer-plugin\${LIBNVINFER_MAJOR_VERSION}=\${LIBNVINFER_VERSION}+cuda\${CUDA_VERSION}"
+
+RUN apt-get update && \
+    apt-get install -y \
+        libglu1-mesa \
+        libjpeg62 \
+        liborc-0.4 \
+        ffmpeg \
+        && \
+    apt-get clean
+
+COPY pip.conf /etc/
+
+ENV PYTHON_VERSION=3.8
+ENV PYTHON_PIP_VERSION=20.2.3
+ENV PYTHON_SETUPTOOLS_VERSION=50.3.0
+
+RUN apt-get install -y \
+        python${PYTHON_VERSION} \
+        python${PYTHON_VERSION}-dev \
+        python${PYTHON_VERSION}-venv \
+        && \
+    apt-get clean && \
+    python${PYTHON_VERSION} -m pip install --upgrade \
+        pip==${PYTHON_PIP_VERSION} \
+        setuptools==${PYTHON_SETUPTOOLS_VERSION}
-- 
GitLab