diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 06c13a329..6184075d9 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,7 +1,8 @@ -FROM nvidia/cuda:11.4.0-devel-ubuntu20.04 +FROM nvidia/cuda:11.4.0-cudnn8-devel-ubuntu20.04 RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-11-jdk wget build-essential checkinstall zlib1g-dev libssl-dev + DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-11-jdk wget build-essential checkinstall zlib1g-dev libssl-dev git RUN wget https://github.com/Kitware/CMake/releases/download/v3.24.2/cmake-3.24.2.tar.gz && \ tar -xvf cmake-3.24.2.tar.gz && cd cmake-3.24.2 && \ ./bootstrap && make && make install + diff --git a/build_requirements.md b/build_requirements.md new file mode 100644 index 000000000..50d83268a --- /dev/null +++ b/build_requirements.md @@ -0,0 +1,129 @@ +# BRUTEX CAVIS Build Requirements # + +You can build CAVIS on either x86_64 linux or x86_64 windows +(sometimes referred to as amd64). Support for native GPU (CUDA) or CPU (AVX2/ AVX512) support can be enabled. + +Linux on x86_64 is the primary target platform. +CAVIS is written in Java, C, C++ and Kotlin, therefore you will need a Java JDK and +C/C++ compiler. + +# Table of contents +1. [Introduction](#introduction) + 2. +2. [Some paragraph](#paragraph1) + 1. [Sub paragraph](#subparagraph1) +3. [Another paragraph](#paragraph2) + +## Build Environment Prerequisites +CAVIS uses the [Gradle Build Tool](https://gradle.org) and [CMake](https://cmake.org/) to execute the build. +A Gradle Wrapper is provided, that will pull the right version of gradle. + +### Linux x86_64 Prerequisites + +Linux Kernel 5.10 or higher + +**Required build tools:** + +| Tools | Version | Remarks | +|----------|------------|--------------------------------------------------| +| Gradle | \> 7.2 | | +| CMake | \> 2.24.10 | | +| GNU Make | 3.82 | | + +| Compiler | Version | Remarks | +| -------- |----------------|---------------------------------------------------| +| GCC | 7.3.1 - 10.2.1 | C and C++ compiler | +| nvcc | \> 11.4 | only in case you want to compile for CUDA support | +| javac | JDK 11 | openjdk-11 | + +#### Amazon Linux 2 #### +Preparation shell script + +```shell +sudo amazon-linux-extras install java-openjdk11 && \ + sudo yum install --assumeyes git make gcc gcc-c++ openssl-devel java-11-openjdk-devel && \ + wget https://github.com/Kitware/CMake/releases/download/v3.24.2/cmake-3.24.2.tar.gz && \ + tar -xf cmake-3.24.2.tar.gz && cd cmake-3.24.2/ && \ + ./bootstrap && make && sudo make install && cd .. +``` + +In case you have less than 8GB RAM, a swap file should be created +```shell +sudo dd if=/dev/zero of=/swapfile count=8k bs=1M && sudo chmod 600 /swapfile && \ +sudo mkswap /swapfile && sudo swapon /swapfile +``` + +You can make the swap change permanent (surviving a reboot) by putting it into /etc/fstab file. +```shell +echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab +``` + +In order to resolve Brutex Network IP6 endpoints, you need to add an additional nameserver +```shell + echo 'nameserver 8.8.8.8' | sudo tee -a /etc/resolv.conf +``` +## Some paragraph +The first paragraph text + +### Sub paragraph +This is a sub paragraph, formatted in heading 3 style + +## Troubleshooting +### Gradle process just crashes ### +This is likely an out-of-memory problem, check +```shell +dmesg +``` +for +``` +oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=java,pid=16477,uid=1000 +[ 6291.694315] Out of memory: Killed process 16477 (java) total-vm:11373580kB, anon-rss:1373168kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:11220kB oom_score_adj:0 +``` +and increase i.e. swapfile size (by adding another one). + + + +sudo apt-get -q update +ret=$? +while [ $ret -ne 0 ]; +do +echo Waiting for instance to be ready ... +sleep 20s +sudo apt-get -q update +ret=$? +done + +echo Instance is ready. + +#Create swap +echo Adding swap file +sudo fallocate -l 16G /swapfile +sudo chmod 600 /swapfile +sudo mkswap /swapfile +sudo swapon /swapfile +echo Swap created. + +#echo "deb http://deb.debian.org/debian/ buster main" | sudo tee /etc/apt/sources.list +#echo "deb http://deb.debian.org/debian/ buster main contrib non-free" | sudo tee -a /etc/apt/sources.list + + +sudo apt-get -q --yes install build-essential default-jdk git ninja-build gnupg software-properties-common snapd make g++-multilib g++ g++-8 gcc gcc-8 libopenblas-base libopenblas-dev +ret=$? +while [ $ret -ne 0 ]; +do +echo Waiting for instance to be ready ... +sleep 20s +sudo apt-get -q --yes install build-essential default-jdk git ninja-build gnupg software-properties-common snapd make g++-multilib g++ g++-8 gcc gcc-8 libopenblas-base libopenblas-dev +ret=$? +done +#sudo snap install core +#sudo snap install cmake --classic + +wget https://github.com/Kitware/CMake/releases/download/v3.20.4/cmake-3.20.4-linux-x86_64.sh +chmod a+x cmake-3.20.4-linux-x86_64.sh +sudo sh cmake-3.20.4-linux-x86_64.sh --skip-license + +echo "supersede domain-name-servers 172.31.0.2, 8.8.8.8" | sudo tee -a /etc/dhcp/dhclient.conf +echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf + + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 5af1ca6f2..ef0384eee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -31,7 +31,10 @@ systemProp.org.gradle.internal.publish.checksums.insecure=true # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx8192m + +#for whatever reason we had to add MaxMetaspace and file encoding = utf8, gradle crashed otherwise +org.gradle.jvmargs=-Xmx8192m -XX:MaxMetaspaceSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:ErrorFile=/var/log/java/hs_err_pid%p.log + # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit diff --git a/jenkinsfile b/jenkinsfile index 7cbda7c26..238e31800 100644 --- a/jenkinsfile +++ b/jenkinsfile @@ -1,44 +1,85 @@ pipeline { - - agent { - - dockerfile { - filename 'Dockerfile' - dir '.docker' - label 'linuxdocker' - //additionalBuildArgs '--build-arg version=1.0.2' - args '--gpus all' - } - } + agent none stages { - stage('prep-build-environment') { + stage('prep-build-environment-linux') { + agent { + label 'linux' + } steps { - //git poll: false, url: 'http://bru3-pc.fritz.box:3000/Brutex/ci-deeplearning4j.git' - sh 'nvidia-smi' - sh 'nvcc --version' + checkout scm + //sh 'nvidia-smi' + //sh 'nvcc --version' sh 'gcc --version' sh 'cmake --version' - checkout scm + sh 'sh ./gradlew --version' } } + stage('prep-build-environment-linux-cuda') { + agent { + dockerfile { + filename 'Dockerfile' + dir '.docker' + label 'linuxdocker' + //additionalBuildArgs '--build-arg version=1.0.2' + args '--gpus all' + } + } + steps { + checkout scm + sh 'nvidia-smi' + sh 'nvcc --version' + sh 'gcc --version' + sh 'cmake --version' + sh 'sh ./gradlew --version' + } + } stage('build') { environment { - MAVEN = credentials('Internal Archiva') - OSSRH = credentials('OSSRH') - + MAVEN = credentials('Internal Archiva') + OSSRH = credentials('OSSRH') } - steps { - - sh 'chmod u+x ./gradlew && ls -la' - sh './gradlew --version' - withGradle { - sh './gradlew build --stacktrace --no-watch-fs -x test -PCAVIS_CHIP=cuda -Pmavenuser=$MAVEN_USR -Pmavenpass=$MAVEN_PSW -PossrhUsername=$OSSRH_USR -PossrhPassword=$OSSRH_PSW' + parallel { + stage('build-linux-cuda') { + agent { + dockerfile { + filename 'Dockerfile' + dir '.docker' + label 'linuxdocker' + //additionalBuildArgs '--build-arg version=1.0.2' + args '--gpus all' + } } - + steps { + withGradle { + sh 'sh ./gradlew publish --stacktrace -x test -PCAVIS_CHIP=cuda -Pmavenuser=$MAVEN_USR -Pmavenpass=$MAVEN_PSW -PossrhUsername=$OSSRH_USR -PossrhPassword=$OSSRH_PSW' + } + //stash includes: '/cavis-native/cavis-native-lib/build/lib/*.jar', name: 'cuda-build' + } + } + stage('build-linux-cpu') { + agent { + label 'linux' + } + steps { + withGradle { + sh 'sh ./gradlew publish --stacktrace -x test -PCAVIS_CHIP=cpu -Pmavenuser=$MAVEN_USR -Pmavenpass=$MAVEN_PSW -PossrhUsername=$OSSRH_USR -PossrhPassword=$OSSRH_PSW' + } + //stash includes: '/cavis-native/cavis-native-lib/build/lib/*.jar', name: 'cpu-build' + } + } } } - + /* stage('collect-release') { + agent { + label 'linux' + } + steps { + //unstash 'cuda-build' + //unstash 'cpu-build' + } + } + */ } }